Full Code of speced/bikeshed for AI

main 667c6c540d2b cached
4294 files
194.1 MB
26.6M tokens
1397 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (106,674K chars total). Download the full file to get everything.
Repository: speced/bikeshed
Branch: main
Commit: 667c6c540d2b
Files: 4294
Total size: 194.1 MB

Directory structure:
gitextract_fx1j65pu/

├── .gitattributes
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-docs.yml
│       ├── ci.yml
│       ├── playwright.yml
│       ├── pylint-problem-matcher.json
│       ├── update-tests/
│       │   ├── README.md
│       │   ├── requirements.txt
│       │   ├── specs.data
│       │   └── update.py
│       └── update-tests.yml
├── .gitignore
├── .vscode/
│   └── settings.json
├── Bikeshed.tmLanguage
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── README.md
├── bikeshed/
│   ├── InputSource.py
│   ├── Spec.py
│   ├── __init__.py
│   ├── __main__.py
│   ├── biblio.py
│   ├── boilerplate/
│   │   └── README.md
│   ├── boilerplate.py
│   ├── caniuse/
│   │   ├── __init__.py
│   │   ├── caniuse-panel.css
│   │   └── caniuse.py
│   ├── cddl.py
│   ├── cli.py
│   ├── conditional.py
│   ├── config/
│   │   ├── BoolSet.py
│   │   ├── __init__.py
│   │   ├── dfnTypes.py
│   │   └── main.py
│   ├── constants.py
│   ├── datablocks.py
│   ├── dfnpanels/
│   │   ├── __init__.py
│   │   ├── dfn-panel.css
│   │   ├── dfn-panel.js
│   │   └── dfnpanels.py
│   ├── dfns/
│   │   ├── __init__.py
│   │   └── attributeInfo.py
│   ├── doctypes/
│   │   ├── __init__.py
│   │   ├── manager.py
│   │   └── utils.py
│   ├── extensions.py
│   ├── fingerprinting.py
│   ├── fonts/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── bigblocks.bsfont
│   │   ├── fonts.py
│   │   ├── rewrite.py
│   │   └── smallblocks.bsfont
│   ├── func.py
│   ├── h/
│   │   ├── __init__.py
│   │   ├── dom.py
│   │   ├── merge.py
│   │   ├── parser/
│   │   │   ├── __init__.py
│   │   │   ├── main.py
│   │   │   ├── nodes.py
│   │   │   ├── parser.py
│   │   │   ├── preds.py
│   │   │   ├── result.py
│   │   │   ├── simpleparser.py
│   │   │   └── stream.py
│   │   └── serializer.py
│   ├── headings.py
│   ├── highlight/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── highlight.py
│   │   ├── line-highlighting.css
│   │   ├── line-numbers.css
│   │   └── syntax-highlighting.css
│   ├── idl.py
│   ├── includes.py
│   ├── inlineTags/
│   │   └── __init__.py
│   ├── issuelist.py
│   ├── language.py
│   ├── lexers.py
│   ├── line.py
│   ├── lint/
│   │   ├── __init__.py
│   │   ├── accidental2119.py
│   │   ├── brokenLinks.py
│   │   ├── exampleIDs.py
│   │   ├── missingExposed.py
│   │   ├── requiredIDs.py
│   │   └── unusedInternalDfns.py
│   ├── markdown/
│   │   ├── __init__.py
│   │   ├── inlines.py
│   │   └── markdown.py
│   ├── mdn/
│   │   ├── __init__.py
│   │   ├── mdn-anno.css
│   │   └── mdnspeclinks.py
│   ├── messages.py
│   ├── metadata.py
│   ├── outline.py
│   ├── printjson.py
│   ├── publish.py
│   ├── py.typed
│   ├── pyg.py
│   ├── railroaddiagrams.py
│   ├── railroadparser.py
│   ├── refs/
│   │   ├── __init__.py
│   │   ├── external.py
│   │   ├── headingdata.py
│   │   ├── manager.py
│   │   ├── ref-hints.css
│   │   ├── ref-hints.js
│   │   ├── source.py
│   │   ├── utils.py
│   │   └── wrapper.py
│   ├── repository.py
│   ├── result/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── retrieve.py
│   ├── semver-dev.txt
│   ├── semver.txt
│   ├── shorthands/
│   │   ├── __init__.py
│   │   └── oldShorthands.py
│   ├── spec-data/
│   │   └── readonly/
│   │       ├── anchors/
│   │       │   ├── anchors-1_.data
│   │       │   ├── anchors-1d.data
│   │       │   ├── anchors-1s.data
│   │       │   ├── anchors-1u.data
│   │       │   ├── anchors-24.data
│   │       │   ├── anchors-2d.data
│   │       │   ├── anchors-2g.data
│   │       │   ├── anchors-2n.data
│   │       │   ├── anchors-2u.data
│   │       │   ├── anchors-2x.data
│   │       │   ├── anchors-34.data
│   │       │   ├── anchors-3d.data
│   │       │   ├── anchors-3f.data
│   │       │   ├── anchors-3g.data
│   │       │   ├── anchors-3r.data
│   │       │   ├── anchors-4c.data
│   │       │   ├── anchors-4g.data
│   │       │   ├── anchors-4t.data
│   │       │   ├── anchors-4x.data
│   │       │   ├── anchors-54.data
│   │       │   ├── anchors-55.data
│   │       │   ├── anchors-64.data
│   │       │   ├── anchors-6d.data
│   │       │   ├── anchors-__.data
│   │       │   ├── anchors-a1.data
│   │       │   ├── anchors-a3.data
│   │       │   ├── anchors-a4.data
│   │       │   ├── anchors-a5.data
│   │       │   ├── anchors-a9.data
│   │       │   ├── anchors-a_.data
│   │       │   ├── anchors-aa.data
│   │       │   ├── anchors-ab.data
│   │       │   ├── anchors-ac.data
│   │       │   ├── anchors-ad.data
│   │       │   ├── anchors-ae.data
│   │       │   ├── anchors-af.data
│   │       │   ├── anchors-ag.data
│   │       │   ├── anchors-ak.data
│   │       │   ├── anchors-al.data
│   │       │   ├── anchors-am.data
│   │       │   ├── anchors-an.data
│   │       │   ├── anchors-ap.data
│   │       │   ├── anchors-aq.data
│   │       │   ├── anchors-ar.data
│   │       │   ├── anchors-as.data
│   │       │   ├── anchors-at.data
│   │       │   ├── anchors-au.data
│   │       │   ├── anchors-av.data
│   │       │   ├── anchors-aw.data
│   │       │   ├── anchors-ax.data
│   │       │   ├── anchors-ay.data
│   │       │   ├── anchors-az.data
│   │       │   ├── anchors-b4.data
│   │       │   ├── anchors-b5.data
│   │       │   ├── anchors-b_.data
│   │       │   ├── anchors-ba.data
│   │       │   ├── anchors-bc.data
│   │       │   ├── anchors-bd.data
│   │       │   ├── anchors-be.data
│   │       │   ├── anchors-bf.data
│   │       │   ├── anchors-bg.data
│   │       │   ├── anchors-bi.data
│   │       │   ├── anchors-bl.data
│   │       │   ├── anchors-bm.data
│   │       │   ├── anchors-bo.data
│   │       │   ├── anchors-br.data
│   │       │   ├── anchors-bs.data
│   │       │   ├── anchors-bt.data
│   │       │   ├── anchors-bu.data
│   │       │   ├── anchors-bv.data
│   │       │   ├── anchors-by.data
│   │       │   ├── anchors-c0.data
│   │       │   ├── anchors-c_.data
│   │       │   ├── anchors-ca.data
│   │       │   ├── anchors-cb.data
│   │       │   ├── anchors-cc.data
│   │       │   ├── anchors-cd.data
│   │       │   ├── anchors-ce.data
│   │       │   ├── anchors-cf.data
│   │       │   ├── anchors-ch.data
│   │       │   ├── anchors-ci.data
│   │       │   ├── anchors-cj.data
│   │       │   ├── anchors-cl.data
│   │       │   ├── anchors-cm.data
│   │       │   ├── anchors-cn.data
│   │       │   ├── anchors-co.data
│   │       │   ├── anchors-cp.data
│   │       │   ├── anchors-cq.data
│   │       │   ├── anchors-cr.data
│   │       │   ├── anchors-cs.data
│   │       │   ├── anchors-ct.data
│   │       │   ├── anchors-cu.data
│   │       │   ├── anchors-cw.data
│   │       │   ├── anchors-cx.data
│   │       │   ├── anchors-cy.data
│   │       │   ├── anchors-d5.data
│   │       │   ├── anchors-d6.data
│   │       │   ├── anchors-d_.data
│   │       │   ├── anchors-da.data
│   │       │   ├── anchors-db.data
│   │       │   ├── anchors-dc.data
│   │       │   ├── anchors-dd.data
│   │       │   ├── anchors-de.data
│   │       │   ├── anchors-df.data
│   │       │   ├── anchors-di.data
│   │       │   ├── anchors-dl.data
│   │       │   ├── anchors-dn.data
│   │       │   ├── anchors-do.data
│   │       │   ├── anchors-dp.data
│   │       │   ├── anchors-dq.data
│   │       │   ├── anchors-dr.data
│   │       │   ├── anchors-ds.data
│   │       │   ├── anchors-dt.data
│   │       │   ├── anchors-du.data
│   │       │   ├── anchors-dv.data
│   │       │   ├── anchors-dx.data
│   │       │   ├── anchors-dy.data
│   │       │   ├── anchors-e_.data
│   │       │   ├── anchors-ea.data
│   │       │   ├── anchors-ec.data
│   │       │   ├── anchors-ed.data
│   │       │   ├── anchors-ef.data
│   │       │   ├── anchors-ei.data
│   │       │   ├── anchors-ej.data
│   │       │   ├── anchors-el.data
│   │       │   ├── anchors-em.data
│   │       │   ├── anchors-en.data
│   │       │   ├── anchors-eo.data
│   │       │   ├── anchors-ep.data
│   │       │   ├── anchors-eq.data
│   │       │   ├── anchors-er.data
│   │       │   ├── anchors-es.data
│   │       │   ├── anchors-et.data
│   │       │   ├── anchors-eu.data
│   │       │   ├── anchors-ev.data
│   │       │   ├── anchors-ew.data
│   │       │   ├── anchors-ex.data
│   │       │   ├── anchors-ey.data
│   │       │   ├── anchors-f1.data
│   │       │   ├── anchors-f3.data
│   │       │   ├── anchors-f6.data
│   │       │   ├── anchors-f_.data
│   │       │   ├── anchors-fa.data
│   │       │   ├── anchors-fe.data
│   │       │   ├── anchors-ff.data
│   │       │   ├── anchors-fg.data
│   │       │   ├── anchors-fi.data
│   │       │   ├── anchors-fl.data
│   │       │   ├── anchors-fm.data
│   │       │   ├── anchors-fn.data
│   │       │   ├── anchors-fo.data
│   │       │   ├── anchors-fr.data
│   │       │   ├── anchors-fu.data
│   │       │   ├── anchors-fw.data
│   │       │   ├── anchors-fx.data
│   │       │   ├── anchors-fy.data
│   │       │   ├── anchors-g_.data
│   │       │   ├── anchors-ga.data
│   │       │   ├── anchors-gb.data
│   │       │   ├── anchors-gc.data
│   │       │   ├── anchors-ge.data
│   │       │   ├── anchors-gh.data
│   │       │   ├── anchors-gi.data
│   │       │   ├── anchors-gl.data
│   │       │   ├── anchors-go.data
│   │       │   ├── anchors-gp.data
│   │       │   ├── anchors-gr.data
│   │       │   ├── anchors-gt.data
│   │       │   ├── anchors-gu.data
│   │       │   ├── anchors-gy.data
│   │       │   ├── anchors-gz.data
│   │       │   ├── anchors-h1.data
│   │       │   ├── anchors-h2.data
│   │       │   ├── anchors-h3.data
│   │       │   ├── anchors-h4.data
│   │       │   ├── anchors-h5.data
│   │       │   ├── anchors-h6.data
│   │       │   ├── anchors-h_.data
│   │       │   ├── anchors-ha.data
│   │       │   ├── anchors-hd.data
│   │       │   ├── anchors-he.data
│   │       │   ├── anchors-hg.data
│   │       │   ├── anchors-hh.data
│   │       │   ├── anchors-hi.data
│   │       │   ├── anchors-hk.data
│   │       │   ├── anchors-hl.data
│   │       │   ├── anchors-hm.data
│   │       │   ├── anchors-ho.data
│   │       │   ├── anchors-hr.data
│   │       │   ├── anchors-hs.data
│   │       │   ├── anchors-ht.data
│   │       │   ├── anchors-hu.data
│   │       │   ├── anchors-hv.data
│   │       │   ├── anchors-hw.data
│   │       │   ├── anchors-hy.data
│   │       │   ├── anchors-hz.data
│   │       │   ├── anchors-i1.data
│   │       │   ├── anchors-i3.data
│   │       │   ├── anchors-i4.data
│   │       │   ├── anchors-i6.data
│   │       │   ├── anchors-i_.data
│   │       │   ├── anchors-ia.data
│   │       │   ├── anchors-ib.data
│   │       │   ├── anchors-ic.data
│   │       │   ├── anchors-id.data
│   │       │   ├── anchors-ie.data
│   │       │   ├── anchors-if.data
│   │       │   ├── anchors-ig.data
│   │       │   ├── anchors-ih.data
│   │       │   ├── anchors-ii.data
│   │       │   ├── anchors-ij.data
│   │       │   ├── anchors-il.data
│   │       │   ├── anchors-im.data
│   │       │   ├── anchors-in.data
│   │       │   ├── anchors-io.data
│   │       │   ├── anchors-ip.data
│   │       │   ├── anchors-ir.data
│   │       │   ├── anchors-is.data
│   │       │   ├── anchors-it.data
│   │       │   ├── anchors-iv.data
│   │       │   ├── anchors-ja.data
│   │       │   ├── anchors-ji.data
│   │       │   ├── anchors-jo.data
│   │       │   ├── anchors-js.data
│   │       │   ├── anchors-ju.data
│   │       │   ├── anchors-jw.data
│   │       │   ├── anchors-jz.data
│   │       │   ├── anchors-k1.data
│   │       │   ├── anchors-k2.data
│   │       │   ├── anchors-k3.data
│   │       │   ├── anchors-k4.data
│   │       │   ├── anchors-k_.data
│   │       │   ├── anchors-ka.data
│   │       │   ├── anchors-kb.data
│   │       │   ├── anchors-ke.data
│   │       │   ├── anchors-kh.data
│   │       │   ├── anchors-ki.data
│   │       │   ├── anchors-kn.data
│   │       │   ├── anchors-ko.data
│   │       │   ├── anchors-kr.data
│   │       │   ├── anchors-kt.data
│   │       │   ├── anchors-l1.data
│   │       │   ├── anchors-l2.data
│   │       │   ├── anchors-l3.data
│   │       │   ├── anchors-l_.data
│   │       │   ├── anchors-la.data
│   │       │   ├── anchors-lb.data
│   │       │   ├── anchors-lc.data
│   │       │   ├── anchors-le.data
│   │       │   ├── anchors-lh.data
│   │       │   ├── anchors-li.data
│   │       │   ├── anchors-ln.data
│   │       │   ├── anchors-lo.data
│   │       │   ├── anchors-lr.data
│   │       │   ├── anchors-ls.data
│   │       │   ├── anchors-lt.data
│   │       │   ├── anchors-lu.data
│   │       │   ├── anchors-lv.data
│   │       │   ├── anchors-lz.data
│   │       │   ├── anchors-m1.data
│   │       │   ├── anchors-m2.data
│   │       │   ├── anchors-m3.data
│   │       │   ├── anchors-m4.data
│   │       │   ├── anchors-ma.data
│   │       │   ├── anchors-mb.data
│   │       │   ├── anchors-mc.data
│   │       │   ├── anchors-me.data
│   │       │   ├── anchors-mf.data
│   │       │   ├── anchors-mi.data
│   │       │   ├── anchors-ml.data
│   │       │   ├── anchors-mm.data
│   │       │   ├── anchors-mn.data
│   │       │   ├── anchors-mo.data
│   │       │   ├── anchors-mp.data
│   │       │   ├── anchors-mq.data
│   │       │   ├── anchors-mr.data
│   │       │   ├── anchors-ms.data
│   │       │   ├── anchors-mt.data
│   │       │   ├── anchors-mu.data
│   │       │   ├── anchors-my.data
│   │       │   ├── anchors-n_.data
│   │       │   ├── anchors-na.data
│   │       │   ├── anchors-nc.data
│   │       │   ├── anchors-nd.data
│   │       │   ├── anchors-ne.data
│   │       │   ├── anchors-nf.data
│   │       │   ├── anchors-nh.data
│   │       │   ├── anchors-ni.data
│   │       │   ├── anchors-nn.data
│   │       │   ├── anchors-no.data
│   │       │   ├── anchors-np.data
│   │       │   ├── anchors-nq.data
│   │       │   ├── anchors-nr.data
│   │       │   ├── anchors-ns.data
│   │       │   ├── anchors-nt.data
│   │       │   ├── anchors-nu.data
│   │       │   ├── anchors-nv.data
│   │       │   ├── anchors-nw.data
│   │       │   ├── anchors-ny.data
│   │       │   ├── anchors-oa.data
│   │       │   ├── anchors-ob.data
│   │       │   ├── anchors-oc.data
│   │       │   ├── anchors-od.data
│   │       │   ├── anchors-oe.data
│   │       │   ├── anchors-of.data
│   │       │   ├── anchors-og.data
│   │       │   ├── anchors-oh.data
│   │       │   ├── anchors-oi.data
│   │       │   ├── anchors-ok.data
│   │       │   ├── anchors-ol.data
│   │       │   ├── anchors-om.data
│   │       │   ├── anchors-on.data
│   │       │   ├── anchors-op.data
│   │       │   ├── anchors-or.data
│   │       │   ├── anchors-os.data
│   │       │   ├── anchors-ot.data
│   │       │   ├── anchors-ou.data
│   │       │   ├── anchors-ov.data
│   │       │   ├── anchors-ow.data
│   │       │   ├── anchors-p1.data
│   │       │   ├── anchors-p2.data
│   │       │   ├── anchors-p3.data
│   │       │   ├── anchors-p4.data
│   │       │   ├── anchors-p_.data
│   │       │   ├── anchors-pa.data
│   │       │   ├── anchors-pb.data
│   │       │   ├── anchors-pc.data
│   │       │   ├── anchors-pd.data
│   │       │   ├── anchors-pe.data
│   │       │   ├── anchors-ph.data
│   │       │   ├── anchors-pi.data
│   │       │   ├── anchors-pk.data
│   │       │   ├── anchors-pl.data
│   │       │   ├── anchors-pm.data
│   │       │   ├── anchors-pn.data
│   │       │   ├── anchors-po.data
│   │       │   ├── anchors-pq.data
│   │       │   ├── anchors-pr.data
│   │       │   ├── anchors-ps.data
│   │       │   ├── anchors-pt.data
│   │       │   ├── anchors-pu.data
│   │       │   ├── anchors-px.data
│   │       │   ├── anchors-q_.data
│   │       │   ├── anchors-qi.data
│   │       │   ├── anchors-qp.data
│   │       │   ├── anchors-qr.data
│   │       │   ├── anchors-qu.data
│   │       │   ├── anchors-qv.data
│   │       │   ├── anchors-qw.data
│   │       │   ├── anchors-r1.data
│   │       │   ├── anchors-r3.data
│   │       │   ├── anchors-r8.data
│   │       │   ├── anchors-r_.data
│   │       │   ├── anchors-ra.data
│   │       │   ├── anchors-rb.data
│   │       │   ├── anchors-rc.data
│   │       │   ├── anchors-rd.data
│   │       │   ├── anchors-re.data
│   │       │   ├── anchors-rf.data
│   │       │   ├── anchors-rg.data
│   │       │   ├── anchors-rh.data
│   │       │   ├── anchors-ri.data
│   │       │   ├── anchors-rk.data
│   │       │   ├── anchors-rl.data
│   │       │   ├── anchors-rm.data
│   │       │   ├── anchors-ro.data
│   │       │   ├── anchors-rp.data
│   │       │   ├── anchors-rr.data
│   │       │   ├── anchors-rs.data
│   │       │   ├── anchors-rt.data
│   │       │   ├── anchors-ru.data
│   │       │   ├── anchors-rx.data
│   │       │   ├── anchors-ry.data
│   │       │   ├── anchors-rz.data
│   │       │   ├── anchors-s1.data
│   │       │   ├── anchors-s2.data
│   │       │   ├── anchors-s3.data
│   │       │   ├── anchors-s_.data
│   │       │   ├── anchors-sa.data
│   │       │   ├── anchors-sc.data
│   │       │   ├── anchors-sd.data
│   │       │   ├── anchors-se.data
│   │       │   ├── anchors-sf.data
│   │       │   ├── anchors-sh.data
│   │       │   ├── anchors-si.data
│   │       │   ├── anchors-sk.data
│   │       │   ├── anchors-sl.data
│   │       │   ├── anchors-sm.data
│   │       │   ├── anchors-sn.data
│   │       │   ├── anchors-so.data
│   │       │   ├── anchors-sp.data
│   │       │   ├── anchors-sq.data
│   │       │   ├── anchors-sr.data
│   │       │   ├── anchors-ss.data
│   │       │   ├── anchors-st.data
│   │       │   ├── anchors-su.data
│   │       │   ├── anchors-sv.data
│   │       │   ├── anchors-sw.data
│   │       │   ├── anchors-sx.data
│   │       │   ├── anchors-sy.data
│   │       │   ├── anchors-t0.data
│   │       │   ├── anchors-t1.data
│   │       │   ├── anchors-t2.data
│   │       │   ├── anchors-t_.data
│   │       │   ├── anchors-ta.data
│   │       │   ├── anchors-tb.data
│   │       │   ├── anchors-tc.data
│   │       │   ├── anchors-td.data
│   │       │   ├── anchors-te.data
│   │       │   ├── anchors-tf.data
│   │       │   ├── anchors-th.data
│   │       │   ├── anchors-ti.data
│   │       │   ├── anchors-tk.data
│   │       │   ├── anchors-tl.data
│   │       │   ├── anchors-tn.data
│   │       │   ├── anchors-to.data
│   │       │   ├── anchors-tr.data
│   │       │   ├── anchors-ts.data
│   │       │   ├── anchors-tt.data
│   │       │   ├── anchors-tu.data
│   │       │   ├── anchors-tv.data
│   │       │   ├── anchors-tw.data
│   │       │   ├── anchors-tx.data
│   │       │   ├── anchors-ty.data
│   │       │   ├── anchors-tz.data
│   │       │   ├── anchors-u3.data
│   │       │   ├── anchors-u8.data
│   │       │   ├── anchors-u_.data
│   │       │   ├── anchors-ua.data
│   │       │   ├── anchors-ub.data
│   │       │   ├── anchors-ud.data
│   │       │   ├── anchors-ui.data
│   │       │   ├── anchors-ul.data
│   │       │   ├── anchors-un.data
│   │       │   ├── anchors-up.data
│   │       │   ├── anchors-ur.data
│   │       │   ├── anchors-us.data
│   │       │   ├── anchors-ut.data
│   │       │   ├── anchors-uu.data
│   │       │   ├── anchors-uv.data
│   │       │   ├── anchors-v1.data
│   │       │   ├── anchors-v_.data
│   │       │   ├── anchors-va.data
│   │       │   ├── anchors-vb.data
│   │       │   ├── anchors-vc.data
│   │       │   ├── anchors-ve.data
│   │       │   ├── anchors-vh.data
│   │       │   ├── anchors-vi.data
│   │       │   ├── anchors-vl.data
│   │       │   ├── anchors-vm.data
│   │       │   ├── anchors-vo.data
│   │       │   ├── anchors-vp.data
│   │       │   ├── anchors-vs.data
│   │       │   ├── anchors-vt.data
│   │       │   ├── anchors-vw.data
│   │       │   ├── anchors-w3.data
│   │       │   ├── anchors-w_.data
│   │       │   ├── anchors-wa.data
│   │       │   ├── anchors-wb.data
│   │       │   ├── anchors-wc.data
│   │       │   ├── anchors-wd.data
│   │       │   ├── anchors-we.data
│   │       │   ├── anchors-wg.data
│   │       │   ├── anchors-wh.data
│   │       │   ├── anchors-wi.data
│   │       │   ├── anchors-wo.data
│   │       │   ├── anchors-wp.data
│   │       │   ├── anchors-wq.data
│   │       │   ├── anchors-wr.data
│   │       │   ├── anchors-ws.data
│   │       │   ├── anchors-x1.data
│   │       │   ├── anchors-x2.data
│   │       │   ├── anchors-x_.data
│   │       │   ├── anchors-xa.data
│   │       │   ├── anchors-xb.data
│   │       │   ├── anchors-xc.data
│   │       │   ├── anchors-xe.data
│   │       │   ├── anchors-xf.data
│   │       │   ├── anchors-xh.data
│   │       │   ├── anchors-xl.data
│   │       │   ├── anchors-xm.data
│   │       │   ├── anchors-xo.data
│   │       │   ├── anchors-xp.data
│   │       │   ├── anchors-xr.data
│   │       │   ├── anchors-xs.data
│   │       │   ├── anchors-xu.data
│   │       │   ├── anchors-xw.data
│   │       │   ├── anchors-xx.data
│   │       │   ├── anchors-xy.data
│   │       │   ├── anchors-y1.data
│   │       │   ├── anchors-y2.data
│   │       │   ├── anchors-y_.data
│   │       │   ├── anchors-ya.data
│   │       │   ├── anchors-yb.data
│   │       │   ├── anchors-yc.data
│   │       │   ├── anchors-ye.data
│   │       │   ├── anchors-yi.data
│   │       │   ├── anchors-yo.data
│   │       │   ├── anchors-ys.data
│   │       │   ├── anchors-yu.data
│   │       │   ├── anchors-z_.data
│   │       │   ├── anchors-za.data
│   │       │   ├── anchors-zb.data
│   │       │   ├── anchors-zc.data
│   │       │   ├── anchors-ze.data
│   │       │   ├── anchors-zh.data
│   │       │   ├── anchors-zi.data
│   │       │   ├── anchors-zl.data
│   │       │   ├── anchors-zo.data
│   │       │   ├── anchors-zr.data
│   │       │   └── anchors-zu.data
│   │       ├── biblio/
│   │       │   ├── biblio-2d.data
│   │       │   ├── biblio-3g.data
│   │       │   ├── biblio-aa.data
│   │       │   ├── biblio-ab.data
│   │       │   ├── biblio-ac.data
│   │       │   ├── biblio-ad.data
│   │       │   ├── biblio-ae.data
│   │       │   ├── biblio-af.data
│   │       │   ├── biblio-ag.data
│   │       │   ├── biblio-al.data
│   │       │   ├── biblio-am.data
│   │       │   ├── biblio-an.data
│   │       │   ├── biblio-ao.data
│   │       │   ├── biblio-ap.data
│   │       │   ├── biblio-ar.data
│   │       │   ├── biblio-as.data
│   │       │   ├── biblio-at.data
│   │       │   ├── biblio-au.data
│   │       │   ├── biblio-av.data
│   │       │   ├── biblio-ax.data
│   │       │   ├── biblio-ba.data
│   │       │   ├── biblio-bb.data
│   │       │   ├── biblio-bc.data
│   │       │   ├── biblio-be.data
│   │       │   ├── biblio-bi.data
│   │       │   ├── biblio-bl.data
│   │       │   ├── biblio-bo.data
│   │       │   ├── biblio-br.data
│   │       │   ├── biblio-bu.data
│   │       │   ├── biblio-c1.data
│   │       │   ├── biblio-ca.data
│   │       │   ├── biblio-cb.data
│   │       │   ├── biblio-cc.data
│   │       │   ├── biblio-cd.data
│   │       │   ├── biblio-ce.data
│   │       │   ├── biblio-cg.data
│   │       │   ├── biblio-ch.data
│   │       │   ├── biblio-ci.data
│   │       │   ├── biblio-cj.data
│   │       │   ├── biblio-cl.data
│   │       │   ├── biblio-cm.data
│   │       │   ├── biblio-co.data
│   │       │   ├── biblio-cp.data
│   │       │   ├── biblio-cr.data
│   │       │   ├── biblio-cs.data
│   │       │   ├── biblio-ct.data
│   │       │   ├── biblio-cu.data
│   │       │   ├── biblio-cv.data
│   │       │   ├── biblio-cw.data
│   │       │   ├── biblio-cx.data
│   │       │   ├── biblio-cy.data
│   │       │   ├── biblio-d0.data
│   │       │   ├── biblio-d1.data
│   │       │   ├── biblio-d2.data
│   │       │   ├── biblio-d4.data
│   │       │   ├── biblio-da.data
│   │       │   ├── biblio-dc.data
│   │       │   ├── biblio-dd.data
│   │       │   ├── biblio-de.data
│   │       │   ├── biblio-df.data
│   │       │   ├── biblio-di.data
│   │       │   ├── biblio-dm.data
│   │       │   ├── biblio-dn.data
│   │       │   ├── biblio-do.data
│   │       │   ├── biblio-dp.data
│   │       │   ├── biblio-dr.data
│   │       │   ├── biblio-ds.data
│   │       │   ├── biblio-dt.data
│   │       │   ├── biblio-dv.data
│   │       │   ├── biblio-dw.data
│   │       │   ├── biblio-dx.data
│   │       │   ├── biblio-e..data
│   │       │   ├── biblio-ea.data
│   │       │   ├── biblio-eb.data
│   │       │   ├── biblio-ec.data
│   │       │   ├── biblio-ed.data
│   │       │   ├── biblio-eg.data
│   │       │   ├── biblio-el.data
│   │       │   ├── biblio-em.data
│   │       │   ├── biblio-en.data
│   │       │   ├── biblio-eo.data
│   │       │   ├── biblio-ep.data
│   │       │   ├── biblio-er.data
│   │       │   ├── biblio-es.data
│   │       │   ├── biblio-et.data
│   │       │   ├── biblio-eu.data
│   │       │   ├── biblio-ev.data
│   │       │   ├── biblio-ew.data
│   │       │   ├── biblio-ex.data
│   │       │   ├── biblio-ey.data
│   │       │   ├── biblio-fe.data
│   │       │   ├── biblio-fi.data
│   │       │   ├── biblio-fl.data
│   │       │   ├── biblio-fo.data
│   │       │   ├── biblio-fr.data
│   │       │   ├── biblio-fs.data
│   │       │   ├── biblio-fu.data
│   │       │   ├── biblio-ga.data
│   │       │   ├── biblio-gd.data
│   │       │   ├── biblio-ge.data
│   │       │   ├── biblio-gi.data
│   │       │   ├── biblio-gl.data
│   │       │   ├── biblio-gm.data
│   │       │   ├── biblio-go.data
│   │       │   ├── biblio-gp.data
│   │       │   ├── biblio-gr.data
│   │       │   ├── biblio-gs.data
│   │       │   ├── biblio-gt.data
│   │       │   ├── biblio-gu.data
│   │       │   ├── biblio-gy.data
│   │       │   ├── biblio-h-.data
│   │       │   ├── biblio-ha.data
│   │       │   ├── biblio-hb.data
│   │       │   ├── biblio-hc.data
│   │       │   ├── biblio-he.data
│   │       │   ├── biblio-hg.data
│   │       │   ├── biblio-hi.data
│   │       │   ├── biblio-hl.data
│   │       │   ├── biblio-hm.data
│   │       │   ├── biblio-hn.data
│   │       │   ├── biblio-hr.data
│   │       │   ├── biblio-hs.data
│   │       │   ├── biblio-ht.data
│   │       │   ├── biblio-hu.data
│   │       │   ├── biblio-i1.data
│   │       │   ├── biblio-ia.data
│   │       │   ├── biblio-ic.data
│   │       │   ├── biblio-id.data
│   │       │   ├── biblio-ie.data
│   │       │   ├── biblio-if.data
│   │       │   ├── biblio-il.data
│   │       │   ├── biblio-im.data
│   │       │   ├── biblio-in.data
│   │       │   ├── biblio-ip.data
│   │       │   ├── biblio-ir.data
│   │       │   ├── biblio-is.data
│   │       │   ├── biblio-it.data
│   │       │   ├── biblio-ja.data
│   │       │   ├── biblio-je.data
│   │       │   ├── biblio-jf.data
│   │       │   ├── biblio-ji.data
│   │       │   ├── biblio-jl.data
│   │       │   ├── biblio-jp.data
│   │       │   ├── biblio-js.data
│   │       │   ├── biblio-ju.data
│   │       │   ├── biblio-jw.data
│   │       │   ├── biblio-ke.data
│   │       │   ├── biblio-kh.data
│   │       │   ├── biblio-kl.data
│   │       │   ├── biblio-kn.data
│   │       │   ├── biblio-ko.data
│   │       │   ├── biblio-ku.data
│   │       │   ├── biblio-kv.data
│   │       │   ├── biblio-la.data
│   │       │   ├── biblio-lb.data
│   │       │   ├── biblio-ld.data
│   │       │   ├── biblio-le.data
│   │       │   ├── biblio-li.data
│   │       │   ├── biblio-ll.data
│   │       │   ├── biblio-lo.data
│   │       │   ├── biblio-lp.data
│   │       │   ├── biblio-lt.data
│   │       │   ├── biblio-lw.data
│   │       │   ├── biblio-ma.data
│   │       │   ├── biblio-mb.data
│   │       │   ├── biblio-mc.data
│   │       │   ├── biblio-md.data
│   │       │   ├── biblio-me.data
│   │       │   ├── biblio-mf.data
│   │       │   ├── biblio-mi.data
│   │       │   ├── biblio-ml.data
│   │       │   ├── biblio-mm.data
│   │       │   ├── biblio-mn.data
│   │       │   ├── biblio-mo.data
│   │       │   ├── biblio-mp.data
│   │       │   ├── biblio-mq.data
│   │       │   ├── biblio-mr.data
│   │       │   ├── biblio-ms.data
│   │       │   ├── biblio-mu.data
│   │       │   ├── biblio-mw.data
│   │       │   ├── biblio-n-.data
│   │       │   ├── biblio-n1.data
│   │       │   ├── biblio-n2.data
│   │       │   ├── biblio-n3.data
│   │       │   ├── biblio-n4.data
│   │       │   ├── biblio-na.data
│   │       │   ├── biblio-nd.data
│   │       │   ├── biblio-ne.data
│   │       │   ├── biblio-nf.data
│   │       │   ├── biblio-ng.data
│   │       │   ├── biblio-nk.data
│   │       │   ├── biblio-nl.data
│   │       │   ├── biblio-no.data
│   │       │   ├── biblio-np.data
│   │       │   ├── biblio-ns.data
│   │       │   ├── biblio-nt.data
│   │       │   ├── biblio-nv.data
│   │       │   ├── biblio-oa.data
│   │       │   ├── biblio-ob.data
│   │       │   ├── biblio-oc.data
│   │       │   ├── biblio-od.data
│   │       │   ├── biblio-oe.data
│   │       │   ├── biblio-of.data
│   │       │   ├── biblio-og.data
│   │       │   ├── biblio-oi.data
│   │       │   ├── biblio-om.data
│   │       │   ├── biblio-op.data
│   │       │   ├── biblio-or.data
│   │       │   ├── biblio-os.data
│   │       │   ├── biblio-ov.data
│   │       │   ├── biblio-ow.data
│   │       │   ├── biblio-p0.data
│   │       │   ├── biblio-p1.data
│   │       │   ├── biblio-p2.data
│   │       │   ├── biblio-p3.data
│   │       │   ├── biblio-p4.data
│   │       │   ├── biblio-pa.data
│   │       │   ├── biblio-pc.data
│   │       │   ├── biblio-pd.data
│   │       │   ├── biblio-pe.data
│   │       │   ├── biblio-pf.data
│   │       │   ├── biblio-pg.data
│   │       │   ├── biblio-ph.data
│   │       │   ├── biblio-pi.data
│   │       │   ├── biblio-pk.data
│   │       │   ├── biblio-pl.data
│   │       │   ├── biblio-pn.data
│   │       │   ├── biblio-po.data
│   │       │   ├── biblio-pp.data
│   │       │   ├── biblio-pr.data
│   │       │   ├── biblio-ps.data
│   │       │   ├── biblio-pt.data
│   │       │   ├── biblio-pu.data
│   │       │   ├── biblio-pw.data
│   │       │   ├── biblio-qa.data
│   │       │   ├── biblio-qb.data
│   │       │   ├── biblio-qn.data
│   │       │   ├── biblio-qu.data
│   │       │   ├── biblio-r2.data
│   │       │   ├── biblio-ra.data
│   │       │   ├── biblio-rc.data
│   │       │   ├── biblio-rd.data
│   │       │   ├── biblio-re.data
│   │       │   ├── biblio-rf.data
│   │       │   ├── biblio-ri.data
│   │       │   ├── biblio-ro.data
│   │       │   ├── biblio-rt.data
│   │       │   ├── biblio-ru.data
│   │       │   ├── biblio-s6.data
│   │       │   ├── biblio-sa.data
│   │       │   ├── biblio-sc.data
│   │       │   ├── biblio-sd.data
│   │       │   ├── biblio-se.data
│   │       │   ├── biblio-sf.data
│   │       │   ├── biblio-sg.data
│   │       │   ├── biblio-sh.data
│   │       │   ├── biblio-si.data
│   │       │   ├── biblio-sk.data
│   │       │   ├── biblio-sm.data
│   │       │   ├── biblio-sn.data
│   │       │   ├── biblio-so.data
│   │       │   ├── biblio-sp.data
│   │       │   ├── biblio-sr.data
│   │       │   ├── biblio-ss.data
│   │       │   ├── biblio-st.data
│   │       │   ├── biblio-su.data
│   │       │   ├── biblio-sv.data
│   │       │   ├── biblio-sw.data
│   │       │   ├── biblio-sx.data
│   │       │   ├── biblio-sy.data
│   │       │   ├── biblio-ta.data
│   │       │   ├── biblio-tc.data
│   │       │   ├── biblio-te.data
│   │       │   ├── biblio-th.data
│   │       │   ├── biblio-ti.data
│   │       │   ├── biblio-tl.data
│   │       │   ├── biblio-to.data
│   │       │   ├── biblio-tp.data
│   │       │   ├── biblio-tr.data
│   │       │   ├── biblio-ts.data
│   │       │   ├── biblio-tt.data
│   │       │   ├── biblio-tu.data
│   │       │   ├── biblio-tv.data
│   │       │   ├── biblio-ty.data
│   │       │   ├── biblio-tz.data
│   │       │   ├── biblio-ua.data
│   │       │   ├── biblio-uc.data
│   │       │   ├── biblio-uf.data
│   │       │   ├── biblio-ui.data
│   │       │   ├── biblio-um.data
│   │       │   ├── biblio-un.data
│   │       │   ├── biblio-up.data
│   │       │   ├── biblio-ur.data
│   │       │   ├── biblio-us.data
│   │       │   ├── biblio-ut.data
│   │       │   ├── biblio-uw.data
│   │       │   ├── biblio-va.data
│   │       │   ├── biblio-vb.data
│   │       │   ├── biblio-vc.data
│   │       │   ├── biblio-ve.data
│   │       │   ├── biblio-vi.data
│   │       │   ├── biblio-vm.data
│   │       │   ├── biblio-vo.data
│   │       │   ├── biblio-vs.data
│   │       │   ├── biblio-vt.data
│   │       │   ├── biblio-vx.data
│   │       │   ├── biblio-w3.data
│   │       │   ├── biblio-wa.data
│   │       │   ├── biblio-wb.data
│   │       │   ├── biblio-wc.data
│   │       │   ├── biblio-wd.data
│   │       │   ├── biblio-we.data
│   │       │   ├── biblio-wf.data
│   │       │   ├── biblio-wg.data
│   │       │   ├── biblio-wh.data
│   │       │   ├── biblio-wi.data
│   │       │   ├── biblio-wm.data
│   │       │   ├── biblio-wo.data
│   │       │   ├── biblio-wp.data
│   │       │   ├── biblio-ws.data
│   │       │   ├── biblio-ww.data
│   │       │   ├── biblio-x1.data
│   │       │   ├── biblio-x5.data
│   │       │   ├── biblio-x6.data
│   │       │   ├── biblio-xa.data
│   │       │   ├── biblio-xb.data
│   │       │   ├── biblio-xd.data
│   │       │   ├── biblio-xe.data
│   │       │   ├── biblio-xf.data
│   │       │   ├── biblio-xh.data
│   │       │   ├── biblio-xi.data
│   │       │   ├── biblio-xk.data
│   │       │   ├── biblio-xl.data
│   │       │   ├── biblio-xm.data
│   │       │   ├── biblio-xo.data
│   │       │   ├── biblio-xp.data
│   │       │   ├── biblio-xq.data
│   │       │   ├── biblio-xs.data
│   │       │   ├── biblio-xt.data
│   │       │   ├── biblio-xu.data
│   │       │   ├── biblio-ya.data
│   │       │   ├── biblio-ze.data
│   │       │   ├── biblio-zh.data
│   │       │   └── biblio-zi.data
│   │       ├── biblio-keys.json
│   │       ├── biblio-numeric-suffixes.json
│   │       ├── bikeshed-version.txt
│   │       ├── boilerplate/
│   │       │   ├── ab/
│   │       │   │   ├── footer.include
│   │       │   │   └── status.include
│   │       │   ├── abstract.include
│   │       │   ├── act-rules-format/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── aom/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults-FD.include
│   │       │   │   ├── defaults-PD.include
│   │       │   │   ├── defaults-WGA.include
│   │       │   │   ├── defaults-WGD.include
│   │       │   │   ├── header-FD.include
│   │       │   │   └── logo.include
│   │       │   ├── audiowg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── browser-testing-tools/
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── bs-extensions.include
│   │       │   ├── byos/
│   │       │   │   ├── abstract.include
│   │       │   │   └── defaults.include
│   │       │   ├── computed-metadata.include
│   │       │   ├── copyright.include
│   │       │   ├── cssnext/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── csswg/
│   │       │   │   ├── abstract.include
│   │       │   │   ├── computed-metadata.include
│   │       │   │   ├── copyright-DREAM.include
│   │       │   │   ├── defaults-ED.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── status.include
│   │       │   │   ├── warning-not-ready.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── dap/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-NOTE.include
│   │       │   │   └── status-WD.include
│   │       │   ├── defaults.include
│   │       │   ├── doctypes.kdl
│   │       │   ├── fedid/
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-FPWD.include
│   │       │   ├── fedidcg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── footer.include
│   │       │   ├── fxtf/
│   │       │   │   ├── bs-extensions.include
│   │       │   │   ├── defaults-ED.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-CR.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── geolocation/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-ED.include
│   │       │   ├── gpuwg/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── header.include
│   │       │   ├── houdini/
│   │       │   │   ├── bs-extensions.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   └── status.include
│   │       │   ├── html/
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   ├── status-PR.include
│   │       │   │   └── status-WD.include
│   │       │   ├── htmlwg/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── httpslocal/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-CG-FINAL.include
│   │       │   ├── i18n/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-WD.include
│   │       │   │   ├── warning-not-ready.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── immersivewebwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── logo.include
│   │       │   ├── mediacapture/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── mediawg/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── patcg-id/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── ping/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-ED.include
│   │       │   ├── privacycg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── processcg/
│   │       │   │   └── status.include
│   │       │   ├── ricg/
│   │       │   │   ├── logo.include
│   │       │   │   ├── status-WD.include
│   │       │   │   └── status.include
│   │       │   ├── sacg/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── secondscreencg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── secondscreenwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── serviceworkers/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── solidcg/
│   │       │   │   ├── copyright-CG-DRAFT.include
│   │       │   │   ├── copyright-CG-FINAL.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-CG-FINAL.include
│   │       │   ├── status.include
│   │       │   ├── stylesheet.include
│   │       │   ├── svg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── tag/
│   │       │   │   ├── header-WG-NOTE.include
│   │       │   │   ├── status-DRAFT-FINDING.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FINDING.include
│   │       │   │   ├── status-NOTE.include
│   │       │   │   ├── status-UD.include
│   │       │   │   ├── status-WG-NOTE.include
│   │       │   │   └── status.include
│   │       │   ├── tc39/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── test/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults-DREAM.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-DREAM.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header-DREAM.include
│   │       │   │   ├── header.include
│   │       │   │   └── logo.include
│   │       │   ├── texttracks/
│   │       │   │   ├── copyright-CG-DRAFT.include
│   │       │   │   ├── defaults-CG-DRAFT.include
│   │       │   │   ├── header-CG-DRAFT.include
│   │       │   │   ├── header.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-WD.include
│   │       │   ├── uievents/
│   │       │   │   └── status-WD.include
│   │       │   ├── w3c/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header.include
│   │       │   │   └── logo.include
│   │       │   ├── w3t/
│   │       │   │   └── header.include
│   │       │   ├── warning-branch.include
│   │       │   ├── warning-commit.include
│   │       │   ├── warning-custom.include
│   │       │   ├── warning-expired.include
│   │       │   ├── warning-expires.include
│   │       │   ├── warning-new-version.include
│   │       │   ├── warning-not-ready.include
│   │       │   ├── warning-obsolete.include
│   │       │   ├── warning-replaced-by.include
│   │       │   ├── wasm/
│   │       │   │   ├── abstract.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── web-bluetooth-cg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── web-payments/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-FPWD.include
│   │       │   ├── webapps/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webappsec/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   ├── status-PR.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webauthn/
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webediting/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── webfontswg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header-ED.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webgl/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── webgpu/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── webml/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── webmlwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webperf/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── webrtc/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webspecs/
│   │       │   │   ├── defaults.include
│   │       │   │   └── header.include
│   │       │   ├── webtransport/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webvr/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── wecg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── wg14/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── wg21/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── whatwg/
│   │       │   │   ├── computed-metadata-LS-COMMIT.include
│   │       │   │   ├── computed-metadata-LS-PR.include
│   │       │   │   ├── computed-metadata-RD.include
│   │       │   │   ├── computed-metadata.include
│   │       │   │   ├── defaults-RD.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-RD.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header-RD.include
│   │       │   │   ├── header.include
│   │       │   │   ├── warning-custom.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── wicg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   └── wintercg/
│   │       │       ├── copyright.include
│   │       │       └── status.include
│   │       ├── caniuse/
│   │       │   ├── data.json
│   │       │   ├── feature-aac.json
│   │       │   ├── feature-abortcontroller.json
│   │       │   ├── feature-accelerometer.json
│   │       │   ├── feature-addeventlistener.json
│   │       │   ├── feature-ambient-light.json
│   │       │   ├── feature-apng.json
│   │       │   ├── feature-array-find-index.json
│   │       │   ├── feature-array-find.json
│   │       │   ├── feature-array-flat.json
│   │       │   ├── feature-array-includes.json
│   │       │   ├── feature-arrow-functions.json
│   │       │   ├── feature-asmjs.json
│   │       │   ├── feature-async-clipboard.json
│   │       │   ├── feature-async-functions.json
│   │       │   ├── feature-atob-btoa.json
│   │       │   ├── feature-audio-api.json
│   │       │   ├── feature-audio.json
│   │       │   ├── feature-audiotracks.json
│   │       │   ├── feature-autofocus.json
│   │       │   ├── feature-auxclick.json
│   │       │   ├── feature-av1.json
│   │       │   ├── feature-avif.json
│   │       │   ├── feature-background-attachment.json
│   │       │   ├── feature-background-clip-text.json
│   │       │   ├── feature-background-img-opts.json
│   │       │   ├── feature-background-position-x-y.json
│   │       │   ├── feature-background-repeat-round-space.json
│   │       │   ├── feature-background-sync.json
│   │       │   ├── feature-battery-status.json
│   │       │   ├── feature-beacon.json
│   │       │   ├── feature-beforeafterprint.json
│   │       │   ├── feature-bigint.json
│   │       │   ├── feature-blobbuilder.json
│   │       │   ├── feature-bloburls.json
│   │       │   ├── feature-border-image.json
│   │       │   ├── feature-border-radius.json
│   │       │   ├── feature-broadcastchannel.json
│   │       │   ├── feature-brotli.json
│   │       │   ├── feature-calc.json
│   │       │   ├── feature-canvas-blending.json
│   │       │   ├── feature-canvas-text.json
│   │       │   ├── feature-canvas.json
│   │       │   ├── feature-ch-unit.json
│   │       │   ├── feature-chacha20-poly1305.json
│   │       │   ├── feature-channel-messaging.json
│   │       │   ├── feature-childnode-remove.json
│   │       │   ├── feature-classlist.json
│   │       │   ├── feature-client-hints-dpr-width-viewport.json
│   │       │   ├── feature-clipboard.json
│   │       │   ├── feature-colr-v1.json
│   │       │   ├── feature-colr.json
│   │       │   ├── feature-comparedocumentposition.json
│   │       │   ├── feature-console-basic.json
│   │       │   ├── feature-console-time.json
│   │       │   ├── feature-const.json
│   │       │   ├── feature-constraint-validation.json
│   │       │   ├── feature-contenteditable.json
│   │       │   ├── feature-contentsecuritypolicy.json
│   │       │   ├── feature-contentsecuritypolicy2.json
│   │       │   ├── feature-cookie-store-api.json
│   │       │   ├── feature-cors.json
│   │       │   ├── feature-createimagebitmap.json
│   │       │   ├── feature-credential-management.json
│   │       │   ├── feature-cryptography.json
│   │       │   ├── feature-css-all.json
│   │       │   ├── feature-css-anchor-positioning.json
│   │       │   ├── feature-css-animation.json
│   │       │   ├── feature-css-any-link.json
│   │       │   ├── feature-css-appearance.json
│   │       │   ├── feature-css-at-counter-style.json
│   │       │   ├── feature-css-backdrop-filter.json
│   │       │   ├── feature-css-background-offsets.json
│   │       │   ├── feature-css-backgroundblendmode.json
│   │       │   ├── feature-css-boxdecorationbreak.json
│   │       │   ├── feature-css-boxshadow.json
│   │       │   ├── feature-css-canvas.json
│   │       │   ├── feature-css-caret-color.json
│   │       │   ├── feature-css-cascade-layers.json
│   │       │   ├── feature-css-cascade-scope.json
│   │       │   ├── feature-css-case-insensitive.json
│   │       │   ├── feature-css-clip-path.json
│   │       │   ├── feature-css-color-adjust.json
│   │       │   ├── feature-css-color-function.json
│   │       │   ├── feature-css-conic-gradients.json
│   │       │   ├── feature-css-container-queries-style.json
│   │       │   ├── feature-css-container-queries.json
│   │       │   ├── feature-css-container-query-units.json
│   │       │   ├── feature-css-containment.json
│   │       │   ├── feature-css-content-visibility.json
│   │       │   ├── feature-css-counters.json
│   │       │   ├── feature-css-crisp-edges.json
│   │       │   ├── feature-css-cross-fade.json
│   │       │   ├── feature-css-default-pseudo.json
│   │       │   ├── feature-css-descendant-gtgt.json
│   │       │   ├── feature-css-deviceadaptation.json
│   │       │   ├── feature-css-dir-pseudo.json
│   │       │   ├── feature-css-display-contents.json
│   │       │   ├── feature-css-element-function.json
│   │       │   ├── feature-css-env-function.json
│   │       │   ├── feature-css-exclusions.json
│   │       │   ├── feature-css-featurequeries.json
│   │       │   ├── feature-css-filter-function.json
│   │       │   ├── feature-css-filters.json
│   │       │   ├── feature-css-first-letter.json
│   │       │   ├── feature-css-first-line.json
│   │       │   ├── feature-css-fixed.json
│   │       │   ├── feature-css-focus-visible.json
│   │       │   ├── feature-css-focus-within.json
│   │       │   ├── feature-css-font-palette.json
│   │       │   ├── feature-css-font-rendering-controls.json
│   │       │   ├── feature-css-font-stretch.json
│   │       │   ├── feature-css-gencontent.json
│   │       │   ├── feature-css-gradients.json
│   │       │   ├── feature-css-grid.json
│   │       │   ├── feature-css-hanging-punctuation.json
│   │       │   ├── feature-css-has.json
│   │       │   ├── feature-css-hyphens.json
│   │       │   ├── feature-css-image-orientation.json
│   │       │   ├── feature-css-image-set.json
│   │       │   ├── feature-css-in-out-of-range.json
│   │       │   ├── feature-css-indeterminate-pseudo.json
│   │       │   ├── feature-css-initial-letter.json
│   │       │   ├── feature-css-initial-value.json
│   │       │   ├── feature-css-lch-lab.json
│   │       │   ├── feature-css-letter-spacing.json
│   │       │   ├── feature-css-line-clamp.json
│   │       │   ├── feature-css-logical-props.json
│   │       │   ├── feature-css-marker-pseudo.json
│   │       │   ├── feature-css-masks.json
│   │       │   ├── feature-css-matches-pseudo.json
│   │       │   ├── feature-css-math-functions.json
│   │       │   ├── feature-css-media-interaction.json
│   │       │   ├── feature-css-media-range-syntax.json
│   │       │   ├── feature-css-media-resolution.json
│   │       │   ├── feature-css-mediaqueries.json
│   │       │   ├── feature-css-mixblendmode.json
│   │       │   ├── feature-css-motion-paths.json
│   │       │   ├── feature-css-namespaces.json
│   │       │   ├── feature-css-nesting.json
│   │       │   ├── feature-css-not-sel-list.json
│   │       │   ├── feature-css-nth-child-of.json
│   │       │   ├── feature-css-opacity.json
│   │       │   ├── feature-css-optional-pseudo.json
│   │       │   ├── feature-css-overflow-anchor.json
│   │       │   ├── feature-css-overflow-overlay.json
│   │       │   ├── feature-css-overflow.json
│   │       │   ├── feature-css-overscroll-behavior.json
│   │       │   ├── feature-css-page-break.json
│   │       │   ├── feature-css-paged-media.json
│   │       │   ├── feature-css-paint-api.json
│   │       │   ├── feature-css-placeholder-shown.json
│   │       │   ├── feature-css-placeholder.json
│   │       │   ├── feature-css-read-only-write.json
│   │       │   ├── feature-css-rebeccapurple.json
│   │       │   ├── feature-css-reflections.json
│   │       │   ├── feature-css-regions.json
│   │       │   ├── feature-css-relative-colors.json
│   │       │   ├── feature-css-repeating-gradients.json
│   │       │   ├── feature-css-resize.json
│   │       │   ├── feature-css-revert-value.json
│   │       │   ├── feature-css-rrggbbaa.json
│   │       │   ├── feature-css-scroll-behavior.json
│   │       │   ├── feature-css-scrollbar.json
│   │       │   ├── feature-css-sel2.json
│   │       │   ├── feature-css-sel3.json
│   │       │   ├── feature-css-selection.json
│   │       │   ├── feature-css-shapes.json
│   │       │   ├── feature-css-snappoints.json
│   │       │   ├── feature-css-sticky.json
│   │       │   ├── feature-css-subgrid.json
│   │       │   ├── feature-css-supports-api.json
│   │       │   ├── feature-css-table.json
│   │       │   ├── feature-css-text-align-last.json
│   │       │   ├── feature-css-text-box-trim.json
│   │       │   ├── feature-css-text-indent.json
│   │       │   ├── feature-css-text-justify.json
│   │       │   ├── feature-css-text-orientation.json
│   │       │   ├── feature-css-text-wrap-balance.json
│   │       │   ├── feature-css-textshadow.json
│   │       │   ├── feature-css-touch-action.json
│   │       │   ├── feature-css-transitions.json
│   │       │   ├── feature-css-unset-value.json
│   │       │   ├── feature-css-variables.json
│   │       │   ├── feature-css-when-else.json
│   │       │   ├── feature-css-widows-orphans.json
│   │       │   ├── feature-css-writing-mode.json
│   │       │   ├── feature-css-zoom.json
│   │       │   ├── feature-css3-attr.json
│   │       │   ├── feature-css3-boxsizing.json
│   │       │   ├── feature-css3-colors.json
│   │       │   ├── feature-css3-cursors-grab.json
│   │       │   ├── feature-css3-cursors-newer.json
│   │       │   ├── feature-css3-cursors.json
│   │       │   ├── feature-css3-tabsize.json
│   │       │   ├── feature-currentcolor.json
│   │       │   ├── feature-custom-elements.json
│   │       │   ├── feature-custom-elementsv1.json
│   │       │   ├── feature-customevent.json
│   │       │   ├── feature-datalist.json
│   │       │   ├── feature-dataset.json
│   │       │   ├── feature-datauri.json
│   │       │   ├── feature-date-tolocaledatestring.json
│   │       │   ├── feature-declarative-shadow-dom.json
│   │       │   ├── feature-decorators.json
│   │       │   ├── feature-details.json
│   │       │   ├── feature-deviceorientation.json
│   │       │   ├── feature-devicepixelratio.json
│   │       │   ├── feature-dialog.json
│   │       │   ├── feature-dispatchevent.json
│   │       │   ├── feature-dnssec.json
│   │       │   ├── feature-do-not-track.json
│   │       │   ├── feature-document-currentscript.json
│   │       │   ├── feature-document-evaluate-xpath.json
│   │       │   ├── feature-document-execcommand.json
│   │       │   ├── feature-document-policy.json
│   │       │   ├── feature-document-scrollingelement.json
│   │       │   ├── feature-documenthead.json
│   │       │   ├── feature-dom-manip-convenience.json
│   │       │   ├── feature-dom-range.json
│   │       │   ├── feature-domcontentloaded.json
│   │       │   ├── feature-dommatrix.json
│   │       │   ├── feature-download.json
│   │       │   ├── feature-dragndrop.json
│   │       │   ├── feature-element-closest.json
│   │       │   ├── feature-element-from-point.json
│   │       │   ├── feature-element-scroll-methods.json
│   │       │   ├── feature-eme.json
│   │       │   ├── feature-eot.json
│   │       │   ├── feature-es5.json
│   │       │   ├── feature-es6-class.json
│   │       │   ├── feature-es6-generators.json
│   │       │   ├── feature-es6-module-dynamic-import.json
│   │       │   ├── feature-es6-module.json
│   │       │   ├── feature-es6-number.json
│   │       │   ├── feature-es6-string-includes.json
│   │       │   ├── feature-es6.json
│   │       │   ├── feature-eventsource.json
│   │       │   ├── feature-extended-system-fonts.json
│   │       │   ├── feature-feature-policy.json
│   │       │   ├── feature-fetch.json
│   │       │   ├── feature-fieldset-disabled.json
│   │       │   ├── feature-fileapi.json
│   │       │   ├── feature-filereader.json
│   │       │   ├── feature-filereadersync.json
│   │       │   ├── feature-filesystem.json
│   │       │   ├── feature-flac.json
│   │       │   ├── feature-flexbox-gap.json
│   │       │   ├── feature-flexbox.json
│   │       │   ├── feature-flow-root.json
│   │       │   ├── feature-focusin-focusout-events.json
│   │       │   ├── feature-font-family-system-ui.json
│   │       │   ├── feature-font-feature.json
│   │       │   ├── feature-font-kerning.json
│   │       │   ├── feature-font-loading.json
│   │       │   ├── feature-font-size-adjust.json
│   │       │   ├── feature-font-smooth.json
│   │       │   ├── feature-font-unicode-range.json
│   │       │   ├── feature-font-variant-alternates.json
│   │       │   ├── feature-font-variant-numeric.json
│   │       │   ├── feature-fontface.json
│   │       │   ├── feature-form-attribute.json
│   │       │   ├── feature-form-submit-attributes.json
│   │       │   ├── feature-form-validation.json
│   │       │   ├── feature-fullscreen.json
│   │       │   ├── feature-gamepad.json
│   │       │   ├── feature-geolocation.json
│   │       │   ├── feature-getboundingclientrect.json
│   │       │   ├── feature-getcomputedstyle.json
│   │       │   ├── feature-getelementsbyclassname.json
│   │       │   ├── feature-getrandomvalues.json
│   │       │   ├── feature-gyroscope.json
│   │       │   ├── feature-hardwareconcurrency.json
│   │       │   ├── feature-hashchange.json
│   │       │   ├── feature-heif.json
│   │       │   ├── feature-hevc.json
│   │       │   ├── feature-hidden.json
│   │       │   ├── feature-high-resolution-time.json
│   │       │   ├── feature-history.json
│   │       │   ├── feature-html-media-capture.json
│   │       │   ├── feature-html5semantic.json
│   │       │   ├── feature-http-live-streaming.json
│   │       │   ├── feature-http2.json
│   │       │   ├── feature-http3.json
│   │       │   ├── feature-iframe-sandbox.json
│   │       │   ├── feature-iframe-seamless.json
│   │       │   ├── feature-iframe-srcdoc.json
│   │       │   ├── feature-imagecapture.json
│   │       │   ├── feature-ime.json
│   │       │   ├── feature-img-naturalwidth-naturalheight.json
│   │       │   ├── feature-import-maps.json
│   │       │   ├── feature-imports.json
│   │       │   ├── feature-indeterminate-checkbox.json
│   │       │   ├── feature-indexeddb.json
│   │       │   ├── feature-indexeddb2.json
│   │       │   ├── feature-inline-block.json
│   │       │   ├── feature-innertext.json
│   │       │   ├── feature-input-autocomplete-onoff.json
│   │       │   ├── feature-input-color.json
│   │       │   ├── feature-input-datetime.json
│   │       │   ├── feature-input-email-tel-url.json
│   │       │   ├── feature-input-event.json
│   │       │   ├── feature-input-file-accept.json
│   │       │   ├── feature-input-file-directory.json
│   │       │   ├── feature-input-file-multiple.json
│   │       │   ├── feature-input-inputmode.json
│   │       │   ├── feature-input-minlength.json
│   │       │   ├── feature-input-number.json
│   │       │   ├── feature-input-pattern.json
│   │       │   ├── feature-input-placeholder.json
│   │       │   ├── feature-input-range.json
│   │       │   ├── feature-input-search.json
│   │       │   ├── feature-input-selection.json
│   │       │   ├── feature-insert-adjacent.json
│   │       │   ├── feature-insertadjacenthtml.json
│   │       │   ├── feature-internationalization.json
│   │       │   ├── feature-intersectionobserver-v2.json
│   │       │   ├── feature-intersectionobserver.json
│   │       │   ├── feature-intl-pluralrules.json
│   │       │   ├── feature-intrinsic-width.json
│   │       │   ├── feature-jpeg2000.json
│   │       │   ├── feature-jpegxl.json
│   │       │   ├── feature-jpegxr.json
│   │       │   ├── feature-js-regexp-lookbehind.json
│   │       │   ├── feature-json.json
│   │       │   ├── feature-justify-content-space-evenly.json
│   │       │   ├── feature-kerning-pairs-ligatures.json
│   │       │   ├── feature-keyboardevent-charcode.json
│   │       │   ├── feature-keyboardevent-code.json
│   │       │   ├── feature-keyboardevent-getmodifierstate.json
│   │       │   ├── feature-keyboardevent-key.json
│   │       │   ├── feature-keyboardevent-location.json
│   │       │   ├── feature-keyboardevent-which.json
│   │       │   ├── feature-lazyload.json
│   │       │   ├── feature-let.json
│   │       │   ├── feature-link-icon-png.json
│   │       │   ├── feature-link-icon-svg.json
│   │       │   ├── feature-link-rel-dns-prefetch.json
│   │       │   ├── feature-link-rel-modulepreload.json
│   │       │   ├── feature-link-rel-preconnect.json
│   │       │   ├── feature-link-rel-prefetch.json
│   │       │   ├── feature-link-rel-preload.json
│   │       │   ├── feature-link-rel-prerender.json
│   │       │   ├── feature-loading-lazy-attr.json
│   │       │   ├── feature-localecompare.json
│   │       │   ├── feature-magnetometer.json
│   │       │   ├── feature-matchesselector.json
│   │       │   ├── feature-matchmedia.json
│   │       │   ├── feature-mathml.json
│   │       │   ├── feature-maxlength.json
│   │       │   ├── feature-media-fragments.json
│   │       │   ├── feature-mediacapture-fromelement.json
│   │       │   ├── feature-mediarecorder.json
│   │       │   ├── feature-mediasource.json
│   │       │   ├── feature-menu.json
│   │       │   ├── feature-meta-theme-color.json
│   │       │   ├── feature-meter.json
│   │       │   ├── feature-midi.json
│   │       │   ├── feature-minmaxwh.json
│   │       │   ├── feature-mp3.json
│   │       │   ├── feature-mpeg-dash.json
│   │       │   ├── feature-mpeg4.json
│   │       │   ├── feature-multibackgrounds.json
│   │       │   ├── feature-multicolumn.json
│   │       │   ├── feature-mutation-events.json
│   │       │   ├── feature-mutationobserver.json
│   │       │   ├── feature-namevalue-storage.json
│   │       │   ├── feature-native-filesystem-api.json
│   │       │   ├── feature-nav-timing.json
│   │       │   ├── feature-netinfo.json
│   │       │   ├── feature-notifications.json
│   │       │   ├── feature-object-entries.json
│   │       │   ├── feature-object-fit.json
│   │       │   ├── feature-object-observe.json
│   │       │   ├── feature-object-values.json
│   │       │   ├── feature-objectrtc.json
│   │       │   ├── feature-offline-apps.json
│   │       │   ├── feature-offscreencanvas.json
│   │       │   ├── feature-ogg-vorbis.json
│   │       │   ├── feature-ogv.json
│   │       │   ├── feature-ol-reversed.json
│   │       │   ├── feature-once-event-listener.json
│   │       │   ├── feature-online-status.json
│   │       │   ├── feature-opus.json
│   │       │   ├── feature-orientation-sensor.json
│   │       │   ├── feature-outline.json
│   │       │   ├── feature-pad-start-end.json
│   │       │   ├── feature-page-transition-events.json
│   │       │   ├── feature-pagevisibility.json
│   │       │   ├── feature-passive-event-listener.json
│   │       │   ├── feature-passkeys.json
│   │       │   ├── feature-path2d.json
│   │       │   ├── feature-payment-request.json
│   │       │   ├── feature-pdf-viewer.json
│   │       │   ├── feature-permissions-api.json
│   │       │   ├── feature-permissions-policy.json
│   │       │   ├── feature-picture-in-picture.json
│   │       │   ├── feature-picture.json
│   │       │   ├── feature-ping.json
│   │       │   ├── feature-png-alpha.json
│   │       │   ├── feature-pointer-events.json
│   │       │   ├── feature-pointer.json
│   │       │   ├── feature-pointerlock.json
│   │       │   ├── feature-portals.json
│   │       │   ├── feature-prefers-color-scheme.json
│   │       │   ├── feature-prefers-reduced-motion.json
│   │       │   ├── feature-progress.json
│   │       │   ├── feature-promise-finally.json
│   │       │   ├── feature-promises.json
│   │       │   ├── feature-proximity.json
│   │       │   ├── feature-proxy.json
│   │       │   ├── feature-publickeypinning.json
│   │       │   ├── feature-push-api.json
│   │       │   ├── feature-queryselector.json
│   │       │   ├── feature-readonly-attr.json
│   │       │   ├── feature-referrer-policy.json
│   │       │   ├── feature-registerprotocolhandler.json
│   │       │   ├── feature-rel-noopener.json
│   │       │   ├── feature-rel-noreferrer.json
│   │       │   ├── feature-rellist.json
│   │       │   ├── feature-rem.json
│   │       │   ├── feature-requestanimationframe.json
│   │       │   ├── feature-requestidlecallback.json
│   │       │   ├── feature-resizeobserver.json
│   │       │   ├── feature-resource-timing.json
│   │       │   ├── feature-rest-parameters.json
│   │       │   ├── feature-rtcpeerconnection.json
│   │       │   ├── feature-ruby.json
│   │       │   ├── feature-run-in.json
│   │       │   ├── feature-same-site-cookie-attribute.json
│   │       │   ├── feature-screen-orientation.json
│   │       │   ├── feature-script-async.json
│   │       │   ├── feature-script-defer.json
│   │       │   ├── feature-scrollintoview.json
│   │       │   ├── feature-scrollintoviewifneeded.json
│   │       │   ├── feature-sdch.json
│   │       │   ├── feature-selection-api.json
│   │       │   ├── feature-selectlist.json
│   │       │   ├── feature-server-timing.json
│   │       │   ├── feature-serviceworkers.json
│   │       │   ├── feature-setimmediate.json
│   │       │   ├── feature-shadowdom.json
│   │       │   ├── feature-shadowdomv1.json
│   │       │   ├── feature-sharedarraybuffer.json
│   │       │   ├── feature-sharedworkers.json
│   │       │   ├── feature-sni.json
│   │       │   ├── feature-spdy.json
│   │       │   ├── feature-speech-recognition.json
│   │       │   ├── feature-speech-synthesis.json
│   │       │   ├── feature-spellcheck-attribute.json
│   │       │   ├── feature-sql-storage.json
│   │       │   ├── feature-srcset.json
│   │       │   ├── feature-stream.json
│   │       │   ├── feature-streams.json
│   │       │   ├── feature-stricttransportsecurity.json
│   │       │   ├── feature-style-scoped.json
│   │       │   ├── feature-subresource-integrity.json
│   │       │   ├── feature-svg-css.json
│   │       │   ├── feature-svg-filters.json
│   │       │   ├── feature-svg-fonts.json
│   │       │   ├── feature-svg-fragment.json
│   │       │   ├── feature-svg-html.json
│   │       │   ├── feature-svg-html5.json
│   │       │   ├── feature-svg-img.json
│   │       │   ├── feature-svg-smil.json
│   │       │   ├── feature-svg.json
│   │       │   ├── feature-sxg.json
│   │       │   ├── feature-tabindex-attr.json
│   │       │   ├── feature-template-literals.json
│   │       │   ├── feature-template.json
│   │       │   ├── feature-temporal.json
│   │       │   ├── feature-text-decoration.json
│   │       │   ├── feature-text-emphasis.json
│   │       │   ├── feature-text-overflow.json
│   │       │   ├── feature-text-size-adjust.json
│   │       │   ├── feature-text-stroke.json
│   │       │   ├── feature-textcontent.json
│   │       │   ├── feature-textencoder.json
│   │       │   ├── feature-tls1-1.json
│   │       │   ├── feature-tls1-2.json
│   │       │   ├── feature-tls1-3.json
│   │       │   ├── feature-touch.json
│   │       │   ├── feature-transforms2d.json
│   │       │   ├── feature-transforms3d.json
│   │       │   ├── feature-trusted-types.json
│   │       │   ├── feature-ttf.json
│   │       │   ├── feature-typedarrays.json
│   │       │   ├── feature-u2f.json
│   │       │   ├── feature-unhandledrejection.json
│   │       │   ├── feature-upgradeinsecurerequests.json
│   │       │   ├── feature-url-scroll-to-text-fragment.json
│   │       │   ├── feature-url.json
│   │       │   ├── feature-urlsearchparams.json
│   │       │   ├── feature-use-strict.json
│   │       │   ├── feature-user-select-none.json
│   │       │   ├── feature-user-timing.json
│   │       │   ├── feature-variable-fonts.json
│   │       │   ├── feature-vector-effect.json
│   │       │   ├── feature-vibration.json
│   │       │   ├── feature-video.json
│   │       │   ├── feature-videotracks.json
│   │       │   ├── feature-view-transitions.json
│   │       │   ├── feature-viewport-unit-variants.json
│   │       │   ├── feature-viewport-units.json
│   │       │   ├── feature-wai-aria.json
│   │       │   ├── feature-wake-lock.json
│   │       │   ├── feature-wasm-bigint.json
│   │       │   ├── feature-wasm-bulk-memory.json
│   │       │   ├── feature-wasm-multi-value.json
│   │       │   ├── feature-wasm-mutable-globals.json
│   │       │   ├── feature-wasm-nontrapping-fptoint.json
│   │       │   ├── feature-wasm-reference-types.json
│   │       │   ├── feature-wasm-signext.json
│   │       │   ├── feature-wasm-simd.json
│   │       │   ├── feature-wasm-threads.json
│   │       │   ├── feature-wasm.json
│   │       │   ├── feature-wav.json
│   │       │   ├── feature-wbr-element.json
│   │       │   ├── feature-web-animation.json
│   │       │   ├── feature-web-bluetooth.json
│   │       │   ├── feature-web-serial.json
│   │       │   ├── feature-web-share.json
│   │       │   ├── feature-webauthn.json
│   │       │   ├── feature-webcodecs.json
│   │       │   ├── feature-webgl.json
│   │       │   ├── feature-webgl2.json
│   │       │   ├── feature-webgpu.json
│   │       │   ├── feature-webhid.json
│   │       │   ├── feature-webkit-user-drag.json
│   │       │   ├── feature-webm.json
│   │       │   ├── feature-webnfc.json
│   │       │   ├── feature-webp.json
│   │       │   ├── feature-websockets.json
│   │       │   ├── feature-webtransport.json
│   │       │   ├── feature-webusb.json
│   │       │   ├── feature-webvr.json
│   │       │   ├── feature-webvtt.json
│   │       │   ├── feature-webworkers.json
│   │       │   ├── feature-webxr.json
│   │       │   ├── feature-will-change.json
│   │       │   ├── feature-woff.json
│   │       │   ├── feature-woff2.json
│   │       │   ├── feature-word-break.json
│   │       │   ├── feature-wordwrap.json
│   │       │   ├── feature-x-doc-messaging.json
│   │       │   ├── feature-x-frame-options.json
│   │       │   ├── feature-xhr2.json
│   │       │   ├── feature-xhtml.json
│   │       │   ├── feature-xhtmlsmil.json
│   │       │   ├── feature-xml-serializer.json
│   │       │   └── feature-zstd.json
│   │       ├── caniuse.json
│   │       ├── fors.json
│   │       ├── github-issues.json
│   │       ├── headings/
│   │       │   ├── headings-accelerometer.json
│   │       │   ├── headings-accname-1.2.json
│   │       │   ├── headings-afgs1-spec.json
│   │       │   ├── headings-ambient-light.json
│   │       │   ├── headings-anchors.json
│   │       │   ├── headings-anonymous-iframe.json
│   │       │   ├── headings-appmanifest.json
│   │       │   ├── headings-at-driver.json
│   │       │   ├── headings-attribution-reporting-api.json
│   │       │   ├── headings-audio-output.json
│   │       │   ├── headings-audio-session.json
│   │       │   ├── headings-audiobooks.json
│   │       │   ├── headings-autoplay-detection.json
│   │       │   ├── headings-av1-avif.json
│   │       │   ├── headings-av1-hdr10plus.json
│   │       │   ├── headings-av1-isobmff.json
│   │       │   ├── headings-av1-mpeg2-ts.json
│   │       │   ├── headings-av1-rtp-spec.json
│   │       │   ├── headings-av1-spec.json
│   │       │   ├── headings-background-fetch.json
│   │       │   ├── headings-background-sync.json
│   │       │   ├── headings-badging.json
│   │       │   ├── headings-battery-status.json
│   │       │   ├── headings-beacon.json
│   │       │   ├── headings-capability-delegation.json
│   │       │   ├── headings-capture-handle-identity.json
│   │       │   ├── headings-captured-mouse-events.json
│   │       │   ├── headings-change-password-url.json
│   │       │   ├── headings-clear-site-data.json
│   │       │   ├── headings-client-hint-reliability.json
│   │       │   ├── headings-client-hints-infrastructure.json
│   │       │   ├── headings-clipboard-apis.json
│   │       │   ├── headings-compat.json
│   │       │   ├── headings-compositing-1.json
│   │       │   ├── headings-compositing-2.json
│   │       │   ├── headings-compression.json
│   │       │   ├── headings-compute-pressure.json
│   │       │   ├── headings-console.json
│   │       │   ├── headings-contact-picker.json
│   │       │   ├── headings-content-index.json
│   │       │   ├── headings-contenteditable.json
│   │       │   ├── headings-cookie-store.json
│   │       │   ├── headings-core-aam-1.2.json
│   │       │   ├── headings-crash-reporting.json
│   │       │   ├── headings-credential-management-1.json
│   │       │   ├── headings-csp-embedded-enforcement.json
│   │       │   ├── headings-csp-next.json
│   │       │   ├── headings-csp3.json
│   │       │   ├── headings-css-2022.json
│   │       │   ├── headings-css-2023.json
│   │       │   ├── headings-css-align-3.json
│   │       │   ├── headings-css-anchor-position-1.json
│   │       │   ├── headings-css-animation-worklet-1.json
│   │       │   ├── headings-css-animations-1.json
│   │       │   ├── headings-css-animations-2.json
│   │       │   ├── headings-css-backgrounds-3.json
│   │       │   ├── headings-css-backgrounds-4.json
│   │       │   ├── headings-css-borders-4.json
│   │       │   ├── headings-css-box-3.json
│   │       │   ├── headings-css-box-4.json
│   │       │   ├── headings-css-break-3.json
│   │       │   ├── headings-css-break-4.json
│   │       │   ├── headings-css-cascade-3.json
│   │       │   ├── headings-css-cascade-4.json
│   │       │   ├── headings-css-cascade-5.json
│   │       │   ├── headings-css-cascade-6.json
│   │       │   ├── headings-css-color-3.json
│   │       │   ├── headings-css-color-4.json
│   │       │   ├── headings-css-color-5.json
│   │       │   ├── headings-css-color-6.json
│   │       │   ├── headings-css-color-adjust-1.json
│   │       │   ├── headings-css-color-hdr.json
│   │       │   ├── headings-css-conditional-3.json
│   │       │   ├── headings-css-conditional-4.json
│   │       │   ├── headings-css-conditional-5.json
│   │       │   ├── headings-css-conditional-values-1.json
│   │       │   ├── headings-css-contain-1.json
│   │       │   ├── headings-css-contain-2.json
│   │       │   ├── headings-css-contain-3.json
│   │       │   ├── headings-css-content-3.json
│   │       │   ├── headings-css-counter-styles-3.json
│   │       │   ├── headings-css-display-3.json
│   │       │   ├── headings-css-display-4.json
│   │       │   ├── headings-css-easing-1.json
│   │       │   ├── headings-css-easing-2.json
│   │       │   ├── headings-css-env-1.json
│   │       │   ├── headings-css-extensions-1.json
│   │       │   ├── headings-css-flexbox-1.json
│   │       │   ├── headings-css-font-loading-3.json
│   │       │   ├── headings-css-fonts-4.json
│   │       │   ├── headings-css-fonts-5.json
│   │       │   ├── headings-css-forms-1.json
│   │       │   ├── headings-css-gcpm-3.json
│   │       │   ├── headings-css-gcpm-4.json
│   │       │   ├── headings-css-grid-1.json
│   │       │   ├── headings-css-grid-2.json
│   │       │   ├── headings-css-grid-3.json
│   │       │   ├── headings-css-highlight-api-1.json
│   │       │   ├── headings-css-images-3.json
│   │       │   ├── headings-css-images-4.json
│   │       │   ├── headings-css-images-5.json
│   │       │   ├── headings-css-inline-3.json
│   │       │   ├── headings-css-layout-api-1.json
│   │       │   ├── headings-css-line-grid-1.json
│   │       │   ├── headings-css-link-params-1.json
│   │       │   ├── headings-css-lists-3.json
│   │       │   ├── headings-css-logical-1.json
│   │       │   ├── headings-css-masking-1.json
│   │       │   ├── headings-css-mixins-1.json
│   │       │   ├── headings-css-multicol-1.json
│   │       │   ├── headings-css-multicol-2.json
│   │       │   ├── headings-css-namespaces-3.json
│   │       │   ├── headings-css-nav-1.json
│   │       │   ├── headings-css-nesting-1.json
│   │       │   ├── headings-css-overflow-3.json
│   │       │   ├── headings-css-overflow-4.json
│   │       │   ├── headings-css-overflow-5.json
│   │       │   ├── headings-css-overscroll-1.json
│   │       │   ├── headings-css-page-3.json
│   │       │   ├── headings-css-page-4.json
│   │       │   ├── headings-css-page-floats-3.json
│   │       │   ├── headings-css-paint-api-1.json
│   │       │   ├── headings-css-parser-api.json
│   │       │   ├── headings-css-position-3.json
│   │       │   ├── headings-css-position-4.json
│   │       │   ├── headings-css-properties-values-api-1.json
│   │       │   ├── headings-css-pseudo-4.json
│   │       │   ├── headings-css-regions-1.json
│   │       │   ├── headings-css-rhythm-1.json
│   │       │   ├── headings-css-round-display-1.json
│   │       │   ├── headings-css-ruby-1.json
│   │       │   ├── headings-css-scoping-1.json
│   │       │   ├── headings-css-scroll-anchoring-1.json
│   │       │   ├── headings-css-scroll-snap-1.json
│   │       │   ├── headings-css-scroll-snap-2.json
│   │       │   ├── headings-css-scrollbars-1.json
│   │       │   ├── headings-css-shadow-parts-1.json
│   │       │   ├── headings-css-shapes-1.json
│   │       │   ├── headings-css-shapes-2.json
│   │       │   ├── headings-css-size-adjust-1.json
│   │       │   ├── headings-css-sizing-3.json
│   │       │   ├── headings-css-sizing-4.json
│   │       │   ├── headings-css-speech-1.json
│   │       │   ├── headings-css-style-attr.json
│   │       │   ├── headings-css-syntax-3.json
│   │       │   ├── headings-css-tables-3.json
│   │       │   ├── headings-css-text-3.json
│   │       │   ├── headings-css-text-4.json
│   │       │   ├── headings-css-text-decor-3.json
│   │       │   ├── headings-css-text-decor-4.json
│   │       │   ├── headings-css-transforms-1.json
│   │       │   ├── headings-css-transforms-2.json
│   │       │   ├── headings-css-transitions-1.json
│   │       │   ├── headings-css-transitions-2.json
│   │       │   ├── headings-css-typed-om-1.json
│   │       │   ├── headings-css-typed-om-2.json
│   │       │   ├── headings-css-ui-3.json
│   │       │   ├── headings-css-ui-4.json
│   │       │   ├── headings-css-values-3.json
│   │       │   ├── headings-css-values-4.json
│   │       │   ├── headings-css-values-5.json
│   │       │   ├── headings-css-variables-1.json
│   │       │   ├── headings-css-variables-2.json
│   │       │   ├── headings-css-view-transitions-1.json
│   │       │   ├── headings-css-view-transitions-2.json
│   │       │   ├── headings-css-viewport-1.json
│   │       │   ├── headings-css-will-change-1.json
│   │       │   ├── headings-css-writing-modes-3.json
│   │       │   ├── headings-css-writing-modes-4.json
│   │       │   ├── headings-css2.json
│   │       │   ├── headings-css22.json
│   │       │   ├── headings-css3-exclusions.json
│   │       │   ├── headings-cssom-1.json
│   │       │   ├── headings-cssom-view-1.json
│   │       │   ├── headings-datacue.json
│   │       │   ├── headings-deprecation-reporting.json
│   │       │   ├── headings-device-attributes.json
│   │       │   ├── headings-device-memory-1.json
│   │       │   ├── headings-device-posture.json
│   │       │   ├── headings-digital-credentials.json
│   │       │   ├── headings-digital-goods.json
│   │       │   ├── headings-direct-sockets.json
│   │       │   ├── headings-document-picture-in-picture.json
│   │       │   ├── headings-document-policy.json
│   │       │   ├── headings-dom-level-2-style.json
│   │       │   ├── headings-dom-parsing.json
│   │       │   ├── headings-dom.json
│   │       │   ├── headings-dpub-aam-1.1.json
│   │       │   ├── headings-dpub-aria-1.1.json
│   │       │   ├── headings-ecma-402.json
│   │       │   ├── headings-ecmascript.json
│   │       │   ├── headings-edit-context.json
│   │       │   ├── headings-element-capture.json
│   │       │   ├── headings-element-timing.json
│   │       │   ├── headings-eme-hdcp-version-registry.json
│   │       │   ├── headings-eme-initdata-cenc.json
│   │       │   ├── headings-eme-initdata-keyids.json
│   │       │   ├── headings-eme-initdata-registry.json
│   │       │   ├── headings-eme-initdata-webm.json
│   │       │   ├── headings-eme-stream-mp4.json
│   │       │   ├── headings-eme-stream-registry.json
│   │       │   ├── headings-eme-stream-webm.json
│   │       │   ├── headings-encoding.json
│   │       │   ├── headings-encrypted-media-2.json
│   │       │   ├── headings-entries-api.json
│   │       │   ├── headings-epub-33.json
│   │       │   ├── headings-epub-rs-33.json
│   │       │   ├── headings-essl.json
│   │       │   ├── headings-event-timing.json
│   │       │   ├── headings-execcommand.json
│   │       │   ├── headings-eyedropper-api.json
│   │       │   ├── headings-fedcm-1.json
│   │       │   ├── headings-fenced-frame.json
│   │       │   ├── headings-fetch-metadata.json
│   │       │   ├── headings-fetch.json
│   │       │   ├── headings-fido-v2.1.json
│   │       │   ├── headings-file-system-access.json
│   │       │   ├── headings-fileapi.json
│   │       │   ├── headings-fill-stroke-3.json
│   │       │   ├── headings-filter-effects-1.json
│   │       │   ├── headings-filter-effects-2.json
│   │       │   ├── headings-fingerprinting-guidance.json
│   │       │   ├── headings-first-party-sets.json
│   │       │   ├── headings-font-metrics-api-1.json
│   │       │   ├── headings-fs.json
│   │       │   ├── headings-fullscreen.json
│   │       │   ├── headings-gamepad-extensions.json
│   │       │   ├── headings-gamepad.json
│   │       │   ├── headings-generic-sensor.json
│   │       │   ├── headings-geolocation-sensor.json
│   │       │   ├── headings-geolocation.json
│   │       │   ├── headings-geometry-1.json
│   │       │   ├── headings-get-installed-related-apps.json
│   │       │   ├── headings-gltf.json
│   │       │   ├── headings-gpc-spec.json
│   │       │   ├── headings-graphics-aam-1.0.json
│   │       │   ├── headings-graphics-aria-1.0.json
│   │       │   ├── headings-gyroscope.json
│   │       │   ├── headings-handwriting-recognition.json
│   │       │   ├── headings-hr-time-3.json
│   │       │   ├── headings-html-aam-1.0.json
│   │       │   ├── headings-html-aria.json
│   │       │   ├── headings-html-media-capture.json
│   │       │   ├── headings-html-ruby-extensions.json
│   │       │   ├── headings-html.json
│   │       │   ├── headings-i18n-glossary.json
│   │       │   ├── headings-idle-detection.json
│   │       │   ├── headings-ift.json
│   │       │   ├── headings-image-capture.json
│   │       │   ├── headings-image-resource.json
│   │       │   ├── headings-indexeddb-3.json
│   │       │   ├── headings-infra.json
│   │       │   ├── headings-ink-enhancement.json
│   │       │   ├── headings-input-device-capabilities.json
│   │       │   ├── headings-input-events-2.json
│   │       │   ├── headings-intersection-observer.json
│   │       │   ├── headings-intervention-reporting.json
│   │       │   ├── headings-is-input-pending.json
│   │       │   ├── headings-isolated-contexts.json
│   │       │   ├── headings-js-self-profiling.json
│   │       │   ├── headings-json-ld11-api.json
│   │       │   ├── headings-json-ld11-framing.json
│   │       │   ├── headings-json-ld11.json
│   │       │   ├── headings-keyboard-lock.json
│   │       │   ├── headings-keyboard-map.json
│   │       │   ├── headings-largest-contentful-paint.json
│   │       │   ├── headings-layout-instability.json
│   │       │   ├── headings-local-font-access.json
│   │       │   ├── headings-long-animation-frames.json
│   │       │   ├── headings-longtasks-1.json
│   │       │   ├── headings-magnetometer.json
│   │       │   ├── headings-managed-configuration.json
│   │       │   ├── headings-manifest-app-info.json
│   │       │   ├── headings-manifest-incubations.json
│   │       │   ├── headings-mathml-aam.json
│   │       │   ├── headings-mathml-core.json
│   │       │   ├── headings-mathml4.json
│   │       │   ├── headings-media-capabilities.json
│   │       │   ├── headings-media-feeds.json
│   │       │   ├── headings-media-playback-quality.json
│   │       │   ├── headings-media-source-2.json
│   │       │   ├── headings-mediacapture-automation.json
│   │       │   ├── headings-mediacapture-fromelement.json
│   │       │   ├── headings-mediacapture-handle-actions.json
│   │       │   ├── headings-mediacapture-region.json
│   │       │   ├── headings-mediacapture-streams.json
│   │       │   ├── headings-mediacapture-transform.json
│   │       │   ├── headings-mediacapture-viewport.json
│   │       │   ├── headings-mediaqueries-3.json
│   │       │   ├── headings-mediaqueries-4.json
│   │       │   ├── headings-mediaqueries-5.json
│   │       │   ├── headings-mediasession.json
│   │       │   ├── headings-mediastream-recording.json
│   │       │   ├── headings-mimesniff.json
│   │       │   ├── headings-miniapp-lifecycle.json
│   │       │   ├── headings-miniapp-manifest.json
│   │       │   ├── headings-miniapp-packaging.json
│   │       │   ├── headings-mixed-content.json
│   │       │   ├── headings-model-element.json
│   │       │   ├── headings-motion-1.json
│   │       │   ├── headings-mse-byte-stream-format-isobmff.json
│   │       │   ├── headings-mse-byte-stream-format-mp2t.json
│   │       │   ├── headings-mse-byte-stream-format-mpeg-audio.json
│   │       │   ├── headings-mse-byte-stream-format-registry.json
│   │       │   ├── headings-mse-byte-stream-format-webm.json
│   │       │   ├── headings-mst-content-hint.json
│   │       │   ├── headings-n-quads.json
│   │       │   ├── headings-nav-tracking-mitigations.json
│   │       │   ├── headings-navigation-timing-2.json
│   │       │   ├── headings-netinfo.json
│   │       │   ├── headings-network-error-logging.json
│   │       │   ├── headings-network-reporting.json
│   │       │   ├── headings-notifications.json
│   │       │   ├── headings-observable.json
│   │       │   ├── headings-openscreenprotocol.json
│   │       │   ├── headings-orientation-event.json
│   │       │   ├── headings-orientation-sensor.json
│   │       │   ├── headings-overscroll-scrollend-events.json
│   │       │   ├── headings-page-lifecycle.json
│   │       │   ├── headings-paint-timing.json
│   │       │   ├── headings-partitioned-cookies.json
│   │       │   ├── headings-passkey-endpoints.json
│   │       │   ├── headings-payment-handler.json
│   │       │   ├── headings-payment-method-id.json
│   │       │   ├── headings-payment-method-manifest.json
│   │       │   ├── headings-payment-request.json
│   │       │   ├── headings-performance-measure-memory.json
│   │       │   ├── headings-performance-timeline.json
│   │       │   ├── headings-periodic-background-sync.json
│   │       │   ├── headings-permissions-policy-1.json
│   │       │   ├── headings-permissions-registry.json
│   │       │   ├── headings-permissions-request.json
│   │       │   ├── headings-permissions-revoke.json
│   │       │   ├── headings-permissions.json
│   │       │   ├── headings-picture-in-picture.json
│   │       │   ├── headings-png-3.json
│   │       │   ├── headings-pointerevents3.json
│   │       │   ├── headings-pointerlock-2.json
│   │       │   ├── headings-portals.json
│   │       │   ├── headings-prefer-current-tab.json
│   │       │   ├── headings-prefetch.json
│   │       │   ├── headings-prerendering-revamped.json
│   │       │   ├── headings-presentation-api.json
│   │       │   ├── headings-private-aggregation-api.json
│   │       │   ├── headings-private-click-measurement.json
│   │       │   ├── headings-private-network-access.json
│   │       │   ├── headings-promises-guide.json
│   │       │   ├── headings-proximity.json
│   │       │   ├── headings-pub-manifest.json
│   │       │   ├── headings-push-api.json
│   │       │   ├── headings-quirks.json
│   │       │   ├── headings-raw-camera-access.json
│   │       │   ├── headings-rdf-canon.json
│   │       │   ├── headings-rdf12-concepts.json
│   │       │   ├── headings-rdf12-n-quads.json
│   │       │   ├── headings-rdf12-n-triples.json
│   │       │   ├── headings-rdf12-schema.json
│   │       │   ├── headings-rdf12-semantics.json
│   │       │   ├── headings-rdf12-trig.json
│   │       │   ├── headings-rdf12-turtle.json
│   │       │   ├── headings-rdf12-xml.json
│   │       │   ├── headings-real-world-meshing.json
│   │       │   ├── headings-referrer-policy.json
│   │       │   ├── headings-remote-playback.json
│   │       │   ├── headings-reporting-1.json
│   │       │   ├── headings-requestidlecallback.json
│   │       │   ├── headings-requeststorageaccessfor.json
│   │       │   ├── headings-resize-observer-1.json
│   │       │   ├── headings-resource-timing.json
│   │       │   ├── headings-responsive-image-client-hints.json
│   │       │   ├── headings-rfc6265.json
│   │       │   ├── headings-rfc6265bis.json
│   │       │   ├── headings-rfc6266.json
│   │       │   ├── headings-rfc7230.json
│   │       │   ├── headings-rfc7231.json
│   │       │   ├── headings-rfc7232.json
│   │       │   ├── headings-rfc7233.json
│   │       │   ├── headings-rfc7234.json
│   │       │   ├── headings-rfc7235.json
│   │       │   ├── headings-rfc7616.json
│   │       │   ├── headings-rfc7617.json
│   │       │   ├── headings-rfc7725.json
│   │       │   ├── headings-rfc7838.json
│   │       │   ├── headings-rfc8246.json
│   │       │   ├── headings-rfc8288.json
│   │       │   ├── headings-rfc8297.json
│   │       │   ├── headings-rfc8470.json
│   │       │   ├── headings-rfc8878.json
│   │       │   ├── headings-rfc8942.json
│   │       │   ├── headings-rfc9110.json
│   │       │   ├── headings-rfc9111.json
│   │       │   ├── headings-rfc9112.json
│   │       │   ├── headings-rfc9113.json
│   │       │   ├── headings-rfc9114.json
│   │       │   ├── headings-rfc9163.json
│   │       │   ├── headings-rfc9218.json
│   │       │   ├── headings-rfc9530.json
│   │       │   ├── headings-saa-non-cookie-storage.json
│   │       │   ├── headings-sanitizer-api.json
│   │       │   ├── headings-savedata.json
│   │       │   ├── headings-scheduling-apis.json
│   │       │   ├── headings-screen-capture.json
│   │       │   ├── headings-screen-orientation.json
│   │       │   ├── headings-screen-wake-lock.json
│   │       │   ├── headings-scroll-animations-1.json
│   │       │   ├── headings-scroll-to-text-fragment.json
│   │       │   ├── headings-secure-contexts.json
│   │       │   ├── headings-secure-payment-confirmation.json
│   │       │   ├── headings-selection-api.json
│   │       │   ├── headings-selectors-3.json
│   │       │   ├── headings-selectors-4.json
│   │       │   ├── headings-selectors-5.json
│   │       │   ├── headings-selectors-nonelement-1.json
│   │       │   ├── headings-serial.json
│   │       │   ├── headings-server-timing.json
│   │       │   ├── headings-service-workers.json
│   │       │   ├── headings-shape-detection-api.json
│   │       │   ├── headings-shared-storage.json
│   │       │   ├── headings-sms-one-time-codes.json
│   │       │   ├── headings-soft-navigations.json
│   │       │   ├── headings-sourcemap.json
│   │       │   ├── headings-sparql12-concepts.json
│   │       │   ├── headings-sparql12-entailment.json
│   │       │   ├── headings-sparql12-federated-query.json
│   │       │   ├── headings-sparql12-graph-store-protocol.json
│   │       │   ├── headings-sparql12-protocol.json
│   │       │   ├── headings-sparql12-query.json
│   │       │   ├── headings-sparql12-results-csv-tsv.json
│   │       │   ├── headings-sparql12-results-json.json
│   │       │   ├── headings-sparql12-results-xml.json
│   │       │   ├── headings-sparql12-service-description.json
│   │       │   ├── headings-sparql12-update.json
│   │       │   ├── headings-speculation-rules.json
│   │       │   ├── headings-speech-api.json
│   │       │   ├── headings-sri.json
│   │       │   ├── headings-storage-access.json
│   │       │   ├── headings-storage-buckets.json
│   │       │   ├── headings-storage.json
│   │       │   ├── headings-streams.json
│   │       │   ├── headings-svg-aam-1.0.json
│   │       │   ├── headings-svg-animations.json
│   │       │   ├── headings-svg-integration.json
│   │       │   ├── headings-svg-strokes.json
│   │       │   ├── headings-svg11.json
│   │       │   ├── headings-svg2.json
│   │       │   ├── headings-tc39-array-from-async.json
│   │       │   ├── headings-tc39-arraybuffer-base64.json
│   │       │   ├── headings-tc39-async-explicit-resource-management.json
│   │       │   ├── headings-tc39-canonical-tz.json
│   │       │   ├── headings-tc39-decorators.json
│   │       │   ├── headings-tc39-dynamic-code-brand-checks.json
│   │       │   ├── headings-tc39-explicit-resource-management.json
│   │       │   ├── headings-tc39-float16array.json
│   │       │   ├── headings-tc39-import-attributes.json
│   │       │   ├── headings-tc39-intl-duration-format.json
│   │       │   ├── headings-tc39-intl-locale-info.json
│   │       │   ├── headings-tc39-iterator-helpers.json
│   │       │   ├── headings-tc39-json-modules.json
│   │       │   ├── headings-tc39-json-parse-with-source.json
│   │       │   ├── headings-tc39-promise-try.json
│   │       │   ├── headings-tc39-regex-escaping.json
│   │       │   ├── headings-tc39-regexp-modifiers.json
│   │       │   ├── headings-tc39-set-methods.json
│   │       │   ├── headings-tc39-shadowrealm.json
│   │       │   ├── headings-tc39-source-phase-imports.json
│   │       │   ├── headings-tc39-temporal.json
│   │       │   ├── headings-test-methodology.json
│   │       │   ├── headings-testutils.json
│   │       │   ├── headings-text-detection-api.json
│   │       │   ├── headings-timing-entrytypes-registry.json
│   │       │   ├── headings-topics.json
│   │       │   ├── headings-touch-events.json
│   │       │   ├── headings-tracking-dnt.json
│   │       │   ├── headings-trust-token-api.json
│   │       │   ├── headings-trusted-types.json
│   │       │   ├── headings-turtledove.json
│   │       │   ├── headings-ua-client-hints.json
│   │       │   ├── headings-uievents-code.json
│   │       │   ├── headings-uievents-key.json
│   │       │   ├── headings-uievents.json
│   │       │   ├── headings-upgrade-insecure-requests.json
│   │       │   ├── headings-url.json
│   │       │   ├── headings-urlpattern.json
│   │       │   ├── headings-user-preference-media-features-headers.json
│   │       │   ├── headings-user-timing.json
│   │       │   ├── headings-vc-data-integrity.json
│   │       │   ├── headings-vc-data-model-2.0.json
│   │       │   ├── headings-vibration.json
│   │       │   ├── headings-video-rvfc.json
│   │       │   ├── headings-virtual-keyboard.json
│   │       │   ├── headings-w3c-patent-policy.json
│   │       │   ├── headings-w3c-process.json
│   │       │   ├── headings-wai-aria-1.2.json
│   │       │   ├── headings-wai-aria-1.3.json
│   │       │   ├── headings-wasm-core-2.json
│   │       │   ├── headings-wasm-js-api-2.json
│   │       │   ├── headings-wasm-web-api-2.json
│   │       │   ├── headings-web-animations-1.json
│   │       │   ├── headings-web-animations-2.json
│   │       │   ├── headings-web-app-launch.json
│   │       │   ├── headings-web-bluetooth-scanning.json
│   │       │   ├── headings-web-bluetooth.json
│   │       │   ├── headings-web-locks.json
│   │       │   ├── headings-web-nfc.json
│   │       │   ├── headings-web-otp.json
│   │       │   ├── headings-web-preferences-api.json
│   │       │   ├── headings-web-share-target.json
│   │       │   ├── headings-web-share.json
│   │       │   ├── headings-web-smart-card.json
│   │       │   ├── headings-webaudio.json
│   │       │   ├── headings-webauthn-3.json
│   │       │   ├── headings-webcodecs-aac-codec-registration.json
│   │       │   ├── headings-webcodecs-alaw-codec-registration.json
│   │       │   ├── headings-webcodecs-av1-codec-registration.json
│   │       │   ├── headings-webcodecs-avc-codec-registration.json
│   │       │   ├── headings-webcodecs-codec-registry.json
│   │       │   ├── headings-webcodecs-flac-codec-registration.json
│   │       │   ├── headings-webcodecs-hevc-codec-registration.json
│   │       │   ├── headings-webcodecs-mp3-codec-registration.json
│   │       │   ├── headings-webcodecs-opus-codec-registration.json
│   │       │   ├── headings-webcodecs-pcm-codec-registration.json
│   │       │   ├── headings-webcodecs-ulaw-codec-registration.json
│   │       │   ├── headings-webcodecs-video-frame-metadata-registry.json
│   │       │   ├── headings-webcodecs-vorbis-codec-registration.json
│   │       │   ├── headings-webcodecs-vp8-codec-registration.json
│   │       │   ├── headings-webcodecs-vp9-codec-registration.json
│   │       │   ├── headings-webcodecs.json
│   │       │   ├── headings-webcrypto-secure-curves.json
│   │       │   ├── headings-webcryptoapi.json
│   │       │   ├── headings-webdriver-bidi.json
│   │       │   ├── headings-webdriver2.json
│   │       │   ├── headings-webgl1.json
│   │       │   ├── headings-webgl2.json
│   │       │   ├── headings-webgpu.json
│   │       │   ├── headings-webhid.json
│   │       │   ├── headings-webidl.json
│   │       │   ├── headings-webmidi.json
│   │       │   ├── headings-webnn.json
│   │       │   ├── headings-webp.json
│   │       │   ├── headings-webpackage.json
│   │       │   ├── headings-webrtc-encoded-transform.json
│   │       │   ├── headings-webrtc-ice.json
│   │       │   ├── headings-webrtc-identity.json
│   │       │   ├── headings-webrtc-priority.json
│   │       │   ├── headings-webrtc-stats.json
│   │       │   ├── headings-webrtc-svc.json
│   │       │   ├── headings-webrtc.json
│   │       │   ├── headings-websockets.json
│   │       │   ├── headings-webtransport.json
│   │       │   ├── headings-webusb.json
│   │       │   ├── headings-webvtt1.json
│   │       │   ├── headings-webxr-ar-module-1.json
│   │       │   ├── headings-webxr-depth-sensing-1.json
│   │       │   ├── headings-webxr-dom-overlays-1.json
│   │       │   ├── headings-webxr-gamepads-module-1.json
│   │       │   ├── headings-webxr-hand-input-1.json
│   │       │   ├── headings-webxr-hit-test-1.json
│   │       │   ├── headings-webxr-lighting-estimation-1.json
│   │       │   ├── headings-webxr-meshing.json
│   │       │   ├── headings-webxr-plane-detection.json
│   │       │   ├── headings-webxr.json
│   │       │   ├── headings-webxrlayers-1.json
│   │       │   ├── headings-wgsl.json
│   │       │   ├── headings-window-controls-overlay.json
│   │       │   ├── headings-window-management.json
│   │       │   ├── headings-woff.json
│   │       │   ├── headings-woff2.json
│   │       │   └── headings-xhr.json
│   │       ├── languages.json
│   │       ├── link-defaults.infotree
│   │       ├── manifest.txt
│   │       ├── mdn/
│   │       │   ├── accelerometer.json
│   │       │   ├── ambient-light.json
│   │       │   ├── appmanifest.json
│   │       │   ├── aria.json
│   │       │   ├── audio-output.json
│   │       │   ├── autoplay.json
│   │       │   ├── background-fetch.json
│   │       │   ├── background-sync.json
│   │       │   ├── badging.json
│   │       │   ├── battery.json
│   │       │   ├── beacon.json
│   │       │   ├── clear-site-data.json
│   │       │   ├── clipboard-apis.json
│   │       │   ├── compat.json
│   │       │   ├── compositing.json
│   │       │   ├── compression.json
│   │       │   ├── console.json
│   │       │   ├── contact-api.json
│   │       │   ├── contact-picker.json
│   │       │   ├── content-index.json
│   │       │   ├── controls-list.json
│   │       │   ├── cookie-store.json
│   │       │   ├── crash-reporting.json
│   │       │   ├── credential-management.json
│   │       │   ├── csp-embedded-enforcement.json
│   │       │   ├── csp.json
│   │       │   ├── css-align.json
│   │       │   ├── css-animations-2.json
│   │       │   ├── css-animations.json
│   │       │   ├── css-backgrounds-4.json
│   │       │   ├── css-backgrounds.json
│   │       │   ├── css-box-4.json
│   │       │   ├── css-box.json
│   │       │   ├── css-break.json
│   │       │   ├── css-cascade-5.json
│   │       │   ├── css-cascade.json
│   │       │   ├── css-color-5.json
│   │       │   ├── css-color-6.json
│   │       │   ├── css-color-adjust.json
│   │       │   ├── css-color.json
│   │       │   ├── css-conditional-3.json
│   │       │   ├── css-conditional-4.json
│   │       │   ├── css-contain-3.json
│   │       │   ├── css-contain.json
│   │       │   ├── css-content.json
│   │       │   ├── css-counter-styles.json
│   │       │   ├── css-display.json
│   │       │   ├── css-easing.json
│   │       │   ├── css-env.json
│   │       │   ├── css-flexbox.json
│   │       │   ├── css-font-loading.json
│   │       │   ├── css-fonts-5.json
│   │       │   ├── css-fonts.json
│   │       │   ├── css-grid-3.json
│   │       │   ├── css-grid.json
│   │       │   ├── css-highlight-api.json
│   │       │   ├── css-images-4.json
│   │       │   ├── css-images.json
│   │       │   ├── css-inline.json
│   │       │   ├── css-lists.json
│   │       │   ├── css-logical.json
│   │       │   ├── css-masking.json
│   │       │   ├── css-mediaqueries.json
│   │       │   ├── css-multicol.json
│   │       │   ├── css-namespaces.json
│   │       │   ├── css-nesting.json
│   │       │   ├── css-overflow-4.json
│   │       │   ├── css-overflow.json
│   │       │   ├── css-overscroll.json
│   │       │   ├── css-page.json
│   │       │   ├── css-paint-api.json
│   │       │   ├── css-position-4.json
│   │       │   ├── css-position.json
│   │       │   ├── css-properties-values-api.json
│   │       │   ├── css-pseudo.json
│   │       │   ├── css-regions.json
│   │       │   ├── css-rhythm.json
│   │       │   ├── css-ruby.json
│   │       │   ├── css-scoping.json
│   │       │   ├── css-scroll-anchoring.json
│   │       │   ├── css-scroll-snap.json
│   │       │   ├── css-scrollbars.json
│   │       │   ├── css-shadow-parts.json
│   │       │   ├── css-shapes.json
│   │       │   ├── css-size-adjust.json
│   │       │   ├── css-sizing-3.json
│   │       │   ├── css-sizing-4.json
│   │       │   ├── css-text-4.json
│   │       │   ├── css-text-decor-4.json
│   │       │   ├── css-text-decor.json
│   │       │   ├── css-text.json
│   │       │   ├── css-transforms-2.json
│   │       │   ├── css-transforms.json
│   │       │   ├── css-transitions-2.json
│   │       │   ├── css-transitions.json
│   │       │   ├── css-typed-om.json
│   │       │   ├── css-ui.json
│   │       │   ├── css-values-5.json
│   │       │   ├── css-values.json
│   │       │   ├── css-variables.json
│   │       │   ├── css-view-transitions.json
│   │       │   ├── css-will-change.json
│   │       │   ├── css-writing-modes.json
│   │       │   ├── css2.json
│   │       │   ├── cssom-view.json
│   │       │   ├── cssom.json
│   │       │   ├── custom-state-pseudo-class.json
│   │       │   ├── deprecation-reporting.json
│   │       │   ├── dom-parsing.json
│   │       │   ├── dom.json
│   │       │   ├── draft-ietf-httpbis-rfc6265bis.json
│   │       │   ├── ecma-402.json
│   │       │   ├── ecmascript.json
│   │       │   ├── element-timing.json
│   │       │   ├── encoding.json
│   │       │   ├── encrypted-media.json
│   │       │   ├── entries-api.json
│   │       │   ├── event-timing.json
│   │       │   ├── eyedropper-api.json
│   │       │   ├── fedcm.json
│   │       │   ├── fetch-metadata.json
│   │       │   ├── fetch.json
│   │       │   ├── file-system-access.json
│   │       │   ├── file-system.json
│   │       │   ├── fileapi.json
│   │       │   ├── filter-effects-2.json
│   │       │   ├── filter-effects.json
│   │       │   ├── fullscreen.json
│   │       │   ├── gamepad-extensions.json
│   │       │   ├── gamepad.json
│   │       │   ├── generic-sensor.json
│   │       │   ├── geolocation-api.json
│   │       │   ├── geometry.json
│   │       │   ├── gpc.json
│   │       │   ├── gyroscope.json
│   │       │   ├── hr-time.json
│   │       │   ├── html-media-capture.json
│   │       │   ├── html.json
│   │       │   ├── idle-detection.json
│   │       │   ├── image-capture.json
│   │       │   ├── indexeddb.json
│   │       │   ├── input-device-capabilities.json
│   │       │   ├── input-events.json
│   │       │   ├── intersection-observer.json
│   │       │   ├── intervention-reporting.json
│   │       │   ├── keyboard-lock.json
│   │       │   ├── keyboard-map.json
│   │       │   ├── largest-contentful-paint.json
│   │       │   ├── layout-instability.json
│   │       │   ├── local-font-access.json
│   │       │   ├── longtasks.json
│   │       │   ├── magnetometer.json
│   │       │   ├── manifest-app-info.json
│   │       │   ├── manifest-incubations.json
│   │       │   ├── mathml.json
│   │       │   ├── media-capabilities.json
│   │       │   ├── media-playback-quality.json
│   │       │   ├── media-source.json
│   │       │   ├── mediacapture-fromelement.json
│   │       │   ├── mediacapture-screen-share.json
│   │       │   ├── mediacapture-streams.json
│   │       │   ├── mediacapture-transform.json
│   │       │   ├── mediaqueries-5.json
│   │       │   ├── mediasession.json
│   │       │   ├── mediastream-recording.json
│   │       │   ├── motion.json
│   │       │   ├── navigation-timing.json
│   │       │   ├── netinfo.json
│   │       │   ├── network-error-logging.json
│   │       │   ├── notifications.json
│   │       │   ├── numberformat.json
│   │       │   ├── orientation-event.json
│   │       │   ├── orientation-sensor.json
│   │       │   ├── page-lifecycle.json
│   │       │   ├── paint-timing.json
│   │       │   ├── payment-handler.json
│   │       │   ├── payment-request.json
│   │       │   ├── performance-measure-memory.json
│   │       │   ├── performance-timeline.json
│   │       │   ├── periodic-background-sync.json
│   │       │   ├── permissions-policy.json
│   │       │   ├── permissions.json
│   │       │   ├── picture-in-picture.json
│   │       │   ├── pluralrules.json
│   │       │   ├── pointerevents.json
│   │       │   ├── pointerlock.json
│   │       │   ├── portals.json
│   │       │   ├── presentation-api.json
│   │       │   ├── priority-hints.json
│   │       │   ├── proposal-array-from-async.json
│   │       │   ├── proposal-array-grouping.json
│   │       │   ├── proposal-atomics-wait-async.json
│   │       │   ├── proposal-intl-duration-format
│   │       │   ├── proposal-intl-enumeration.json
│   │       │   ├── proposal-intl-locale-info.json
│   │       │   ├── proposal-is-usv-string.json
│   │       │   ├── proposal-regexp-legacy-features.json
│   │       │   ├── proposal-resizablearraybuffer.json
│   │       │   ├── push-api.json
│   │       │   ├── referrer-policy.json
│   │       │   ├── remote-playback.json
│   │       │   ├── reporting.json
│   │       │   ├── requestidlecallback.json
│   │       │   ├── resize-observer.json
│   │       │   ├── resource-timing.json
│   │       │   ├── rfc2397.json
│   │       │   ├── rfc6265.json
│   │       │   ├── rfc6266.json
│   │       │   ├── rfc6454.json
│   │       │   ├── rfc6797.json
│   │       │   ├── rfc7239.json
│   │       │   ├── rfc7578.json
│   │       │   ├── rfc7838.json
│   │       │   ├── rfc8246.json
│   │       │   ├── rfc8288.json
│   │       │   ├── rfc8942.json
│   │       │   ├── rfc9110.json
│   │       │   ├── rfc9111.json
│   │       │   ├── rfc9112.json
│   │       │   ├── rfc9113.json
│   │       │   ├── sanitizer.json
│   │       │   ├── savedata.json
│   │       │   ├── scheduling-apis.json
│   │       │   ├── screen-orientation.json
│   │       │   ├── screen-wake-lock.json
│   │       │   ├── scroll-animations.json
│   │       │   ├── scroll-to-text-fragment.json
│   │       │   ├── selection-api.json
│   │       │   ├── selectors.json
│   │       │   ├── serial.json
│   │       │   ├── server-timing.json
│   │       │   ├── service-workers.json
│   │       │   ├── shape-detection-api.json
│   │       │   ├── sourcemaps.json
│   │       │   ├── speech-api.json
│   │       │   ├── storage-access.json
│   │       │   ├── storage.json
│   │       │   ├── streams.json
│   │       │   ├── subresource-integrity.json
│   │       │   ├── svg-animations.json
│   │       │   ├── svg.json
│   │       │   ├── touch-events.json
│   │       │   ├── trusted-types.json
│   │       │   ├── ua-client-hints.json
│   │       │   ├── uievents.json
│   │       │   ├── upgrade-insecure-requests.json
│   │       │   ├── url.json
│   │       │   ├── urlpattern.json
│   │       │   ├── user-preference-media-features-headers.json
│   │       │   ├── user-timing.json
│   │       │   ├── vibration.json
│   │       │   ├── wasm-exception-handling.json
│   │       │   ├── wasm-js-api.json
│   │       │   ├── wasm-web-embedding.json
│   │       │   ├── web-animations-2.json
│   │       │   ├── web-animations.json
│   │       │   ├── web-app-launch.json
│   │       │   ├── web-bluetooth.json
│   │       │   ├── web-locks.json
│   │       │   ├── web-nfc.json
│   │       │   ├── web-otp.json
│   │       │   ├── web-share-target.json
│   │       │   ├── web-share.json
│   │       │   ├── webaudio.json
│   │       │   ├── webauthn.json
│   │       │   ├── webcodecs.json
│   │       │   ├── webcrypto.json
│   │       │   ├── webdriver.json
│   │       │   ├── webgl-1.json
│   │       │   ├── webgl-2.json
│   │       │   ├── webgpu.json
│   │       │   ├── webhid.json
│   │       │   ├── webidl.json
│   │       │   ├── webmidi.json
│   │       │   ├── webrtc-extensions.json
│   │       │   ├── webrtc-identity.json
│   │       │   ├── webrtc-priority.json
│   │       │   ├── webrtc-stats.json
│   │       │   ├── webrtc.json
│   │       │   ├── websockets.json
│   │       │   ├── webtransport.json
│   │       │   ├── webusb.json
│   │       │   ├── webvtt.json
│   │       │   ├── webxr-anchors.json
│   │       │   ├── webxr-ar.json
│   │       │   ├── webxr-depth-sensing.json
│   │       │   ├── webxr-dom-overlays.json
│   │       │   ├── webxr-gamepads.json
│   │       │   ├── webxr-hand-input.json
│   │       │   ├── webxr-hit-test.json
│   │       │   ├── webxr-layers.json
│   │       │   ├── webxr-lighting-estimation.json
│   │       │   ├── webxr.json
│   │       │   ├── window-controls-overlay.json
│   │       │   ├── woff.json
│   │       │   ├── woff2.json
│   │       │   └── xhr.json
│   │       ├── mdn.json
│   │       ├── methods.json
│   │       ├── specs.json
│   │       ├── test-suites.json
│   │       ├── version.txt
│   │       └── wpt-tests.txt
│   ├── stringEnum/
│   │   ├── __init__.py
│   │   └── stringenum.py
│   ├── stylescript/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── autolinks.css
│   │   ├── cddl-highlighting.css
│   │   ├── colors.css
│   │   ├── counters.css
│   │   ├── dom-helper.js
│   │   ├── domintro.css
│   │   ├── expires.js
│   │   ├── hidedel.css
│   │   ├── idl-highlighting.css
│   │   ├── issues.css
│   │   ├── link-titles.js
│   │   ├── manager.py
│   │   ├── md-lists.css
│   │   ├── position-annos.js
│   │   ├── railroad.css
│   │   ├── selflinks.css
│   │   ├── var-click-highlighting.css
│   │   └── var-click-highlighting.js
│   ├── t.py
│   ├── template/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── minimal.bs
│   │   ├── spec.bs
│   │   ├── test.bs
│   │   └── wpt.html
│   ├── test.py
│   ├── translate/
│   │   ├── __init__.py
│   │   ├── messages.po
│   │   └── translate.py
│   ├── unsortedJunk.py
│   ├── update/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── manifest.py
│   │   ├── mode.py
│   │   ├── updateBackRefs.py
│   │   ├── updateBiblio.py
│   │   ├── updateBoilerplates.py
│   │   ├── updateCanIUse.py
│   │   ├── updateCrossRefs.py
│   │   ├── updateLanguages.py
│   │   ├── updateLinkDefaults.py
│   │   ├── updateMdn.py
│   │   └── updateWpt.py
│   └── wpt/
│       ├── __init__.py
│       ├── wpt.css
│       ├── wpt.js
│       └── wptElement.py
├── bikeshed.py
├── docs/
│   ├── CONTRIBUTING.md
│   ├── index.bs
│   └── quick-start.md
├── emacs/
│   └── bikeshed.el
├── lint
├── mypy.ini
├── package.json
├── playwright.config.js
├── pyproject.toml
├── release.py
├── requirements-dev.txt
├── requirements.txt
├── setup.py
└── tests/
    ├── README.md
    ├── abstract001.bs
    ├── abstract001.console.txt
    ├── abstract001.html
    ├── adjacent-boilerplate/
    │   ├── adjacent-boilerplate.bs
    │   ├── adjacent-boilerplate.console.txt
    │   ├── adjacent-boilerplate.html
    │   ├── anchors.bsdata
    │   ├── defaults.include
    │   ├── link-defaults.infotree
    │   └── status-LS.include
    ├── advisement001.bs
    ├── advisement001.console.txt
    ├── advisement001.html
    ├── algorithm001.bs
    ├── algorithm001.console.txt
    ├── algorithm001.html
    ├── basic001.bs
    ├── basic001.console.txt
    ├── basic001.html
    ├── biblio001.bs
    ├── biblio001.console.txt
    ├── biblio001.html
    ├── biblio002.bs
    ├── biblio002.console.txt
    ├── biblio002.html
    ├── biblio003.bs
    ├── biblio003.console.txt
    ├── biblio003.html
    ├── biblio004.bs
    ├── biblio004.console.txt
    ├── biblio004.html
    ├── biblio005.bs
    ├── biblio005.console.txt
    ├── biblio005.html
    ├── biblio006.bs
    ├── biblio006.console.txt
    ├── biblio006.html
    ├── biblio007.bs
    ├── biblio007.console.txt
    ├── biblio007.html
    ├── boilerplate-substitution001.bs
    ├── boilerplate-substitution001.console.txt
    ├── boilerplate-substitution001.html
    ├── caniuse001.bs
    ├── caniuse001.console.txt
    ├── caniuse001.html
    ├── caniuse001_pwtest.js
    ├── cddl001.bs
    ├── cddl001.console.txt
    ├── cddl001.html
    ├── cddl002.bs
    ├── cddl002.console.txt
    ├── cddl002.html
    ├── cddl003.bs
    ├── cddl003.console.txt
    ├── cddl003.html
    ├── cddl004.bs
    ├── cddl004.console.txt
    ├── cddl004.html
    ├── cddl005.bs
    ├── cddl005.console.txt
    ├── cddl005.html
    ├── comments001.bs
    ├── comments001.console.txt
    ├── comments001.html
    ├── conditional001.bs
    ├── conditional001.console.txt
    ├── conditional001.html
    ├── conditional002.bs
    ├── conditional002.console.txt
    ├── conditional002.html
    ├── conditional003.bs
    ├── conditional003.console.txt
    ├── conditional003.html
    ├── css-production-range001.bs
    ├── css-production-range001.console.txt
    ├── css-production-range001.html
    ├── datablocks001.bs
    ├── datablocks001.console.txt
    ├── datablocks001.html
    ├── dfn-inference001.bs
    ├── dfn-inference001.console.txt
    ├── dfn-inference001.html
    ├── dfn-inference002.bs
    ├── dfn-inference002.console.txt
    ├── dfn-inference002.html
    ├── dict-type.bs
    ├── dict-type.console.txt
    ├── dict-type.html
    ├── elementdef001.bs
    ├── elementdef001.console.txt
    ├── elementdef001.html
    ├── elementdef001_pwtest.js
    ├── escapes001.bs
    ├── escapes001.console.txt
    ├── escapes001.html
    ├── figure001.bs
    ├── figure001.console.txt
    ├── figure001.html
    ├── fingerprint001.bs
    ├── fingerprint001.console.txt
    ├── fingerprint001.html
    ├── fingerprint002.bs
    ├── fingerprint002.console.txt
    ├── fingerprint002.html
    ├── fingerprint003.bs
    ├── fingerprint003.console.txt
    ├── fingerprint003.html
    ├── fingerprint004.bs
    ├── fingerprint004.console.txt
    ├── fingerprint004.html
    ├── fingerprint005.bs
    ├── fingerprint005.console.txt
    ├── fingerprint005.html
    ├── fingerprint006.bs
    ├── fingerprint006.console.txt
    ├── fingerprint006.html
    ├── force-crossorigin001.bs
    ├── force-crossorigin001.console.txt
    ├── force-crossorigin001.html
    ├── github/
    │   ├── WICG/
    │   │   ├── WebApiDevice/
    │   │   │   └── managed_config/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── aom/
    │   │   │   └── spec/
    │   │   │       ├── custom-element-semantics.bs
    │   │   │       ├── custom-element-semantics.console.txt
    │   │   │       ├── custom-element-semantics.html
    │   │   │       ├── input-events.bs
    │   │   │       ├── input-events.console.txt
    │   │   │       └── input-events.html
    │   │   ├── app-history/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── background-fetch/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── background-sync/
    │   │   │   └── spec/
    │   │   │       ├── PeriodicBackgroundSync-index.bs
    │   │   │       ├── PeriodicBackgroundSync-index.console.txt
    │   │   │       ├── PeriodicBackgroundSync-index.html
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── client-hints-infrastructure/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── compression/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── construct-stylesheets/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── contact-api/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── container-queries/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── content-index/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── conversion-measurement-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── cookie-store/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── cq-usecases/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── crash-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── css-parser-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── custom-state-pseudo-class/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── datacue/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── deprecation-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── document-policy/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── element-timing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── encrypted-media-encryption-scheme/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── entries-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── event-timing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── file-system-access/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── floc/
    │   │   │   ├── floc.bs
    │   │   │   ├── floc.console.txt
    │   │   │   └── floc.html
    │   │   ├── get-installed-related-apps/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── hdcp-detection/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── idle-detection/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── import-maps/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── intervention-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── keyboard-lock/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── keyboard-map/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── kv-storage/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── largest-contentful-paint/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── layout-instability/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── local-font-access/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── page-lifecycle/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── periodic-background-sync/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions-request/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions-revoke/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── portals/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── priority-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── responsive-image-client-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── sanitizer-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── scheduling-apis/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── scroll-to-text-fragment/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── shape-detection-api/
    │   │   │   ├── index-zh-cn.bs
    │   │   │   ├── index-zh-cn.console.txt
    │   │   │   ├── index-zh-cn.html
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   ├── text.bs
    │   │   │   ├── text.console.txt
    │   │   │   └── text.html
    │   │   ├── sms-one-time-codes/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── speech-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── storage-buckets/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── ua-client-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── video-rvfc/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── web-locks/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── web-otp/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webpackage/
    │   │   │   ├── loading.bs
    │   │   │   ├── loading.console.txt
    │   │   │   └── loading.html
    │   │   └── webusb/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       ├── index.html
    │   │       └── test/
    │   │           ├── index.bs
    │   │           ├── index.console.txt
    │   │           └── index.html
    │   ├── WebAudio/
    │   │   ├── web-audio-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── web-audio-api-v2/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── WebBluetoothCG/
    │   │   └── web-bluetooth/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       ├── index.html
    │   │       ├── scanning.bs
    │   │       ├── scanning.console.txt
    │   │       ├── scanning.html
    │   │       ├── tests.bs
    │   │       ├── tests.console.txt
    │   │       ├── tests.html
    │   │       ├── use-cases.bs
    │   │       ├── use-cases.console.txt
    │   │       └── use-cases.html
    │   ├── heycam/
    │   │   └── webidl/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── immersive-web/
    │   │   ├── WebXR-WebGPU-Binding/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── anchors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── depth-sensing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── detached-elements/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── dom-overlays/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── hit-test/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── layers/
    │   │   │   ├── webxrlayers-1.bs
    │   │   │   ├── webxrlayers-1.console.txt
    │   │   │   └── webxrlayers-1.html
    │   │   ├── lighting-estimation/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── real-world-geometry/
    │   │   │   ├── plane-detection.bs
    │   │   │   ├── plane-detection.console.txt
    │   │   │   ├── plane-detection.html
    │   │   │   ├── webxrmeshing-1.bs
    │   │   │   ├── webxrmeshing-1.console.txt
    │   │   │   └── webxrmeshing-1.html
    │   │   ├── webvr/
    │   │   │   └── spec/
    │   │   │       └── 1.1/
    │   │   │           ├── index.bs
    │   │   │           ├── index.console.txt
    │   │   │           └── index.html
    │   │   ├── webxr/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-ar-module/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-gamepads-module/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-hand-input/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── webxr-test-api/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── jfbastien/
    │   │   └── papers/
    │   │       └── source/
    │   │           ├── D1501R0.bs
    │   │           ├── D1501R0.console.txt
    │   │           ├── D1501R0.html
    │   │           ├── D2151r0.bs
    │   │           ├── D2151r0.console.txt
    │   │           ├── D2151r0.html
    │   │           ├── Math.signbit.bs
    │   │           ├── Math.signbit.console.txt
    │   │           ├── Math.signbit.html
    │   │           ├── N2218.bs
    │   │           ├── N2218.console.txt
    │   │           ├── N2218.html
    │   │           ├── N4455.bs
    │   │           ├── N4455.console.txt
    │   │           ├── N4455.html
    │   │           ├── P0323R10.bs
    │   │           ├── P0323R10.console.txt
    │   │           ├── P0323R10.html
    │   │           ├── P0323R8.bs
    │   │           ├── P0323R8.console.txt
    │   │           ├── P0323R8.html
    │   │           ├── P0323R9.bs
    │   │           ├── P0323R9.console.txt
    │   │           ├── P0323R9.html
    │   │           ├── P0323r4.bs
    │   │           ├── P0323r4.console.txt
    │   │           ├── P0323r4.html
    │   │           ├── P0323r5.bs
    │   │           ├── P0323r5.console.txt
    │   │           ├── P0323r5.html
    │   │           ├── P0323r6.bs
    │   │           ├── P0323r6.console.txt
    │   │           ├── P0323r6.html
    │   │           ├── P0418r1.bs
    │   │           ├── P0418r1.console.txt
    │   │           ├── P0418r1.html
    │   │           ├── P0418r2.bs
    │   │           ├── P0418r2.console.txt
    │   │           ├── P0418r2.html
    │   │           ├── P0476r0.bs
    │   │           ├── P0476r0.console.txt
    │   │           ├── P0476r0.html
    │   │           ├── P0476r1.bs
    │   │           ├── P0476r1.console.txt
    │   │           ├── P0476r1.html
    │   │           ├── P0476r2.bs
    │   │           ├── P0476r2.console.txt
    │   │           ├── P0476r2.html
    │   │           ├── P0502r0.bs
    │   │           ├── P0502r0.console.txt
    │   │           ├── P0502r0.html
    │   │           ├── P0528r0.bs
    │   │           ├── P0528r0.console.txt
    │   │           ├── P0528r0.html
    │   │           ├── P0528r1.bs
    │   │           ├── P0528r1.console.txt
    │   │           ├── P0528r1.html
    │   │           ├── P0528r2.bs
    │   │           ├── P0528r2.console.txt
    │   │           ├── P0528r2.html
    │   │           ├── P0690r0.bs
    │   │           ├── P0690r0.console.txt
    │   │           ├── P0690r0.html
    │   │           ├── P0690r1.bs
    │   │           ├── P0690r1.console.txt
    │   │           ├── P0690r1.html
    │   │           ├── P0750r0.bs
    │   │           ├── P0750r0.console.txt
    │   │           ├── P0750r0.html
    │   │           ├── P0750r1.bs
    │   │           ├── P0750r1.console.txt
    │   │           ├── P0750r1.html
    │   │           ├── P0907R4.bs
    │   │           ├── P0907R4.console.txt
    │   │           ├── P0907R4.html
    │   │           ├── P0907r0.bs
    │   │           ├── P0907r0.console.txt
    │   │           ├── P0907r0.html
    │   │           ├── P0907r1.bs
    │   │           ├── P0907r1.console.txt
    │   │           ├── P0907r1.html
    │   │           ├── P0907r2.bs
    │   │           ├── P0907r2.console.txt
    │   │           ├── P0907r2.html
    │   │           ├── P0908r0.bs
    │   │           ├── P0908r0.console.txt
    │   │           ├── P0908r0.html
    │   │           ├── P0995r0.bs
    │   │           ├── P0995r0.console.txt
    │   │           ├── P0995r0.html
    │   │           ├── P1018r5.bs
    │   │           ├── P1018r5.console.txt
    │   │           ├── P1018r5.html
    │   │           ├── P1018r6.bs
    │   │           ├── P1018r6.console.txt
    │   │           ├── P1018r6.html
    │   │           ├── P1018r7.bs
    │   │           ├── P1018r7.console.txt
    │   │           ├── P1018r7.html
    │   │           ├── P1018r8.bs
    │   │           ├── P1018r8.console.txt
    │   │           ├── P1018r8.html
    │   │           ├── P1018r9.bs
    │   │           ├── P1018r9.console.txt
    │   │           ├── P1018r9.html
    │   │           ├── P1152R0.bs
    │   │           ├── P1152R0.console.txt
    │   │           ├── P1152R0.html
    │   │           ├── P1152R1.bs
    │   │           ├── P1152R1.console.txt
    │   │           ├── P1152R1.html
    │   │           ├── P1152R2.bs
    │   │           ├── P1152R2.console.txt
    │   │           ├── P1152R2.html
    │   │           ├── P1152R3.bs
    │   │           ├── P1152R3.console.txt
    │   │           ├── P1152R3.html
    │   │           ├── P1152R4.bs
    │   │           ├── P1152R4.console.txt
    │   │           ├── P1152R4.html
    │   │           ├── P1205R0.bs
    │   │           ├── P1205R0.console.txt
    │   │           ├── P1205R0.html
    │   │           ├── P1225R0.bs
    │   │           ├── P1225R0.console.txt
    │   │           ├── P1225R0.html
    │   │           ├── P1482r0.bs
    │   │           ├── P1482r0.console.txt
    │   │           ├── P1482r0.html
    │   │           ├── P1831R0.bs
    │   │           ├── P1831R0.console.txt
    │   │           ├── P1831R0.html
    │   │           ├── P1831R1.bs
    │   │           ├── P1831R1.console.txt
    │   │           ├── P1831R1.html
    │   │           ├── P1860R0.bs
    │   │           ├── P1860R0.console.txt
    │   │           ├── P1860R0.html
    │   │           ├── P2186R0.bs
    │   │           ├── P2186R0.console.txt
    │   │           ├── P2186R0.html
    │   │           ├── P2186R1.bs
    │   │           ├── P2186R1.console.txt
    │   │           ├── P2186R1.html
    │   │           ├── P2186R2.bs
    │   │           ├── P2186R2.console.txt
    │   │           ├── P2186R2.html
    │   │           ├── bikeshed.bs
    │   │           ├── bikeshed.console.txt
    │   │           ├── bikeshed.html
    │   │           ├── p0323r7.bs
    │   │           ├── p0323r7.console.txt
    │   │           ├── p0323r7.html
    │   │           ├── p0528r3.bs
    │   │           ├── p0528r3.console.txt
    │   │           ├── p0528r3.html
    │   │           ├── p0907r3.bs
    │   │           ├── p0907r3.console.txt
    │   │           ├── p0907r3.html
    │   │           ├── p0995r1.bs
    │   │           ├── p0995r1.console.txt
    │   │           ├── p0995r1.html
    │   │           ├── p1102r0.bs
    │   │           ├── p1102r0.console.txt
    │   │           ├── p1102r0.html
    │   │           ├── p1119r0.bs
    │   │           ├── p1119r0.console.txt
    │   │           └── p1119r0.html
    │   ├── privacycg/
    │   │   ├── is-logged-in/
    │   │   │   ├── is-logged-in.bs
    │   │   │   ├── is-logged-in.console.txt
    │   │   │   └── is-logged-in.html
    │   │   ├── private-click-measurement/
    │   │   │   ├── private-click-measurement.bs
    │   │   │   ├── private-click-measurement.console.txt
    │   │   │   └── private-click-measurement.html
    │   │   └── storage-access/
    │   │       ├── storage-access.bs
    │   │       ├── storage-access.console.txt
    │   │       └── storage-access.html
    │   ├── w3c/
    │   │   ├── FileAPI/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── IndexedDB/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── IntersectionObserver/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── PFE/
    │   │   │   ├── Overview.bs
    │   │   │   ├── Overview.console.txt
    │   │   │   └── Overview.html
    │   │   ├── ServiceWorker/
    │   │   │   ├── docs/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   ├── index.html
    │   │   │   │   └── v1/
    │   │   │   │       ├── index.bs
    │   │   │   │       ├── index.console.txt
    │   │   │   │       └── index.html
    │   │   │   └── publish/
    │   │   │       ├── service_worker/
    │   │   │       │   └── WD-service-workers-20160830/
    │   │   │       │       ├── index.bs
    │   │   │       │       ├── index.console.txt
    │   │   │       │       └── index.html
    │   │   │       └── service_worker_1/
    │   │   │           └── WD-service-workers-1-20161011/
    │   │   │               ├── index.bs
    │   │   │               ├── index.console.txt
    │   │   │               └── index.html
    │   │   ├── accelerometer/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── ambient-light/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── clipboard-apis/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── css-houdini-drafts/
    │   │   │   ├── box-tree-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animation-worklet-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-layout-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-paint-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-parser-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-properties-values-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-typed-om/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-typed-om-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── font-metrics-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── worklets/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── csswg-drafts/
    │   │   │   ├── css-2015/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2017/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2018/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2020/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-align-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animations-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-backgrounds-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-backgrounds-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-box-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   ├── Overview.html
    │   │   │   │   ├── block-layout.bs
    │   │   │   │   ├── block-layout.console.txt
    │   │   │   │   └── block-layout.html
    │   │   │   ├── css-box-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-break-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-break-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-adjust-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-hdr/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-values-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-content-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-counter-styles-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-device-adapt-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-display-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-easing-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-egg-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-env-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-exclusions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-extensions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-flexbox-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-font-loading-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-fonts-3/
    │   │   │   │   ├── Overview-wip.bs
    │   │   │   │   ├── Overview-wip.console.txt
    │   │   │   │   └── Overview-wip.html
    │   │   │   ├── css-fonts-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-fonts-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-forms-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-gcpm-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-gcpm-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-highlight-api-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-images-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-images-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-inline-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-line-grid-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-lists-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-logical-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-mobile/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-module-bikeshed/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-multicol-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-multicol-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-namespaces-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-nav-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-nesting-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overflow-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overflow-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overscroll-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-page-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-page-floats-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-position-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-print/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-pseudo-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-regions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-rhythm-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-round-display-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ruby-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scoping-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scroll-anchoring-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scroll-snap-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scrollbars-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shadow-parts-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shapes-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shapes-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-size-adjust-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-sizing-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-sizing-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-speech-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-syntax-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-tables-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-decor-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-decor-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transforms-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transforms-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transitions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transitions-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ui-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ui-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-values-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-values-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-variables-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-will-change-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-writing-modes-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-writing-modes-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── cssom-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── cssom-view-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── indexes/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── mediaqueries-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── mediaqueries-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── resize-observer-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── scroll-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── selectors-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── selectors-nonelement-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   ├── Overview.html
    │   │   │   │   └── Overview_pwtest.js
    │   │   │   ├── web-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── web-animations-2/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── device-memory/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── deviceorientation/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── dpub-pagination/
    │   │   │   ├── Overview.bs
    │   │   │   ├── Overview.console.txt
    │   │   │   └── Overview.html
    │   │   ├── fxtf-drafts/
    │   │   │   ├── compositing-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── compositing-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-masking-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── fill-stroke/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── filter-effects-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── geometry/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── matrix/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── motion-1/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── geolocation-sensor/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── gyroscope/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── longtasks/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── magnetometer/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── media-capabilities/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediacapture-image/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediacapture-record/
    │   │   │   ├── MediaRecorder.bs
    │   │   │   ├── MediaRecorder.console.txt
    │   │   │   └── MediaRecorder.html
    │   │   ├── mediacapture-transform/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediasession/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── motion-sensors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── releases/
    │   │   │       ├── NOTE/
    │   │   │       │   ├── NOTE.bs
    │   │   │       │   ├── NOTE.console.txt
    │   │   │       │   └── NOTE.html
    │   │   │       └── NOTE2/
    │   │   │           ├── index.bs
    │   │   │           ├── index.console.txt
    │   │   │           └── index.html
    │   │   ├── openscreenprotocol/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── orientation-sensor/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── releases/
    │   │   │       ├── FPWD.bs
    │   │   │       ├── FPWD.console.txt
    │   │   │       └── FPWD.html
    │   │   ├── paint-timing/
    │   │   │   ├── painttiming.bs
    │   │   │   ├── painttiming.console.txt
    │   │   │   └── painttiming.html
    │   │   ├── payment-method-manifest/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── picture-in-picture/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── proximity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── reporting/
    │   │   │   ├── network-reporting.bs
    │   │   │   ├── network-reporting.console.txt
    │   │   │   └── network-reporting.html
    │   │   ├── sensors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   ├── usecases.bs
    │   │   │   ├── usecases.console.txt
    │   │   │   └── usecases.html
    │   │   ├── svgwg/
    │   │   │   └── specs/
    │   │   │       ├── color/
    │   │   │       │   ├── Overview.bs
    │   │   │       │   ├── Overview.console.txt
    │   │   │       │   └── Overview.html
    │   │   │       ├── marker/
    │   │   │       │   ├── Overview.bs
    │   │   │       │   ├── Overview.console.txt
    │   │   │       │   └── Overview.html
    │   │   │       ├── svg-native/
    │   │   │       │   ├── index.bs
    │   │   │       │   ├── index.console.txt
    │   │   │       │   └── index.html
    │   │   │       └── transform/
    │   │   │           ├── Overview.bs
    │   │   │           ├── Overview.console.txt
    │   │   │           └── Overview.html
    │   │   ├── w3process/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── wcag-act/
    │   │   │   ├── NOTE-act-rules-common-aspects.bs
    │   │   │   ├── NOTE-act-rules-common-aspects.console.txt
    │   │   │   ├── NOTE-act-rules-common-aspects.html
    │   │   │   ├── act-fr-reqs.bs
    │   │   │   ├── act-fr-reqs.console.txt
    │   │   │   ├── act-fr-reqs.html
    │   │   │   ├── act-rules-format.bs
    │   │   │   ├── act-rules-format.console.txt
    │   │   │   └── act-rules-format.html
    │   │   ├── webappsec-change-password-url/
    │   │   │   ├── change-password-url.bs
    │   │   │   ├── change-password-url.console.txt
    │   │   │   ├── change-password-url.html
    │   │   │   ├── response-code-reliability.bs
    │   │   │   ├── response-code-reliability.console.txt
    │   │   │   └── response-code-reliability.html
    │   │   ├── webappsec-credential-management/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-csp/
    │   │   │   ├── 2/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── api/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── cookies/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── document/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── pinning/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── webappsec-fetch-metadata/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-mixed-content/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-permissions-policy/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-post-spectre-webdev/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-suborigins/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-subresource-integrity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-trusted-types/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── webappsec-uisecurity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-upgrade-insecure-requests/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webauthn/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webdriver-bidi/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webrtc-encoded-transform/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webrtc-priority/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webtransport/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── webvtt/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── w3ctag/
    │   │   ├── client-certificates/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── design-principles/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── evergreen-web/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── promises-guide/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── security-questionnaire/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── url/
    │   │       ├── url.bs
    │   │       ├── url.console.txt
    │   │       └── url.html
    │   └── whatwg/
    │       ├── compat/
    │       │   ├── compatibility.bs
    │       │   ├── compatibility.console.txt
    │       │   └── compatibility.html
    │       ├── console/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── dom/
    │       │   ├── dom.bs
    │       │   ├── dom.console.txt
    │       │   └── dom.html
    │       ├── encoding/
    │       │   ├── encoding.bs
    │       │   ├── encoding.console.txt
    │       │   └── encoding.html
    │       ├── fetch/
    │       │   ├── fetch.bs
    │       │   ├── fetch.console.txt
    │       │   └── fetch.html
    │       ├── fullscreen/
    │       │   ├── fullscreen.bs
    │       │   ├── fullscreen.console.txt
    │       │   └── fullscreen.html
    │       ├── infra/
    │       │   ├── infra.bs
    │       │   ├── infra.console.txt
    │       │   └── infra.html
    │       ├── loader/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── mimesniff/
    │       │   ├── mimesniff.bs
    │       │   ├── mimesniff.console.txt
    │       │   └── mimesniff.html
    │       ├── notifications/
    │       │   ├── notifications.bs
    │       │   ├── notifications.console.txt
    │       │   └── notifications.html
    │       ├── quirks/
    │       │   ├── quirks.bs
    │       │   ├── quirks.console.txt
    │       │   ├── quirks.html
    │       │   └── quirks_pwtest.js
    │       ├── storage/
    │       │   ├── storage.bs
    │       │   ├── storage.console.txt
    │       │   └── storage.html
    │       ├── streams/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── url/
    │       │   ├── url.bs
    │       │   ├── url.console.txt
    │       │   └── url.html
    │       └── xhr/
    │           ├── xhr.bs
    │           ├── xhr.console.txt
    │           └── xhr.html
    ├── highlight001.bs
    ├── highlight001.console.txt
    ├── highlight001.html
    ├── idl001.bs
    ├── idl001.console.txt
    ├── idl001.html
    ├── idl002.bs
    ├── idl002.console.txt
    ├── idl002.html
    ├── idl003.bs
    ├── idl003.console.txt
    ├── idl003.html
    ├── idl004.bs
    ├── idl004.console.txt
    ├── idl004.html
    ├── idl005.bs
    ├── idl005.console.txt
    ├── idl005.html
    ├── idl006.bs
    ├── idl006.console.txt
    ├── idl006.html
    ├── idl007.bs
    ├── idl007.console.txt
    ├── idl007.html
    ├── idl008.bs
    ├── idl008.console.txt
    ├── idl008.html
    ├── idl009.bs
    ├── idl009.console.txt
    ├── idl009.html
    ├── idl010.bs
    ├── idl010.console.txt
    ├── idl010.html
    ├── img-sizing/
    │   ├── image-size001.bs
    │   ├── image-size001.console.txt
    │   └── image-size001.html
    ├── include001.bs
    ├── include001.console.txt
    ├── include001.html
    ├── include001.txt
    ├── include002-1.txt
    ├── include002-2.txt
    ├── include002-3.txt
    ├── include002.bs
    ├── include002.console.txt
    ├── include002.html
    ├── include003.bs
    ├── include003.console.txt
    ├── include003.html
    ├── include003.txt
    ├── include004-files/
    │   ├── include004-2.bs
    │   ├── include004-2.html
    │   ├── include004-files/
    │   │   ├── include004-2.bs
    │   │   ├── include004-2.html
    │   │   ├── include004.bs
    │   │   └── include004.html
    │   ├── include004.bs
    │   └── include004.html
    ├── include004.bs
    ├── include004.console.txt
    ├── include004.html
    ├── include005.bs
    ├── include005.console.txt
    ├── include005.html
    ├── include006.bs
    ├── include006.console.txt
    ├── include006.html
    ├── include006.txt
    ├── index001.bs
    ├── index001.console.txt
    ├── index001.html
    ├── index002.bs
    ├── index002.console.txt
    ├── index002.html
    ├── index003.bs
    ├── index003.console.txt
    ├── index003.html
    ├── lexer001.bs
    ├── lexer001.console.txt
    ├── lexer001.html
    ├── line-count-001.bs
    ├── line-count-001.console.txt
    ├── line-count-001.html
    ├── link-shorthands001.bs
    ├── link-shorthands001.console.txt
    ├── link-shorthands001.html
    ├── link-shorthands002.bs
    ├── link-shorthands002.console.txt
    ├── link-shorthands002.html
    ├── link-shorthands003.bs
    ├── link-shorthands003.console.txt
    ├── link-shorthands003.html
    ├── link-shorthands004.bs
    ├── link-shorthands004.console.txt
    ├── link-shorthands004.html
    ├── links001.bs
    ├── links001.console.txt
    ├── links001.html
    ├── links001_pwtest.js
    ├── links002.bs
    ├── links002.console.txt
    ├── links002.html
    ├── links003.bs
    ├── links003.console.txt
    ├── links003.html
    ├── links004.bs
    ├── links004.console.txt
    ├── links004.html
    ├── links005.bs
    ├── links005.console.txt
    ├── links005.html
    ├── links006.bs
    ├── links006.console.txt
    ├── links006.html
    ├── links007.bs
    ├── links007.console.txt
    ├── links007.html
    ├── links008.bs
    ├── links008.console.txt
    ├── links008.html
    ├── links009.bs
    ├── links009.console.txt
    ├── links009.html
    ├── links010.bs
    ├── links010.console.txt
    ├── links010.html
    ├── links011.bs
    ├── links011.console.txt
    ├── links011.html
    ├── lint001.bs
    ├── lint001.console.txt
    ├── lint001.html
    ├── lint002.bs
    ├── lint002.console.txt
    ├── lint002.html
    ├── macros001.bs
    ├── macros001.console.txt
    ├── macros001.html
    ├── macros002.bs
    ├── macros002.console.txt
    ├── macros002.html
    ├── markdown001.bs
    ├── markdown001.console.txt
    ├── markdown001.html
    ├── markdown002.bs
    ├── markdown002.console.txt
    ├── markdown002.html
    ├── markdown003.bs
    ├── markdown003.console.txt
    ├── markdown003.html
    ├── markdown004.bs
    ├── markdown004.console.txt
    ├── markdown004.html
    ├── markdown005.bs
    ├── markdown005.console.txt
    ├── markdown005.html
    ├── markdown006.bs
    ├── markdown006.console.txt
    ├── markdown006.html
    ├── markdown007.bs
    ├── markdown007.console.txt
    ├── markdown007.html
    ├── markdown008.bs
    ├── markdown008.console.txt
    ├── markdown008.html
    ├── markdown009.bs
    ├── markdown009.console.txt
    ├── markdown009.html
    ├── markdown010.bs
    ├── markdown010.console.txt
    ├── markdown010.html
    ├── markdown011.bs
    ├── markdown011.console.txt
    ├── markdown011.html
    ├── markdown012.bs
    ├── markdown012.console.txt
    ├── markdown012.html
    ├── markdown013.bs
    ├── markdown013.console.txt
    ├── markdown013.html
    ├── markdown014.bs
    ├── markdown014.console.txt
    ├── markdown014.html
    ├── merge-metadata001.bs
    ├── merge-metadata001.console.txt
    ├── merge-metadata001.html
    ├── metadata-expires001.bs
    ├── metadata-expires001.console.txt
    ├── metadata-expires001.html
    ├── metadata-expires002.bs
    ├── metadata-expires002.console.txt
    ├── metadata-expires002.html
    ├── metadata-expires003.bs
    ├── metadata-expires003.console.txt
    ├── metadata-expires003.html
    ├── metadata-expires004.bs
    ├── metadata-expires004.console.txt
    ├── metadata-expires004.html
    ├── metadata-expires005.bs
    ├── metadata-expires005.console.txt
    ├── metadata-expires005.html
    ├── metadata-expires006.bs
    ├── metadata-expires006.console.txt
    ├── metadata-expires006.html
    ├── metadata-order001.bs
    ├── metadata-order001.console.txt
    ├── metadata-order001.html
    ├── metadata001.bs
    ├── metadata001.console.txt
    ├── metadata001.html
    ├── metadata002.bs
    ├── metadata002.console.txt
    ├── metadata002.html
    ├── metadata003.bs
    ├── metadata003.console.txt
    ├── metadata003.html
    ├── metadata004.bs
    ├── metadata004.console.txt
    ├── metadata004.html
    ├── metadata005.bs
    ├── metadata005.console.txt
    ├── metadata005.html
    ├── metadata006.bs
    ├── metadata006.console.txt
    ├── metadata006.html
    ├── metadata007.bs
    ├── metadata007.console.txt
    ├── metadata007.html
    ├── metadata008.bs
    ├── metadata008.console.txt
    ├── metadata008.html
    ├── metadata009.bs
    ├── metadata009.console.txt
    ├── metadata009.html
    ├── metadata010.bs
    ├── metadata010.console.txt
    ├── metadata010.html
    ├── metadata011.bs
    ├── metadata011.console.txt
    ├── metadata011.html
    ├── metadata012.bs
    ├── metadata012.console.txt
    ├── metadata012.html
    ├── metadata013.bs
    ├── metadata013.console.txt
    ├── metadata013.html
    ├── metadata014.bs
    ├── metadata014.console.txt
    ├── metadata014.html
    ├── metadata015.bs
    ├── metadata015.console.txt
    ├── metadata015.html
    ├── metadata016.bs
    ├── metadata016.console.txt
    ├── metadata016.html
    ├── metadata017.bs
    ├── metadata017.console.txt
    ├── metadata017.html
    ├── metadata018.bs
    ├── metadata018.console.txt
    ├── metadata018.html
    ├── notes-examples001.bs
    ├── notes-examples001.console.txt
    ├── notes-examples001.html
    ├── notes-issues001.bs
    ├── notes-issues001.console.txt
    ├── notes-issues001.html
    ├── parsing-links001.bs
    ├── parsing-links001.console.txt
    ├── parsing-links001.html
    ├── parsing001.bs
    ├── parsing001.console.txt
    ├── parsing001.html
    ├── pre001.bs
    ├── pre001.console.txt
    ├── pre001.html
    ├── pre002.bs
    ├── pre002.console.txt
    ├── pre002.html
    ├── pre003.bs
    ├── pre003.console.txt
    ├── pre003.html
    ├── pre004.bs
    ├── pre004.console.txt
    ├── pre004.html
    ├── previous-versions-001.bs
    ├── previous-versions-001.console.txt
    ├── previous-versions-001.html
    ├── previous-versions-002.bs
    ├── previous-versions-002.console.txt
    ├── previous-versions-002.html
    ├── previous-versions-003.bs
    ├── previous-versions-003.console.txt
    ├── previous-versions-003.html
    ├── previous-versions-004.bs
    ├── previous-versions-004.console.txt
    ├── previous-versions-004.html
    ├── previous-versions-005.bs
    ├── previous-versions-005.console.txt
    ├── previous-versions-005.html
    ├── previous-versions-006.bs
    ├── previous-versions-006.console.txt
    ├── previous-versions-006.html
    ├── previous-versions-007.bs
    ├── previous-versions-007.console.txt
    ├── previous-versions-007.html
    ├── section-links001.bs
    ├── section-links001.console.txt
    ├── section-links001.html
    ├── section-links002.bs
    ├── section-links002.console.txt
    ├── section-links002.html
    ├── section-links003.bs
    ├── section-links003.console.txt
    ├── section-links003.html
    ├── tar-file001.console.txt
    ├── tar-file001.html
    ├── template.bs
    ├── template.console.txt
    ├── template.html
    ├── var001.bs
    ├── var001.console.txt
    ├── var001.html
    ├── var002.bs
    ├── var002.console.txt
    └── var002.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
* text=auto eol=lf


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: pip
  directory: "/"
  open-pull-requests-limit: 99
  schedule:
    interval: "monthly"
  groups:
    dependencies:
      applies-to: version-updates
      patterns:
        - "*"
      update-types:
        - "minor"
        - "patch"
- package-ecosystem: pip
  directory: ".github/workflows/update-tests/"
  open-pull-requests-limit: 99
  schedule:
    interval: "monthly"
  groups:
    dependencies:
      applies-to: version-updates
      patterns:
        - "*"
      update-types:
        - "minor"
        - "patch"
- package-ecosystem: github-actions
  directory: "/"
  schedule:
    interval: daily
  open-pull-requests-limit: 99


================================================
FILE: .github/workflows/build-docs.yml
================================================
name: Build Docs
on:
  push:
    branches:
      - main
    paths:
      - docs/index.bs
  workflow_dispatch: {}

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: true

jobs:
  build:
    name: Build & Deploy Docs
    runs-on: ubuntu-latest
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Install Python
        uses: actions/setup-python@v5
        with:
          python-version: 3.12
      - name: Install Bikeshed
        run: pip install -e .
      - name: Build Docs
        run: bikeshed -f spec docs/index.bs
      - name: Setup Pages
        uses: actions/configure-pages@v6
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v5
        with:
          # Upload entire repository
          path: 'docs'
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v5


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches-ignore:
      - "dependabot/**"
      - "daily-test-sync"
    paths-ignore:
      - "docs/**"
  pull_request:
  workflow_dispatch: {}

jobs:
  build:
    needs: lint
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: true
      matrix:
        python-version:
          - '3.12.9'
          - '3.14.1'
        os:
          - windows-latest
          - ubuntu-latest
          - macos-latest

    steps:
    - uses: actions/checkout@v6
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        pip install --upgrade pip wheel
        pip install --editable .
    - name: Test with bikeshed
      run: bikeshed --no-update test

  lint:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v6
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.14.1'
    - uses: psf/black@26.3.1
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements-dev.txt
        pip install -r .github/workflows/update-tests/requirements.txt
    - name: Lint with ruff
      run: |
        ruff check bikeshed

    - name: Lint with pylint
      run: |
        echo "::add-matcher::.github/workflows/pylint-problem-matcher.json"
        pylint bikeshed *.py .github/workflows/update-tests/*.py

    - name: Lint with mypy
      run: |
        mypy


================================================
FILE: .github/workflows/playwright.yml
================================================
# Consider moving this to run as part of ci.yml

name: Playwright Tests
on:
#  push:
#    branches-ignore:
#      - "dependabot/**"
#      - "daily-test-sync"

jobs:
  playwright:
    name: 'Playwright Tests'
    runs-on: ubuntu-latest
    container:
      # Note: the version of the docker container for playwright must exactly match the version used in package.json.
      image: mcr.microsoft.com/playwright:v1.35.1-jammy
    steps:
        - uses: actions/checkout@v6

        # Steps for Playwright testing with container
        - uses: actions/setup-node@v6
          with:
            node-version: 18
        - name: Install dependencies
          run: npm ci
        - name: Run your tests
          run: npx playwright test
        - uses: actions/upload-artifact@v7
          if: failure()
          with:
            name: test-results
            path: test-results/
            retention-days: 30


================================================
FILE: .github/workflows/pylint-problem-matcher.json
================================================
{
  "problemMatcher": [
    {
      "severity": "error",
      "pattern": [
        {
          "regexp": "^([^:]+):(\\d+):(\\d+): (E\\d+): (.*)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "code": 4,
          "message": 5
        }
      ],
      "owner": "pylint-0"
    },
    {
      "severity": "warning",
      "pattern": [
        {
          "regexp": "^([^:]+):(\\d+):(\\d+): ([A-DF-Z]\\d+): (.*)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "code": 4,
          "message": 5
        }
      ],
      "owner": "pylint-1"
    }
  ]
}


================================================
FILE: .github/workflows/update-tests/README.md
================================================
# Bikeshed tests auto-updater

These scripts collect *.bs files from GitHub repos and creates PRs to update
Bikeshed's tests in `tests/github/`.

## Adding Your Specs

If you'd like to add your own specs to Bikeshed's regression test-suite,
submit a PR for the `specs.data` file.

This file format is line-based:
to add your entire organization, add a `+org: orgname` line;
to add a single repo, add a `+repo: user/repo` line.
If you need to exclude any repos or files,
use a `-repo: user/repo`
or `-file: user/repo/path/to/file.bs` line.
(`-file` lines can use shell wildcarding conventions to exclude multiple files,
as implemented by the Python [fnmatch](https://docs.python.org/2/library/fnmatch.html) module,
like `-file: */review-drafts/*.bs` to exclude all files in a `review-drafts` folder.)

The files to be processed by this tool must have the `.bs` extension;
if you specify a repo or an org,
the entire repo/org will be crawled for `.bs` files.

Indentation does not matter, but can be used for readability,
to group some `-` lines underneath the larger `+` line that would include them.

Lines starting with `#` are comments and are ignored;
blank lines are also ignored.

## Running locally

You need Python 3. Then install the dependencies:
```bash
pip3 install --user -r requirements.txt
```

The python scripts need `GITHUB_TOKEN` environment variable set to a
[personal access token](https://github.com/settings/tokens/new) with the
"Access public repositories" (public_repo) scope enabled.

To emulate what GitHub Actions does, execute each step in `update-tests.yml` manually.


================================================
FILE: .github/workflows/update-tests/requirements.txt
================================================
PyGithub==2.9.1


================================================
FILE: .github/workflows/update-tests/specs.data
================================================
# See README.md for how to add your own specs

+org: w3c
	-repo: w3c/dom
	-repo: w3c/mnx
	-repo: w3c/uievents
	-file: w3c/fxtf-drafts/filter-effects/Overview.bs
	-file: w3c/csswg-drafts/css-round-display-1/Overview_before_merge_motionpath.bs
	-file: w3c/csswg-drafts/css-sizing-4/intrinsic-sizing-notes.bs
	-file: w3c/PFE/example.bs
+org: whatwg
	-file: */review-drafts/*.bs
+org: WICG
	-repo: WICG/starter-kit
+org: w3ctag
+org: WebBluetoothCG
+org: privacycg
	-repo: privacycg/template
+org: immersive-web
+repo: jfbastien/papers
+repo: heycam/webidl
+org: WebAudio
+repo: gpuweb/gpuweb


================================================
FILE: .github/workflows/update-tests/update.py
================================================
import base64
import fnmatch
import os
import re
import time
from datetime import datetime

from github import Github
from github.GithubException import GithubException

this_dir = os.path.dirname(__file__)
root_dir = os.path.join(
    this_dir,
    "..",
    "..",
    "..",
)


def getData():
    """
    Parses specs.data into a {orgs: [], moreRepos:[], skipRepos: [], moreFiles: [], skipFiles[]}
    """
    data = {
        "orgs": [],
        "moreRepos": [],
        "skipRepos": [],
        "moreFiles": [],
        "skipFiles": [],
    }
    with open(os.path.join(this_dir, "specs.data"), encoding="utf-8") as fh:
        for i, line in enumerate(fh.readlines(), 1):
            line = line.strip()
            if line == "":
                # Empty lines are allowed
                continue
            if line.startswith("#"):
                # Comments are allowed
                continue
            match = re.match(r"(\+|-)(org|repo|file):\s*([^\s].*)", line)
            if not match:
                raise Exception(f"Line {i} of the specs.data file has bad syntax.")
            [plusMinus, type, path] = match.groups()
            if type == "org":
                if plusMinus == "+":
                    data["orgs"].append(path)
                else:
                    raise Exception(f"Line {i} has a -org, which makes no sense.")
            elif type == "repo":
                if plusMinus == "+":
                    storage = data["moreRepos"]
                else:
                    storage = data["skipRepos"]
                storage.append(path)
            elif type == "file":
                if plusMinus == "+":
                    raise Exception(f"Line {i} has a +file, which isn't currently supported.")
                else:
                    storage = data["skipFiles"]
                storage.append(path)
    return data


def reposFromOrg(org, skipRepos=None):
    if skipRepos is None:
        skipRepos = set()
    else:
        skipRepos = set(skipRepos)
    print(f"Searching {org.login} org for repositories...")
    for repo in org.get_repos():
        if repo.archived:
            print(f"  * Skipping archived repo {repo.full_name}")
            continue
        if repo.full_name in skipRepos:
            print(f"  * Skipping repo {repo.full_name}")
            continue
        print(f"  * Found repo {repo.full_name}")
        yield repo


def filesFromRepo(repo, skipFiles=None):
    if skipFiles is None:
        skipFiles = set()
    else:
        skipFiles = set(skipFiles)
    print(f"Searching {repo.full_name} repo for Bikeshed files...")

    try:
        tree = repo.get_git_tree(repo.default_branch, recursive=True)
    except GithubException as err:
        if err.status == 409:  # "Git Repository is empty"
            return
        raise
    for entry in tree.tree:
        path = repo.full_name + "/" + entry.path
        if any(fnmatch.fnmatch(path, pattern) for pattern in skipFiles):
            print(f"  * Skipping file {entry.path}")
            continue
        if entry.type == "blob" and entry.path.endswith(".bs"):
            print(f"  * Found file {entry.path}")
            blob = repo.get_git_blob(entry.sha)
            assert blob.encoding == "base64"
            text = base64.b64decode(blob.content).decode("utf-8")
            yield {"path": path, "text": text}


def processFile(file):
    path = os.path.join(root_dir, "tests", "github", file["path"])
    print("Saving file {}".format(os.path.relpath(path, start=root_dir)))
    dirname = os.path.dirname(path)
    if not os.path.exists(dirname):
        os.makedirs(dirname)
    with open(path, "w+", encoding="utf-8") as f:
        f.write(file["text"])


def main():
    try:
        token = os.environ["GITHUB_TOKEN"]
        g = Github(token)
    except KeyError:
        print("Set the GITHUB_TOKEN environment variable for higher rate limit.")
        g = Github()

    initial_rate_limit = g.rate_limiting
    print("Initial rate limit is {0[1]} requests per hour ({0[0]} remaining)".format(initial_rate_limit))

    def throttle():
        if g.get_rate_limit().core.remaining == 1:
            sleep_time = (g.get_rate_limit().core.reset - datetime.utcnow()).total_seconds() + 1
            print(f"Sleeping {sleep_time}s to stay under rate limit.")
            time.sleep(sleep_time)

    data = getData()
    repos = []
    for orgName in sorted(data["orgs"]):
        org = g.get_organization(orgName)
        repos.extend(reposFromOrg(org, data["skipRepos"]))
        throttle()
    for repoName in data["moreRepos"]:
        repos.append(g.get_repo(repoName))
        throttle()
    files = []
    for repo in sorted(repos, key=lambda x: x.full_name):
        files.extend(filesFromRepo(repo, data["skipFiles"]))
        throttle()
    for file in sorted(files, key=lambda x: x["path"]):
        processFile(file)


if __name__ == "__main__":
    main()


================================================
FILE: .github/workflows/update-tests.yml
================================================
name: Daily test sync
on:
  schedule:
  - cron: '20 20 * * *'
  workflow_dispatch: {}
jobs:
  update:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'tabatkins'
    steps:
    - uses: actions/checkout@v6
    - uses: actions/setup-python@v5
      with:
        python-version: 3.12
    - name: install dependencies
      run: |
        pip install -r .github/workflows/update-tests/requirements.txt
        pip install --editable .
        bikeshed update
    - name: update tests
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        rm -rf tests/github
        python .github/workflows/update-tests/update.py
        # paths need to be relative to tests/
        (cd tests; find github -type f) | xargs bikeshed test --rebase
    - name: Create/Update PR
      uses: peter-evans/create-pull-request@v7
      with:
        branch: daily-test-sync
        commit-message: 'chore: Sync Bikeshed files from specs.data list'
        title: 'Daily sync of Bikeshed files from specs.data'


================================================
FILE: .gitignore
================================================
.history
secrets.json
*.egg-info
.idea
*.iml
*.pyc
.python-version
/dist
/build
/bikeshed/spec-data/*
!/bikeshed/spec-data/readonly
/bikeshed/test.bs
/bikeshed/test.html
/bikeshed/test.bsi
*.sublime-project
node_modules/
/test-results/
/playwright-report/
/playwright/.cache/
/env
/docs/*.html
/html-perf-test

================================================
FILE: .vscode/settings.json
================================================
{
    "files.associations": {
        "*.include": "html",
        "stylesheet.include": "css",
        "defaults*.include": "json",
        "bs-extensions.include": "bikeshed"
    },
    "editor.trimAutoWhitespace": false,
    "diffEditor.ignoreTrimWhitespace": false,
    "files.trimTrailingWhitespaceInRegexAndStrings": false
}

================================================
FILE: Bikeshed.tmLanguage
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>fileTypes</key>
	<array>
		<string>bs</string>
	</array>
	<key>name</key>
	<string>Bikeshed</string>
	<key>patterns</key>
	<array>
		<dict>
			<key>comment</key>
			<string>Syntax production.</string>
			<key>match</key>
			<string>&lt;&lt;[^&gt;]+&gt;&gt;</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>comment</key>
			<string>Element/attr autolink</string>
			<key>match</key>
			<string>&lt;\{[^}]+\}&gt;</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>{{</string>
			<key>comment</key>
			<string>IDL link.</string>
			<key>end</key>
			<string>\}\}</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>comment</key>
			<string>Dfn autolink</string>
			<key>begin</key>
			<string>\[=</string>
			<key>end</key>
			<string>=]</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>comment</key>
			<string>Bibliography autolinks.</string>
			<key>match</key>
			<string>\[\[[^\]]+\]\]</string>
			<key>name</key>
			<string>constant.other.biblioLink.csswg</string>
		</dict>
		<dict>
			<key>comment</key>
			<string>Text macro.</string>
			<key>match</key>
			<string>\[[^\]]+\]</string>
			<key>name</key>
			<string>constant.language.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>''</string>
			<key>comment</key>
			<string>Maybe autolinks, and literal CSS code.</string>
			<key>end</key>
			<string>''</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>comment</key>
			<string>Property name.</string>
			<key>match</key>
			<string>(?&lt;!\w)'[^']+'</string>
			<key>name</key>
			<string>string.quoted.single.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;h\d</string>
			<key>comment</key>
			<string>Section heading. Using illegal to make them super stand out.</string>
			<key>end</key>
			<string>&lt;/h\d&gt;</string>
			<key>name</key>
			<string>invalid.illegal.heading.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;dfn[^&gt;]*&gt;</string>
			<key>comment</key>
			<string>Production definition.</string>
			<key>end</key>
			<string>&lt;/dfn&gt;</string>
			<key>name</key>
			<string>variable.parameter.definition.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;a[ &gt;]</string>
			<key>comment</key>
			<string>Links</string>
			<key>end</key>
			<string>&lt;/a&gt;</string>
			<key>name</key>
			<string>string.quoted.double.csswg</string>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;pre\s+class=.*?prod.*?&gt;</string>
			<key>comment</key>
			<string>A &lt;pre class='prod'&gt;, which contains grammar things that look a lot like autolinks.</string>
			<key>end</key>
			<string>&lt;/pre&gt;</string>
			<key>name</key>
			<string>entity.production.csswg</string>
			<key>patterns</key>
			<array>
				<dict>
					<key>include</key>
					<string>#production</string>
				</dict>
				<dict>
					<key>include</key>
					<string>#definition</string>
				</dict>
			</array>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;pre\s+class=.*?metadata.*?&gt;</string>
			<key>comment</key>
			<string>A metadata block.</string>
			<key>end</key>
			<string>&lt;/pre&gt;</string>
			<key>name</key>
			<string>entity.metadata.csswg</string>
			<key>patterns</key>
			<array>
				<dict>
					<key>captures</key>
					<dict>
						<key>1</key>
						<dict>
							<key>name</key>
							<string>keyword.other.knownKeyName.csswg</string>
						</dict>
						<key>2</key>
						<dict>
							<key>name</key>
							<string>string.unquoted.csswg</string>
						</dict>
					</dict>
					<key>match</key>
					<string>^(?i)(Abstract|Advisement Class|Assertion Class|Assume Explicit For|At Risk|Audience|Block Elements|Boilerplate|Can I Use Url|Canonical Url|Complain About|Custom Warning Text|Custom Warning Title|Date|Deadline|Default Biblio Status|Default Highlight|Default Ref Status|ED|Editor|Editor Term|Former Editor|Group|H1|Ignore Can I Use Url Failure|Ignored Terms|Ignored Vars|Include Can I Use Panels|Indent|Infer Css Dfns|Inline Github Issues|Issue Class|Issue Tracker Template|Issue Tracking|Level|Line Numbers|Link Defaults|Logo|Mailing List Archives|Mailing List|Markup Shorthands|Max Toc Depth|No Editor|Note Class|Opaque Elements|Prepare For Tr|Previous Version|Repository|Revision|Shortname|Status Text|Status|Test Suite|Text Macro|Title|Toggle Diffs|TR|Translate Ids|Translation|URL|Use &lt;I&gt; Autolinks|Use Dfn Panels|Version History|Warning|Work Status)\s*:\s*(.*)$</string>
				</dict>
				<dict>
					<key>captures</key>
					<dict>
						<key>1</key>
						<dict>
							<key>name</key>
							<string>variable.other.customKeyName.csswg</string>
						</dict>
						<key>2</key>
						<dict>
							<key>name</key>
							<string>string.unquoted.csswg</string>
						</dict>
					</dict>
					<key>match</key>
					<string>^\s*(![\w -]+)\s*:\s*(.*)$</string>
				</dict>
				<dict>
					<key>captures</key>
					<dict>
						<key>1</key>
						<dict>
							<key>name</key>
							<string>invalid.illegal.unknownKeyName.csswg</string>
						</dict>
					</dict>
					<key>match</key>
					<string>^\s*([\w -]+)\s*:\s*.*$</string>
				</dict>
			</array>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;pre\s+class=.*?(propdef|descdef).*?&gt;</string>
			<key>comment</key>
			<string>A property definition block.</string>
			<key>end</key>
			<string>&lt;/pre&gt;</string>
			<key>name</key>
			<string>entity.propdef.csswg</string>
			<key>patterns</key>
			<array>
				<dict>
					<key>captures</key>
					<dict>
						<key>1</key>
						<dict>
							<key>name</key>
							<string>keyword.other.keyName.csswg</string>
						</dict>
						<key>2</key>
						<dict>
							<key>name</key>
							<string>string.unquoted.csswg</string>
						</dict>
					</dict>
					<key>match</key>
					<string>^\s*(?i)(Name|Value|For|Initial|Applies to|Inherited|Percentages|Media|Computed value|Animation type|Canonical order|Logical property group)\s*:\s*(.*)$</string>
				</dict>
				<dict>
					<key>captures</key>
					<dict>
						<key>1</key>
						<dict>
							<key>name</key>
							<string>variable.other.unknownKeyName.csswg</string>
						</dict>
						<key>2</key>
						<dict>
							<key>name</key>
							<string>string.unquoted.csswg</string>
						</dict>
					</dict>
					<key>match</key>
					<string>^\s*([\w -]+)\s*:\s*(.*)$</string>
				</dict>
			</array>
		</dict>
		<dict>
			<key>begin</key>
			<string>&lt;/?[a-z]</string>
			<key>comment</key>
			<string>HTML tags.</string>
			<key>end</key>
			<string>&gt;</string>
			<key>name</key>
			<string>entity.name.tag.csswg</string>
		</dict>
	</array>
	<key>repository</key>
	<dict>
		<key>definition</key>
		<dict>
			<key>begin</key>
			<string>&lt;dfn( |&gt;)</string>
			<key>end</key>
			<string>&lt;/dfn&gt;</string>
			<key>name</key>
			<string>variable.parameter.definition.csswg</string>
		</dict>
		<key>production</key>
		<dict>
			<key>match</key>
			<string>&lt;&lt;[^&gt;]+&gt;&gt;</string>
			<key>name</key>
			<string>constant.other.production.csswg</string>
		</dict>
	</dict>
	<key>scopeName</key>
	<string>source.csswg</string>
	<key>uuid</key>
	<string>7c40ac90-bd9b-11e2-9e96-0800200c9a66</string>
</dict>
</plist>


================================================
FILE: CONTRIBUTING.md
================================================
Developing Bikeshed
===================

If you want to contribute back to Bikeshed,
first make a fork on GitHub,
then do an [editable install](https://tabatkins.github.io/bikeshed/#install-dev) of Bikeshed from your fork.
(Uninstall any pip-installed version you may have beforehand,
or use one of the several separate-environment things Python currently has
(`venv`, `pipenv`, `virtualenv`...)
to isolate it.)
This way your local changes will be reflected when you run the `bikeshed` command,
making it easy to test.

(I recommend `pipenv`;
I find it simple to use,
and it's what I use to develop Bikeshed,
so it has a high chance of working correctly.)

See [my blog post on cleanly handling a fork](https://www.xanthir.com/b4hf0)
for guidance on how to fork responsibly
when you're making small changes to an active project;
you'll save yourself a lot of future pain
if you follow those steps.

Linting
-------

Bikeshed uses a number of services to lint its codebase.
If you don't run these beforehand,
your contributions might fail just due to violating the linting rules.

To lint everything, first install `ruff`, `pylint`, `mypy`, and `black` from `pypi`.
(You can automatically get the versions that the project currently uses by running `pip install -r requirements-dev.txt` from the project root.)

Then, from the root directory of the project, run the `lint` script,
which'll invoke all of these in the correct way for you.
Fix anything that any of these are complaining about;
if they are all happy, you're good.

Running Tests
-------------

Bikeshed has a decent suite of intentional tests,
and a comprehensive suite of real-world specs to test against,
which gives a reasonably good assurance that every codepath is exercised at least once.
We need to keep the tests green,
so running these before submitting a PR is important.

* `bikeshed test` will run all of the tests,
 giving you diffs where there's failures.
* `bikeshed test --rebase` will rebase all of the tests,
    replacing the `.html` files with their new forms,
    and the `.console.txt` files with the console output.
    This can be useful as a general testing strategy;
    git's diff can be easier to read than the simple one `bikeshed test` uses,
    and you might be even an even better diff pager than the default.
    (I highly recommend [using Delta](https://github.com/dandavison/delta)!)

    It's also necessary, however, to actually generate the new test expectations;
    the tests are generated with some special options
    that ensure they can be stably generated across different environments
    (omitting today's date, etc),
    and `bikeshed test --rebase` ensures these are all set up correctly.

* Both of these commands default to running all of the tests,
    but you can run *particular* tests in several ways:

    * passing `--manual` will only run the manually-written tests,
        which are small and very fast,
        skipping all the real-world document tests.

    * passing `--folder FOLDER FOLDER ...` will run any tests
        for which one of the FOLDER values is the name of a folder in their path.
        (exact matches required).

    * passing `--file FILE FILE ...` will run any tests
        for which one fo the FILE values
        is a substring of their filename.
        (That is, exact matches not required.)

* To run Playwright visual tests and tests of client-side user interaction,
    * NodeJS and docker must be installed first.
    * Then, to run all `*_pwtest.js` scripts and compare with existing  __screenshots__ in the same directory, run the following.
        * `npm run pwtests`
    * To update the screenshots after you make changes that should affect the screenshots, run this instead:
        * `npm run pwtests-update`


Managing Requirements
---------------------

Now that Bikeshed's recommended install path is via `pipx`,
which automatically puts it in a clean environment for the user,
I've simplified dependency management back to just relying on `requirements.txt`.

If you add a new dependency, make sure to add it to this file.
Use exact versions **only**, not ranges.
(It makes installs more predictable, and doesn't affect users.
It can affect devs, but they can be expected to know how to use `pipenv`
or similar environment isolation tools.)


================================================
FILE: Dockerfile
================================================
FROM python:3.12-bullseye as base

# Get the latest spec-data, then cache it so we don't have to redo this on every rebuild
FROM base as specdata
RUN mkdir /bikeshed-main
WORKDIR /bikeshed-main
RUN git clone --depth=1 --branch=main https://github.com/speced/bikeshed.git /bikeshed-main
RUN pip install --editable /bikeshed-main
RUN bikeshed update

FROM base as builder
RUN mkdir /install
WORKDIR /install

COPY requirements.txt /requirements.txt
RUN pip install --prefix=/install -r /requirements.txt

FROM base
RUN mkdir -p /app/bikeshed
WORKDIR /app

COPY --from=builder /install /usr/local
COPY --from=specdata /bikeshed-main/bikeshed/spec-data /app/bikeshed/spec-data

# setup.py opens README.md, semver.txt and requirements.txt so they must be copied.
COPY setup.py README.md requirements.txt /app/
COPY bikeshed/semver.txt /app/bikeshed/
COPY bikeshed /app/bikeshed
COPY bikeshed.py /app/

RUN pip install --editable .

COPY .git /app/.git


================================================
FILE: LICENSE
================================================
Creative Commons Legal Code

CC0 1.0 Universal

    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
    HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.

For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:

  i. the right to reproduce, adapt, distribute, perform, display,
     communicate, and translate a Work;
 ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
     likeness depicted in a Work;
 iv. rights protecting against unfair competition in regards to a Work,
     subject to the limitations in paragraph 4(a), below;
  v. rights protecting the extraction, dissemination, use and reuse of data
     in a Work;
 vi. database rights (such as those arising under Directive 96/9/EC of the
     European Parliament and of the Council of 11 March 1996 on the legal
     protection of databases, and under any national implementation
     thereof, including any amended or successor version of such
     directive); and
vii. other similar, equivalent or corresponding rights throughout the
     world based on applicable law or treaty, and any national
     implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.

4. Limitations and Disclaimers.

 a. No trademark or patent rights held by Affirmer are waived, abandoned,
    surrendered, licensed or otherwise affected by this document.
 b. Affirmer offers the Work as-is and makes no representations or
    warranties of any kind concerning the Work, express, implied,
    statutory or otherwise, including without limitation warranties of
    title, merchantability, fitness for a particular purpose, non
    infringement, or the absence of latent or other defects, accuracy, or
    the present or absence of errors, whether or not discoverable, all to
    the greatest extent permissible under applicable law.
 c. Affirmer disclaims responsibility for clearing rights of other persons
    that may apply to the Work or any use thereof, including without
    limitation any person's Copyright and Related Rights in the Work.
    Further, Affirmer disclaims responsibility for obtaining any necessary
    consents, permissions or other rights required for any use of the
    Work.
 d. Affirmer understands and acknowledges that Creative Commons is not a
    party to this document and has no duty or obligation with respect to
    this CC0 or use of the Work.


================================================
FILE: MANIFEST.in
================================================
include README.md
include requirements.txt
include bikeshed/semver.txt
include bikeshed/py.typed
recursive-include bikeshed *.js *.css *.bsfont
graft docs
graft bikeshed/spec-data


================================================
FILE: README.md
================================================
Bikeshed, a spec preprocessor
=============================

<img src="https://raw.githubusercontent.com/speced/bikeshed/main/bikeshed.svg" width=100 height=100 align=left>

Bikeshed is a pre-processor for spec documents,
turning a source document
(containing only the actual spec content, plus several shorthands for linking to terms and other things)
into a final spec document,
with appropriate boilerplate, bibliography, indexes, etc all filled in.
It's used on specs for CSS and many other W3C working groups,
WHATWG,
the C++ standards committee,
and elsewhere!

![CI](https://github.com/speced/bikeshed/workflows/CI/badge.svg)
[![Gitter](https://img.shields.io/badge/Gitter-Join%20Chat%20↣-blue.svg)](https://gitter.im/tabatkins/bikeshed?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![Docs](https://img.shields.io/badge/docs-available-orange.svg)](https://speced.github.io/bikeshed)
[![Release Notes](https://img.shields.io/badge/release-notes-purple.svg)](https://github.com/speced/bikeshed/issues/1773)

The processor can be easily [installed](https://speced.github.io/bikeshed/#installing) and run locally (requiring no
network access unless you're updating), or accessed online through [spec-generator](https://www.w3.org/publications/spec-generator/).

A short overview of some of Bikeshed's features:

* [automatic linking](https://speced.github.io/bikeshed/#autolinking) of terms to their definitions based on text, so you can simple write `Use <a>some term</a> to...` and have it automatically link to the `<dfn>some term</dfn>` elsewhere in the document, or in another spec entirely!
* [automatic id generation](https://speced.github.io/bikeshed/#id-gen) for headings and definitions, based on their text.
* [textual shortcuts for autolinks](https://speced.github.io/bikeshed/#autolink-shortcuts): [[FOO]] for bibliography entries, &lt;&lt;foo>> for grammar productions, 'foo' for CSS property names, {{foo}} for IDL terms, and more.
* [boilerplate generation](https://speced.github.io/bikeshed/#boilerplate), both wholesale and piecemeal.
* [Bikeshed-flavored Markdown](https://speced.github.io/bikeshed/#markdown), a slight variant that is extra-friendly to intermixing with normal HTML. (Besides the few intentional divergences, compliance with [CommonMark](https://commonmark.org) is expected.)
* a [compact syntax](https://speced.github.io/bikeshed/#table-expansion) for writing property-definition tables.
* [automatic whitespace-prefix stripping](https://speced.github.io/bikeshed/#pre-whitespace-stripping) from `<pre>` contents, so the contents can be indented properly in your HTML.
* [automatic IDL processing and syntax-checking](https://speced.github.io/bikeshed/#idl) for `<pre class=idl>` contents, so you don't have to mark up every single significant term yourself.
* [automatic generation of railroad diagrams](https://speced.github.io/bikeshed/#railroad) from `<pre class='railroad'>` contents.

Documentation Sections
----------------------

The full Bikeshed documentation is generated by Bikeshed and [accessible here](https://speced.github.io/bikeshed/).

Note About Fatal Errors
-----------------------

Bikeshed generates "fatal errors" for lots of things that it wants you to fix,
but generally recovers gracefully from them anyway.
If you're getting a fatal error,
but don't have time to fix it and just need a spec **right now**,
you can force Bikeshed to generate anyway with the `-f` flag, like: `bikeshed -f spec`.

This is also sometimes useful when converting a spec to Bikeshed for the first time,
so you can see all the errors at once and fix them in whatever order is easiest,
rather than having to deal with them one-by-one with no idea when they'll end.
(You may also want to silence the warnings in this case,
to reduce visual noise until you've gotten it at least building successfully.
Use `bikeshed -qf spec`.)

Bikeshed File Extension
-----------------------

The preferred file extensions for Bikeshed source files is `bs`, like `index.bs`.
Bikeshed will automatically recognize `*.bs` files in the folder it's run in,
and assume that you want an output file of the same name with a `.html` extension.
The repository also contains a syntax highlighting script for Bikeshed source files.

(Bikeshed also recognizes files with `*.src.html` for backwards compatibility with older CSS specs,
though most such specs have switched their source file extensions to `.bs` now.
Using `.src.html` in most text editors will display the file with HTML source formatting,
which isn't generally what you want.)

License
-------

This document and all associated files in the github project are licensed under [CC0](https://creativecommons.org/publicdomain/zero/1.0/) ![](https://licensebuttons.net/p/zero/1.0/80x15.png).
This means you can reuse, remix, or otherwise appropriate this project for your own use **without restriction**.
(The actual legal meaning can be found at the above link.)
Don't ask me for permission to use any part of this project, **just use it**.
I would appreciate attribution, but that is not required by the license.


================================================
FILE: bikeshed/InputSource.py
================================================
from __future__ import annotations

import datetime
import email.utils
import errno
import os
import sys
import tarfile
import urllib.parse
from abc import abstractmethod

import attr
import requests
import tenacity

from . import config, constants, line, t
from . import messages as m


@attr.s(auto_attribs=True)
class InputContent:
    rawLines: list[str]
    date: datetime.date | None

    @property
    def lines(self) -> list[line.Line]:
        ret = []
        offset = 0
        for i, text in enumerate(self.rawLines, 1):
            lineNo = i + offset
            # The early HTML parser can change how nodes print,
            # so they occupy a different number of lines than they
            # had in the source. Markdown parser needs to know
            # the correct source lines, tho, so when this happens,
            # the nodes will insert special PUA chars to indicate that.
            # I can remove them here and properly adjust the line number.
            # Current known causes of this:
            # * line-ending -- turned into em dashes
            # * multi-line start tags
            # * multi-line markdown code spans;
            #     - the text loses its newlines
            #     - the original text goes into an attribute on the start
            #       tag now
            ilcc = constants.incrementLineCountChar
            dlcc = constants.decrementLineCountChar
            if ilcc in text:
                offset += text.count(ilcc)
                text = text.replace(ilcc, "")
            if dlcc in text:
                offset -= text.count(dlcc)
                text = text.replace(dlcc, "")

            ret.append(line.Line(lineNo, text))

        return ret

    @property
    def content(self) -> str:
        return "".join(self.rawLines)


def inputFromName(sourceName: str, **kwargs: t.Any) -> InputSource:
    if sourceName == "-":
        return StdinInputSource(sourceName)
    if sourceName.startswith("https:"):
        return UrlInputSource(sourceName)
    if not sourceName.endswith((".bs", ".src.html")) and os.path.exists(sourceName) and tarfile.is_tarfile(sourceName):
        return TarInputSource(sourceName, **kwargs)
    return FileInputSource(sourceName, **kwargs)


class InputSource:
    """Represents a thing that can produce specification input text.

    Input can be read from stdin ("-"), an HTTPS URL, or a file. Other
    InputSources can be found relative to URLs and files, and there's a context
    manager for temporarily switching to the directory of a file InputSource.
    """

    @abstractmethod
    def __str__(self) -> str:
        pass

    def __repr__(self) -> str:
        return "{}({!r})".format(self.__class__.__name__, str(self))

    def __hash__(self) -> int:
        return hash(str(self))

    def __eq__(self, other: object) -> bool:
        return str(self) == str(other)

    @abstractmethod
    def read(self) -> InputContent:
        """Fully reads the source."""

    def hasDirectory(self) -> bool:
        """Only some InputSources have a directory."""
        return False

    def directory(self) -> str:
        """Suitable for passing to subprocess(cwd=)."""
        msg = f"{type(self)} instances don't have directories."
        raise TypeError(msg)

    def relative(self, _: t.Any) -> InputSource | None:
        """Resolves relativePath relative to this InputSource.

        For example, InputSource("/foo/bar/baz.txt").relative("quux/fuzzy.txt")
        will be InputSource("/foo/bar/quux/fuzzy.txt").

        If this source type can't find others relative to itself, returns None.
        """
        return None

    def mtime(self) -> float | None:
        """Returns the last modification time of this source, if that's known."""
        return None

    def cheaplyExists(self, _: t.Any) -> bool | None:
        """If it's cheap to determine, returns whether relativePath exists.

        Otherwise, returns None.
        """
        return None

    def __getattr__(self, name: str) -> str:
        """Hack to make pylint happy, since all the attrs are defined
        on the subclasses that __new__ dynamically dispatches to.
        See https://stackoverflow.com/a/60731663/455535
        """
        m.warn(f"No member '{name}' contained in InputSource.")
        return ""


class StdinInputSource(InputSource):
    def __init__(self, sourceName: str, **kwargs: t.Any) -> None:  # pylint: disable=unused-argument
        assert sourceName == "-"
        self.type = "stdin"
        self.sourceName = sourceName
        self.content = None

    def __str__(self) -> str:
        return "-"

    def read(self) -> InputContent:
        return InputContent(sys.stdin.readlines(), None)


class UrlInputSource(InputSource):
    def __init__(self, sourceName: str, **kwargs: t.Any) -> None:  # pylint: disable=unused-argument
        assert sourceName.startswith("https:")
        self.sourceName = sourceName
        self.type = "url"

    def __str__(self) -> str:
        return self.sourceName

    @tenacity.retry(
        reraise=True,
        stop=tenacity.stop_after_attempt(3),
        wait=tenacity.wait_random(1, 2),
    )
    def _fetch(self) -> requests.Response:
        response = requests.get(self.sourceName, timeout=10)
        if response.status_code == 404:
            # This matches the OSErrors expected by older uses of
            # FileInputSource. It skips the retry, since the server has given us
            # a concrete, expected answer.
            raise FileNotFoundError(errno.ENOENT, response.text, self.sourceName)
        response.raise_for_status()
        return response

    def read(self) -> InputContent:
        response = self._fetch()
        date = None
        if "Date" in response.headers:
            # Use the response's Date header, although servers don't always set
            # this according to the last change to the file.
            date = email.utils.parsedate_to_datetime(response.headers["Date"]).date()
        return InputContent([x + "\n" for x in response.text.splitlines(False)], date)

    def relative(self, *relativePathSegs: str) -> UrlInputSource:
        return UrlInputSource(urllib.parse.urljoin(self.sourceName, "/".join(relativePathSegs)))


class FileInputSource(InputSource):
    def __init__(self, sourceName: str, *, chroot: bool, chrootPath: str | None = None) -> None:
        self.sourceName = sourceName
        self.chrootPath = chrootPath
        self.type = "file"
        self.content = None

        if chroot and self.chrootPath is None:
            self.chrootPath = self.directory()
        if self.chrootPath is not None:
            self.sourceName = config.chrootPath(self.chrootPath, self.sourceName)

    def __str__(self) -> str:
        return self.sourceName

    def read(self) -> InputContent:
        with open(self.sourceName, encoding="utf-8") as f:
            return InputContent(
                f.readlines(),
                datetime.datetime.fromtimestamp(os.path.getmtime(self.sourceName)).date(),
            )

    def hasDirectory(self) -> bool:
        return True

    def directory(self) -> str:
        return os.path.dirname(os.path.abspath(self.sourceName))

    def relative(self, *relativePathSegs: str) -> FileInputSource:
        return FileInputSource(
            os.path.join(self.directory(), *relativePathSegs),
            chroot=False,
            chrootPath=self.chrootPath,
        )

    def cheaplyExists(self, relativePath: str) -> bool:
        return os.access(self.relative(relativePath).sourceName, os.R_OK)

    def mtime(self) -> float | None:
        """Returns the last modification time of this file, or None if it doesn't exist."""
        try:
            return os.stat(self.sourceName).st_mtime
        except FileNotFoundError:
            return None


class TarInputSource(InputSource):
    def __init__(self, sourceName: str, *, tarMemberName: str = "index.bs", **_: t.Any) -> None:
        self.sourceName = sourceName
        self.tarMemberName = tarMemberName
        self.type = "tar"
        self.content = None

    def __str__(self) -> str:
        return self.sourceName + ":" + self.tarMemberName

    def read(self) -> InputContent:
        with self._openTarFile() as tarFile:
            mtime = self.mtime()
            if mtime is None:
                ts = None
            else:
                ts = datetime.datetime.fromtimestamp(mtime).date()
            try:
                taritem = tarFile.extractfile(self.tarMemberName)
                if taritem is None:
                    raise FileNotFoundError(
                        errno.ENOENT,
                        f"{self.tarMemberName} is in the tar file, but isn't a file itself.",
                    )
                with taritem as f:
                    # Decode the `bytes` to a `str`. (extractfile can't read as text.)
                    file_contents = f.read().decode(encoding="utf-8").splitlines(keepends=True)
                return InputContent(file_contents, ts)
            except KeyError as e:
                raise FileNotFoundError(errno.ENOENT, "Not found inside tar file", self.tarMemberName) from e

    def hasDirectory(self) -> bool:
        return False

    def directory(self) -> str:
        # It would be possible to produce a file listing. But not a meaningful directory path.
        msg = f"{type(self)} instances don't have directories."
        raise TypeError(msg)

    def relative(self, *relativePathSegs: str) -> TarInputSource:
        """Returns an InputSource relative to this file. Since a TarInputSource is always inside the
        tar file, any relative InputSource is also inside the tar file."""
        memberPath = os.path.join(os.path.dirname(self.tarMemberName), *relativePathSegs)
        return TarInputSource(self.sourceName, tarMemberName=memberPath)

    def cheaplyExists(self, relativePath: str) -> bool | None:
        memberPath = os.path.join(os.path.dirname(self.tarMemberName), relativePath)
        with self._openTarFile() as tarFile:
            members = tarFile.getnames()
            return memberPath in members

    def mtime(self) -> float | None:
        """Returns the last modification time of this file, or None if it doesn't exist."""
        try:
            return os.stat(self.sourceName).st_mtime
        except FileNotFoundError:
            return None

    def _openTarFile(self) -> tarfile.TarFile:
        """Open the tar file so archive members can be read."""
        # The same file gets opened numerous times in a single build, but it doesn't seem to be very
        # costly, and it's easier than trying to manually manage the TarFile resource lifetime.

        # "r:" specifies the tar file must be uncompressed.
        return tarfile.open(self.sourceName, mode="r:", encoding="utf-8")


================================================
FILE: bikeshed/Spec.py
================================================
# pylint: disable=attribute-defined-outside-init
from __future__ import annotations

import glob
import json
import os
import re
import sys
import time
from collections import OrderedDict, defaultdict
from datetime import datetime

from . import (
    InputSource,
    biblio,
    boilerplate,
    caniuse,
    cddl,
    conditional,
    constants,
    datablocks,
    dfns,
    doctypes,
    extensions,
    fingerprinting,
    h,
    headings,
    highlight,
    idl,
    includes,
    inlineTags,
    language,
    lint,
    markdown,
    mdn,
    metadata,
    refs,
    retrieve,
    shorthands,
    stylescript,
    t,
    wpt,
)
from . import line as l
from . import messages as m
from . import unsortedJunk as u

if t.TYPE_CHECKING:
    import widlparser


class Spec:
    def __init__(
        self,
        inputFilename: str,
        debug: bool = False,
        debugPrint: str | None = None,
        token: str | None = None,
        lineNumbers: bool = False,
        fileRequester: retrieve.DataFileRequester | None = None,
        testing: bool = False,
    ) -> None:
        catchArgparseBug(inputFilename)
        self.valid: bool = False
        self.lineNumbers: bool = lineNumbers
        if lineNumbers:
            # line-numbers are too hacky, so force this to be a dry run
            constants.dryRun = True
        if inputFilename is None:
            inputFilename = findImplicitInputFile()
        if inputFilename is None:  # still
            m.die(
                "No input file specified, and no *.bs or *.src.html files found in current directory.\nPlease specify an input file, or use - to pipe from STDIN.",
            )
            return
        self.inputSource: InputSource.InputSource = InputSource.inputFromName(inputFilename, chroot=constants.chroot)
        self.transitiveDependencies: set[InputSource.InputSource] = set()
        self.debug: bool = debug
        self.debugPrint: str | None = debugPrint
        self.token: str | None = token
        self.testing: bool = testing
        self.dataFile: retrieve.DataFileRequester
        if fileRequester is None:
            self.dataFile = retrieve.defaultRequester
        else:
            self.dataFile = fileRequester

        self.lines: list[l.Line] = []
        self.valid = self.initializeState()

    def initializeState(self) -> bool:
        self.normativeRefs: dict[str, biblio.BiblioEntry] = {}
        self.informativeRefs: dict[str, biblio.BiblioEntry] = {}
        self.refs: refs.ReferenceManager = refs.ReferenceManager(fileRequester=self.dataFile, testing=self.testing)
        self.externalRefsUsed: refs.ExternalRefsManager = refs.ExternalRefsManager()

        self.md: metadata.MetadataManager
        self.mdBaseline: metadata.MetadataManager | None = metadata.MetadataManager()
        self.mdDocument: metadata.MetadataManager | None = None
        self.mdCommandLine: metadata.MetadataManager | None = metadata.MetadataManager()
        self.mdDefaults: metadata.MetadataManager | None = None
        self.mdOverridingDefaults: metadata.MetadataManager | None = None

        self.typeExpansions: dict[str, str] = {}

        self.cachedLinksFromHref: OrderedDict[str, list[t.ElementT]] = OrderedDict()
        self.cachedClassTests: dict[tuple[str, str], bool] = {}
        self.cachedNormativeEls: dict[t.ElementT, bool] = {}

        defaultMacro: t.Callable[[], str] = lambda: "???"
        self.macros: t.DefaultDict[str, str] = defaultdict(defaultMacro)

        self.widl: widlparser.Parser = idl.getParser()

        self.languages: dict[str, language.Language] = fetchLanguages(self.dataFile)
        self.doctypes: doctypes.DoctypeManager = fetchDoctypes(self.dataFile)

        self.extraJC = stylescript.JCManager()
        self.extraJC.addColors()
        self.extraJC.addMdLists()
        self.extraJC.addAutolinks()
        self.extraJC.addSelflinks()
        self.extraJC.addCounters()
        self.extraJC.addIssues()

        try:
            self.inputContent = self.inputSource.read()
            if self.inputContent.date is not None:
                self.mdBaseline.addParsedData("Date", self.inputContent.date)
        except FileNotFoundError:
            m.die(f"Couldn't find the input file at the specified location '{self.inputSource}'.")
            return False
        except OSError:
            m.die(f"Couldn't open the input file '{self.inputSource}'.")
            return False

        return True

    def initMetadata(self, inputContent: InputSource.InputContent) -> None:
        # mdDefault is already set up
        # and cli() inited the mdCommandLine

        # Get the md from the doc itself
        # TODO: currently I just leave the node in,
        #       I should do something about that
        # TODO: Pure textual hack, no way to, say, put a block
        #       in a markdown code span or an <xmp> to show off.
        self.lines, self.mdDocument = metadata.parse(lines=inputContent.lines)

        # Combine the data so far, and compute the doctype
        # (the other md sources need the doctype in order to be found)
        self.md = metadata.join(self.mdBaseline, self.mdDocument, self.mdCommandLine)
        rawDoctype = (self.md.rawOrg, self.md.rawGroup, self.md.rawStatus)
        self.doctype = self.doctypes.getDoctype(self.md.rawOrg, self.md.rawGroup, self.md.rawStatus)

        self.mdDefaults = metadata.fromJson(
            data=retrieve.retrieveBoilerplateFile(self, "defaults"),
            source="defaults",
        )
        self.md = metadata.join(self.mdBaseline, self.mdDefaults, self.mdDocument, self.mdCommandLine)
        if rawDoctype != (self.md.rawOrg, self.md.rawGroup, self.md.rawStatus):
            # recompute doctype
            self.doctype = self.doctypes.getDoctype(self.md.rawOrg, self.md.rawGroup, self.md.rawStatus)

        # Using all of that, load up the text macros so I can sub them into the computed-metadata file.
        self.md.fillTextMacros(self.macros, doc=self)
        jsonEscapedMacros = {k: json.dumps(v)[1:-1] for k, v in self.macros.items()}

        computedMdText = h.replaceMacrosTextly(
            retrieve.retrieveBoilerplateFile(self, "computed-metadata"),
            macros=jsonEscapedMacros,
            context="? of computed-metadata.include",
        )
        self.mdOverridingDefaults = metadata.fromJson(data=computedMdText, source="computed-metadata")
        # And create the final, complete md combo
        self.md = metadata.join(
            self.mdBaseline,
            self.mdDefaults,
            self.mdOverridingDefaults,
            self.mdDocument,
            self.mdCommandLine,
        )
        # Finally, compute the "implicit" things.
        self.md.computeImplicitMetadata(doc=self)
        # And compute macros again, in case the preceding steps changed them.
        self.md.fillTextMacros(self.macros, doc=self)

        self.md.validate(doc=self)
        m.retroactivelyCheckErrorLevel()

    def earlyParse(self, inputContent: InputSource.InputContent) -> list[l.Line]:
        text = FIXMEreplaceMarkdownBlockquotes(inputContent.content)
        nodes = h.initialDocumentParse(text, h.ParseConfig.fromSpec(self))
        if self.debugPrint == "early-parse":
            h.debugNodes(nodes)
        text = h.strFromNodes(nodes, withIlcc=True)
        inputContent.rawLines = [x + "\n" for x in text.split("\n")]
        return inputContent.lines

    def checkValidity(self) -> bool:
        return True

    def recordDependencies(self, *inputSources: InputSource.InputSource) -> None:
        self.transitiveDependencies.update(inputSources)

    def preprocess(self) -> Spec:
        self.transitiveDependencies.clear()
        self.assembleDocument()
        self.processDocument()
        return self

    def assembleDocument(self) -> Spec:
        self.initMetadata(self.inputContent)
        self.recordDependencies(self.inputSource)

        self.lines = self.earlyParse(self.inputContent)

        if "mixed-indents" in self.md.complainAbout:
            if self.md.indentInfo and self.md.indentInfo.char:
                checkForMixedIndents(self.lines, self.md.indentInfo)

        extensions.load(self)

        # Initialize things
        self.refs.initializeRefs(doc=self, datablocks=datablocks)
        self.refs.initializeBiblio(doc=self)

        # Deal with markdown
        if self.debugPrint == "pre-md":
            print("".join(x.text for x in self.lines))  # noqa: T201
        if "markdown-block" in self.md.markupShorthands:
            self.lines = markdown.parse(self.lines, markdown.MarkdownConfig.fromSpec(self))
        if self.debugPrint == "post-md":
            print("".join(x.text for x in self.lines))  # noqa: T201

        # Convert to a single string of html now, for convenience.
        self.html = "".join(x.text for x in self.lines)
        boilerplate.addHeaderFooter(self)

        # Build the document
        self.document, self.head, self.body = h.parseDocument(self.html)
        if self.debugPrint == "boilerplate":
            print(h.printNodeTree(self.document))  # noqa: T201
        datablocks.transformDataBlocks(self, self.document)
        if self.debugPrint == "datablocks":
            print(h.printNodeTree(self.document))  # noqa: T201
        self.refs.setSpecData(self)
        u.correctFrontMatter(self)
        includes.processInclusions(self)
        metadata.parseDoc(self)
        return self

    def processDocument(self) -> Spec:
        # Fill in and clean up a bunch of data
        conditional.processConditionals(self)
        self.fillContainers: t.FillContainersT = u.locateFillContainers(self)
        lint.exampleIDs(self)
        wpt.processWptElements(self)

        boilerplate.addBikeshedVersion(self)
        boilerplate.addCanonicalURL(self)
        boilerplate.addFavicon(self)
        boilerplate.addSpecVersion(self)
        boilerplate.addStatusSection(self)
        boilerplate.addLogo(self)
        boilerplate.addCopyright(self)
        boilerplate.addSpecMetadataSection(self)
        boilerplate.addAbstract(self)
        boilerplate.addExpiryNotice(self)
        boilerplate.addObsoletionNotice(self)
        boilerplate.addAtRisk(self)
        u.addNoteHeaders(self)
        boilerplate.removeUnwantedBoilerplate(self)
        shorthands.run(self)
        inlineTags.processTags(self)
        u.canonicalizeShortcuts(self.body)
        u.addImplicitAlgorithms(self)
        u.fixManualDefTables(self)
        headings.processHeadings(self)
        u.checkVarHygiene(self)
        u.processIssuesAndExamples(self)
        idl.markupIDL(self)
        cddl.markupCDDL(self)
        u.inlineRemoteIssues(self)
        u.addImageSize(self)

        # Handle all the links
        u.processBiblioLinks(self)
        u.processDfns(self)
        u.processIDL(self)
        u.processCDDL(self)
        dfns.annotateDfns(self)
        u.formatArgumentdefTables(self)
        u.formatElementdefTables(self)
        u.processAutolinks(self)
        u.fixInterDocumentReferences(self)
        biblio.dedupBiblioReferences(self)
        boilerplate.addIndexSection(self)
        boilerplate.addExplicitIndexes(self)
        boilerplate.addStyles(self)
        boilerplate.addReferencesSection(self)
        boilerplate.addPropertyIndex(self)
        boilerplate.addIDLSection(self)
        boilerplate.addCDDLSection(self)
        boilerplate.addIssuesSection(self)
        boilerplate.addCustomBoilerplate(self)
        headings.processHeadings(self, "all")  # again
        boilerplate.removeUnwantedBoilerplate(self)
        boilerplate.addTOCSection(self)
        u.addSelfLinks(self)
        u.processAutolinks(self)
        boilerplate.removeUnwantedBoilerplate(self)
        # Add MDN panels after all IDs/anchors have been added
        mdn.addMdnPanels(self)
        caniuse.addCanIUsePanels(self)
        highlight.addSyntaxHighlighting(self)
        boilerplate.addBikeshedBoilerplate(self)
        boilerplate.addDarkmodeIndicators(self)
        fingerprinting.addTrackingVector(self)
        u.fixIntraDocumentReferences(self)
        u.fixInterDocumentReferences(self)
        u.verifyUsageOfAllLocalBiblios(self)
        u.removeMultipleLinks(self)
        u.forceCrossorigin(self)
        addDomintroStyles(self)
        lint.brokenLinks(self)
        lint.accidental2119(self)
        lint.missingExposed(self)
        lint.requiredIDs(self)
        lint.unusedInternalDfns(self)

        if self.debugPrint == "final":
            print(h.printNodeTree(self.document))  # noqa: T201

        # Any final HTML cleanups
        u.cleanupHTML(self)
        if self.md.prepTR:
            # Don't try and override the W3C's icon.
            for el in h.findAll("[rel ~= 'icon']", self):
                h.removeNode(el)
            # Make sure the W3C stylesheet is after all other styles.
            for el in h.findAll("link", self):
                if el.get("href", "").startswith("https://www.w3.org/StyleSheets/TR"):
                    h.appendChild(self.head, el)
            # Ensure that all W3C links are https.
            for el in h.findAll("a", self):
                href = el.get("href", "")
                if href.startswith("http://www.w3.org") or href.startswith("http://lists.w3.org"):
                    el.set("href", "https" + href[4:])
                text = el.text or ""
                if text.startswith("http://www.w3.org") or text.startswith("http://lists.w3.org"):
                    el.text = "https" + text[4:]
            # Loaded from .include files
            extensions.BSPrepTR(self)  # type: ignore # pylint: disable=no-member

        return self

    def serialize(self) -> str | None:
        try:
            rendered = h.Serializer(self.md.opaqueElements, self.md.blockElements).serialize(self.document)
        except Exception as e:
            m.die(str(e))
            return None
        rendered = u.finalHackyCleanup(rendered)
        return rendered

    def fixMissingOutputFilename(self, outputFilename: str | None) -> str:
        if outputFilename is None:
            # More sensible defaults!
            if isinstance(self.inputSource, InputSource.TarInputSource):
                outputFilename = os.path.splitext(self.inputSource.sourceName)[0] + ".html"
            elif not isinstance(self.inputSource, InputSource.FileInputSource):
                outputFilename = "-"
            elif self.inputSource.sourceName.endswith(".bs"):
                outputFilename = self.inputSource.sourceName[0:-3] + ".html"
            elif self.inputSource.sourceName.endswith(".src.html"):
                outputFilename = self.inputSource.sourceName[0:-9] + ".html"
            else:
                outputFilename = "-"
        return outputFilename

    def finish(self, outputFilename: str | None = None, newline: str | None = None) -> None:
        # Check the errors one more time.
        m.retroactivelyCheckErrorLevel(timing="late")
        catchArgparseBug(outputFilename)
        self.printResultMessage()
        outputFilename = self.fixMissingOutputFilename(outputFilename)
        rendered = self.serialize()
        if rendered and not constants.dryRun:
            try:
                if outputFilename == "-":
                    sys.stdout.write(rendered)
                else:
                    with open(outputFilename, "w", encoding="utf-8", newline=newline) as f:
                        f.write(rendered)
            except Exception as e:
                m.die(f"Something prevented me from saving the output document to {outputFilename}:\n{e}")

    def printResultMessage(self) -> None:
        # If I reach this point, I've succeeded, but maybe with reservations.
        fatals = m.state.categoryCounts["fatal"]
        links = m.state.categoryCounts["link-error"]
        warnings = m.state.categoryCounts["warning"]
        if self.lineNumbers:
            m.warn("Because --line-numbers was used, no output was saved.")
        if fatals:
            m.success("Successfully generated, but fatal errors were suppressed")
            return
        if links:
            m.success(f"Successfully generated, with {links} linking errors")
            return
        if warnings:
            m.success("Successfully generated, with warnings")
            return

    def watch(self, outputFilename: str | None, port: int | None = None, localhost: bool = False) -> None:
        if m.wrappedOutput():
            m.die(f"Watch mode only supports console output; you've set --print={m.state.printMode}")
            return

        outputFilename = self.fixMissingOutputFilename(outputFilename)
        if self.inputSource.mtime() is None:
            m.die(f"Watch mode doesn't support {self.inputSource}")
            return
        if outputFilename == "-":
            m.die("Watch mode doesn't support streaming to STDOUT.")
            return

        if port:
            # Serve the folder on an HTTP server
            import http.server  # noqa: PLC0415
            import socketserver  # noqa: PLC0415
            import threading  # noqa: PLC0415

            class SilentServer(http.server.SimpleHTTPRequestHandler):
                def log_message(self, format: t.Any, *args: t.Any) -> None:
                    pass

            socketserver.TCPServer.allow_reuse_address = True
            server = socketserver.TCPServer(("localhost" if localhost else "", port), SilentServer)

            print(f"Serving at http://localhost:{port}/")  # noqa: T201
            thread = threading.Thread(target=server.serve_forever)
            thread.daemon = True
            thread.start()
        else:
            server = None

        mdCommandLine = self.mdCommandLine

        try:
            self.preprocess()
            self.finish(outputFilename)
            lastInputModified = {dep: dep.mtime() for dep in self.transitiveDependencies}
            printDone()
            try:
                while True:
                    # Comparing mtimes with "!=" handles when a file starts or
                    # stops existing, and it's fine to rebuild if an mtime
                    # somehow gets older.
                    if any(input.mtime() != lastModified for input, lastModified in lastInputModified.items()):
                        m.state = m.state.replace()
                        m.say("Source file modified. Rebuilding...")
                        self.initializeState()
                        self.mdCommandLine = mdCommandLine
                        self.preprocess()
                        self.finish(outputFilename)
                        lastInputModified = {dep: dep.mtime() for dep in self.transitiveDependencies}
                        printDone()
                    time.sleep(1)
            except KeyboardInterrupt:
                m.say("Exiting~")
                if server:
                    server.shutdown()
                    thread.join()
                m.printCloser()
                sys.exit(0)
        except Exception as e:
            m.die(f"Something went wrong while watching the file:\n{e}")

    def printTargets(self) -> None:
        exportMsg = "Exported terms:\n"
        for el in h.findAll("[data-export]", self):
            for term in h.linkTextsFromElement(el):
                exportMsg += "  " + term + "\n"
        m.say(exportMsg)
        unexportMsg = "Unexported terms:\n"
        for el in h.findAll("[data-noexport]", self):
            for term in h.linkTextsFromElement(el):
                unexportMsg += "  " + term + "\n"
        m.say(unexportMsg)

    def isOpaqueElement(self, el: t.ElementT) -> bool:
        if el.tag in ("pre", "xmp", "script", "style"):
            return True
        if el.tag in self.md.opaqueElements:
            return True
        if el.get("data-opaque") is not None or el.get("bs-opaque") is not None:
            return True
        return False


def printDone() -> None:
    contents = f"Finished at {datetime.now().strftime('%H:%M:%S %b-%d-%Y')}"
    contentLen = len(contents) + 2
    if not m.state.asciiOnly:
        m.p(f"╭{'─'*contentLen}╮")
        m.p(f"│ {contents} │")
        m.p(f"╰{'─'*contentLen}╯")
        m.p("")
    else:
        m.p(f"/{'-'*contentLen}\\")
        m.p(f"| {contents} |")
        m.p(f"\\{'-'*contentLen}/")
        m.p("")


def findImplicitInputFile() -> str | None:
    """
    Find what input file the user *probably* wants to use,
    by scanning the current folder.
    In preference order:
    1. index.bs
    2. Overview.bs
    3. the first file with a .bs extension
    4. the first file with a .src.html extension
    """

    if os.path.isfile("index.bs"):
        return "index.bs"
    if os.path.isfile("Overview.bs"):
        return "Overview.bs"

    allBs = glob.glob("*.bs")
    if allBs:
        return allBs[0]

    allHtml = glob.glob("*.src.html")
    if allHtml:
        return allHtml[0]

    return None


def catchArgparseBug(string: str | None) -> bool:
    # Argparse has had a long-standing bug
    # https://bugs.python.org/issue22433
    # about spaces in the values of unknown optional arguments
    # (even when the space is in a quoted string!).
    # I can't fix this without doing a lot of work myself,
    # but I *can* discover when it has been tripped,
    # as the input or output filename will look like
    # a command-line flag, very unlikely on its own.

    if isinstance(string, str) and string.startswith("--") and "=" in string:
        m.die(
            "You're hitting a bug with Python's argparse library. Please specify both the input and output filenames manually, and move all command-line flags with spaces in their values to after those arguments.\nSee <https://speced.github.io/bikeshed/#md-issues> for details.",
        )
        return False
    return True


def fetchLanguages(dataFile: retrieve.DataFileRequester) -> dict[str, language.Language]:
    return {
        k: language.Language(v["name"], v["native-name"])
        for k, v in json.loads(dataFile.fetch("languages.json", str=True)).items()
    }


def fetchDoctypes(dataFile: retrieve.DataFileRequester) -> doctypes.DoctypeManager:
    return doctypes.DoctypeManager.fromKdlStr(dataFile.fetch("boilerplate", "doctypes.kdl", str=True))


def addDomintroStyles(doc: Spec) -> None:
    # Adds common WHATWG styles for domintro blocks.

    if h.find(".domintro", doc) is None:
        return

    doc.extraJC.addDomintro()


def checkForMixedIndents(lines: t.Sequence[l.Line], info: metadata.IndentInfo) -> None:
    badIndentChar = " " if info.char == "\t" else "\t"
    inComment = False
    for line in lines:
        if not inComment and line.text.startswith("<!--"):
            inComment = True
        if inComment and "-->" in line.text:
            inComment = False
            continue
        if inComment:
            continue
        if not line.text:
            continue
        if line.text.startswith(badIndentChar):
            if info.char == " ":
                m.lint("Line starts with tabs, but document is space-indented", lineNum=line.i)
            else:
                m.lint("Line starts with spaces, but document is tab-indented", lineNum=line.i)
        if re.match(r"(\t+ +\t)|( +\t)", line.text):
            m.lint("Line's indent contains tabs after spaces.", lineNum=line.i)


def FIXMEreplaceMarkdownBlockquotes(text: str) -> str:
    # Temporary hack to make the early HTML pass not be broken
    # by Markdown blockquotes.
    # * finds sequences of lines that share a ws + angle bracket prefix
    # * replaces first such > with a blockquote-open PUA
    # * replaces subsequent > with a space
    # * adds a blockquote-close PUA to the end of last line
    # * the HTML parser recognizes those PUAs and emits the correct start/end tags.

    lines = text.split("\n")
    i = 0
    while True:
        if i >= len(lines):
            break
        match = re.match(r"\s*>\s?", lines[i])
        if not match:
            i += 1
            continue
        if i + 1 < len(lines) and re.match(r"\s*>\s?", lines[i + 1]):
            lines[i] = constants.bqStart + lines[i][len(match[0]) :]
            i += 1
            while i < len(lines) and re.match(r"\s*>\s?", lines[i]):
                match = re.match(r"\s*>\s?", lines[i])
                assert match is not None
                lines[i] = lines[i][len(match[0]) :]
                i += 1
            lines[i - 1] += constants.bqEnd
        else:
            i += 1
    return "\n".join(lines)


================================================
FILE: bikeshed/__init__.py
================================================
# pylint: disable=wrong-import-position

from __future__ import annotations

import os
import platform
import subprocess
import sys


def verify_python_version() -> None:
    if sys.version_info < (3, 12):
        print(
            """Bikeshed now requires Python 3.12 or higher; you are on {}.
    For instructions on how to set up a pyenv with 3.12, see:
    https://speced.github.io/bikeshed/#installing""".format(
                platform.python_version(),
            ),
        )
        sys.exit(1)


verify_python_version()


from . import (
    config,
    update,
)
from .cli import main
from .Spec import Spec


================================================
FILE: bikeshed/__main__.py
================================================
from .cli import main

main()


================================================
FILE: bikeshed/biblio.py
================================================
from __future__ import annotations

import abc
import dataclasses
import json
from collections import defaultdict

from . import constants, h, t
from . import messages as m


@dataclasses.dataclass
class BiblioEntry(metaclass=abc.ABCMeta):
    linkText: str
    title: str | None = None
    snapshotURL: str | None = None
    currentURL: str | None = None
    preferredStatus: str = constants.refStatus.snapshot
    originalLinkText: str | None = None
    obsoletedBy: str | None = None
    order: int = 0

    @property
    def url(self) -> str:
        if self.snapshotURL is None and self.currentURL is None:
            return ""

        if self.preferredStatus == constants.refStatus.snapshot:
            # At least one of these is non-None so this is safe
            return t.cast(str, self.snapshotURL or self.currentURL)
        elif self.preferredStatus == constants.refStatus.current:
            return t.cast(str, self.currentURL or self.snapshotURL)
        else:
            msg = f"Invalid preferredStatus value: {self.preferredStatus}"
            raise ValueError(msg)

    @abc.abstractmethod
    def toHTML(self) -> t.ElementT: ...

    @abc.abstractmethod
    def valid(self) -> bool: ...

    def strip(self) -> BiblioEntry:
        self.linkText = self.linkText.strip()
        if self.title:
            self.title = self.title.strip()
        if self.snapshotURL:
            self.snapshotURL = self.snapshotURL.strip()
        if self.currentURL:
            self.currentURL = self.currentURL.strip()
        if self.obsoletedBy:
            self.obsoletedBy = self.obsoletedBy.strip()
        return self


@dataclasses.dataclass
class NormalBiblioEntry(BiblioEntry):
    authors: list[str] = dataclasses.field(default_factory=list)
    etAl: bool = False
    status: str | None = None
    date: str | None = None
    other: str | None = None

    def toHTML(self) -> t.ElementT:
        ret: list[t.NodeT] = []

        s = ""
        etAl = self.etAl
        if len(self.authors) == 1:
            s += self.authors[0]
        elif len(self.authors) < 4:
            s += "; ".join(self.authors)
        elif len(self.authors) != 0:
            s += self.authors[0]
            etAl = True

        if s != "":
            s += "; et al. " if etAl else ". "
        ret.append(s)

        if self.url:
            ret.append(h.E.a({"href": self.url}, h.E.cite(self.title)))
            ret.append(". ")
        else:
            ret.append(h.E.cite(self.title))
            ret.append(". ")

        s = ""
        if self.preferredStatus == "current" and self.currentURL:
            pass
        else:
            if self.date:
                s += self.date + ". "
            if self.status:
                s += self.status + ". "
        if self.other:
            s += self.other + " "
        ret.append(s)

        if self.url:
            ret.append("URL: ")
            ret.append(h.E.a({"href": self.url}, self.url))

        return h.E.inline({}, *ret)

    def valid(self) -> bool:
        return self.title is not None

    def strip(self) -> NormalBiblioEntry:
        super().strip()
        if self.authors:
            self.authors = [x.strip() for x in self.authors]
        if self.status:
            self.status = self.status.strip()
        if self.date:
            self.date = self.date.strip()
        if self.other:
            self.other = self.other.strip()
        return self


class SpecBiblioEntry(BiblioEntry):
    """
    Generates a "fake" biblio entry from a spec reference,
    for when we don't have "real" bibliography data for a reference.
    """

    def __init__(self, spec: dict[str, str], preferredStatus: str | None = None, order: int = 0) -> None:
        super().__init__(
            linkText=spec["vshortname"],
            title=spec["description"],
            snapshotURL=spec["snapshot_url"],
            currentURL=spec["current_url"],
            preferredStatus=preferredStatus or constants.refStatus.snapshot,
            order=order,
        )

    def valid(self) -> bool:
        return self.snapshotURL is not None or self.currentURL is not None

    def toHTML(self) -> t.ElementT:
        return h.E.inline(
            {},
            self.title,
            " URL: ",
            h.E.a({"href": self.url}, self.url),
        )


class StringBiblioEntry(BiblioEntry):
    """
    Generates a barebones biblio entry from a preformatted biblio string.
    This only exists because SpecRef still has a few of them;
    don't use it on purpose for real things in the future.
    """

    data: str

    def __init__(self, linkText: str, data: str, order: int = 0) -> None:
        doc = h.E.div({}, *h.parseHTML(data))
        titleEl = h.find("cite", doc)
        if titleEl is not None:
            title = h.textContent(titleEl)
        else:
            title = h.textContent(doc)
        super().__init__(
            linkText=linkText,
            title=title,
            order=order,
        )
        self.data = data

    def valid(self) -> bool:
        return True

    def toHTML(self) -> t.ElementT:
        return h.E.inline({}, *h.parseHTML(self.data.strip()))


class AliasBiblioEntry(BiblioEntry):
    """
    Represents an alias entry,
    which is just an alternate name for some other entry.
    """

    aliasOf: str

    def __init__(self, linkText: str, aliasOf: str, order: int = 0) -> None:
        super().__init__(linkText=linkText, order=order)
        self.aliasOf = aliasOf.strip()

    def valid(self) -> bool:
        return True

    def toHTML(self) -> t.ElementT:
        return h.E.small({}, f"(alias of {self.aliasOf})")


def processSpecrefBiblioFile(text: str, storage: t.BiblioStorageT, order: int) -> t.BiblioStorageT:
    r"""
    A SpecRef file is a JSON object, where keys are ids
    and values are either <alias>, <legacyRef>, or <ref>.

    <alias>: {
        *aliasOf: <id>,
        id: <id>
    }

    <legacyRef>: <string>

    <ref>: {
        id: <id>,
        authors: [<string>],
        etAl: <bool>,
        href: <url>,
        *title: <string>,
        date: <date>,
        deliveredBy: [<wg>],
        status: <string>,
        publisher: <string>,
        obsoletes: [<id>],
        obsoletedBy: [<id>],
        versionOf: <id>,
        versions: [<id>],
        edDraft: <url>
    }

    <date>: /^([1-3]?\d\s)?((?:January|February|March|April|May|June|July|August|September|October|November|December)\s)?\d+$/

    <wg>: {*url:<url>, *shortname:<string>}
    """
    try:
        datas = json.loads(text)
    except Exception as e:
        m.die(f"Couldn't read the local JSON file:\n{e}")
        return storage

    # JSON field name: BiblioEntry name
    fields = {
        "authors": "authors",
        "etAl": "etAl",
        "href": "snapshotURL",
        "edDraft": "currentURL",
        "title": "title",
        "date": "date",
        "status": "status",
    }

    obsoletedBy: dict[str, str] = {}
    biblio: BiblioEntry
    for biblioKey, data in datas.items():
        biblioKey = biblioKey.strip()
        if isinstance(data, str):
            # Handle <legacyRef>
            biblio = StringBiblioEntry(linkText=biblioKey, order=order, data=data.replace("\n", " "))
        elif "aliasOf" in data:
            # Handle <alias>
            if biblioKey.lower() == data["aliasOf"].lower():
                # SpecRef uses aliases to handle capitalization differences,
                # which I don't care about.
                continue
            biblio = AliasBiblioEntry(linkText=biblioKey, order=order, aliasOf=data["aliasOf"])
        else:
            # Handle <ref>
            bib = {"linkText": biblioKey, "order": order}
            for jsonField, biblioField in fields.items():
                if jsonField in data:
                    bib[biblioField] = data[jsonField]
            if "versionOf" in data:
                # "versionOf" entries are all snapshot urls,
                # so you want the href *all* the time.
                bib["currentURL"] = data["href"]
            if "obsoletedBy" in data:
                for v in data["obsoletedBy"]:
                    obsoletedBy[biblioKey.lower()] = v.lower()
            if "obsoletes" in data:
                for v in data["obsoletes"]:
                    obsoletedBy[v.lower()] = biblioKey.lower()
            biblio = NormalBiblioEntry(**bib)
        storage[biblioKey.lower()].append(biblio)
    for old, new in obsoletedBy.items():
        if old in storage:
            for biblio in storage[old]:
                biblio.obsoletedBy = new
    return storage


def loadBiblioDataFile(lines: t.Iterator[str], storage: t.BiblioStorageT) -> None:
    b: dict[str, t.Any]
    biblio: BiblioEntry
    try:
        while True:
            fullKey = next(lines)
            prefix, key = fullKey[0], fullKey[2:].strip()
            if prefix == "d":
                b = {
                    "linkText": next(lines).strip(),
                    "date": next(lines),
                    "status": next(lines),
                    "title": next(lines),
                    "snapshotURL": next(lines),
                    "currentURL": next(lines),
                    "obsoletedBy": next(lines),
                    "other": next(lines),
                    "etAl": next(lines) != "\n",
                    "order": 3,
                    "authors": [],
                }
                while True:
                    line = next(lines)
                    if line == "-\n":
                        break
                    b["authors"].append(line)
                biblio = NormalBiblioEntry(**b)
            elif prefix == "s":
                b = {
                    "linkText": next(lines).strip(),
                    "data": next(lines),
                    "order": 3,
                }
                line = next(lines)  # Eat the -
                biblio = StringBiblioEntry(**b)
            elif prefix == "a":
                b = {
                    "linkText": next(lines).strip(),
                    "aliasOf": next(lines).strip(),
                    "order": 3,
                }
                line = next(lines)  # Eat the -
                biblio = AliasBiblioEntry(**b)
            else:
                m.die(f"Unknown biblio prefix '{prefix}' on key '{fullKey}'")
                continue
            storage[key].append(biblio)
    except StopIteration:
        pass


def levenshtein(a: str, b: str) -> int:
    "Calculates the Levenshtein distance between a and b."
    n, m = len(a), len(b)  # pylint: disable=redefined-outer-name
    if n > m:
        # Make sure n <= m, to use O(min(n,m)) space
        a, b = b, a
        n, m = m, n

    current: list[int] = list(range(n + 1))
    for i in range(1, m + 1):
        previous, current = current, [i] + [0] * n
        for j in range(1, n + 1):
            add, delete = previous[j] + 1, current[j - 1] + 1
            change = previous[j - 1]
            if a[j - 1] != b[i - 1]:
                change = change + 1
            current[j] = min(add, delete, change)

    return current[n]


def findCloseBiblios(biblioKeys: t.Sequence[str], target: str, n: int = 5) -> list[str]:
    """
    Finds biblio entries close to the target.
    Returns all biblios with target as the substring,
    plus the 5 closest ones per levenshtein distance.
    """
    target = target.lower()
    names: list[tuple[str, int]] = []
    superStrings: list[str] = []

    for name in sorted(biblioKeys):
        if target in name:
            superStrings.append(name)
        else:
            distance = levenshtein(name, target)
            tup = (name, distance)
            if len(names) < n:
                names.append(tup)
                names.sort(key=lambda x: x[1])
            elif distance >= names[-1][1]:
                pass
            else:
                for i, entry in enumerate(names):
                    if distance < entry[1]:
                        names.insert(i, tup)
                        names.pop()
                        break
    return sorted(s.strip() for s in superStrings) + [name.strip() for name, d in names]


def dedupBiblioReferences(doc: t.SpecT) -> None:
    """
    SpecRef has checks in its database preventing multiple references from having the same URL.
    Shepherd, while it doesn't have an explicit check for this,
    should also generally have unique URLs.
    But these aren't uniqued against each other.
    So, if you explicitly biblio-link to a SpecRef spec,
    and autolink to a Shepherd spec,
    you might get two distinct biblio entries with the exact same URL.

    This code checks for this,
    and deletes Shepherd biblio if there's a SpecRef biblio with the same URL.
    It then adjusts doc.externalRefsUsed to point to the SpecRef biblio.
    """

    def isShepherdRef(ref: BiblioEntry) -> bool:
        return isinstance(ref, SpecBiblioEntry)

    normSpecRefRefs = {}
    normShepherdRefs = {}
    informSpecRefRefs = {}
    informShepherdRefs = {}
    for ref in doc.normativeRefs.values():
        if isShepherdRef(ref):
            normShepherdRefs[ref.url] = ref
        else:
            normSpecRefRefs[ref.url] = ref
    for ref in doc.informativeRefs.values():
        if isShepherdRef(ref):
            informShepherdRefs[ref.url] = ref
        else:
            informSpecRefRefs[ref.url] = ref
    normSpecRefUrls = set(normSpecRefRefs.keys())
    normShepherdUrls = set(normShepherdRefs.keys())
    informSpecRefUrls = set(informSpecRefRefs.keys())
    informShepherdUrls = set(informShepherdRefs.keys())
    specRefUrls = normSpecRefUrls | informSpecRefUrls
    shepherdUrls = normShepherdUrls | informShepherdUrls
    dupedUrls = shepherdUrls & specRefUrls

    if not dupedUrls:
        return

    # If an informative duped URL is SpecRef,
    # and a normative Shepherd version also exists,
    # mark it for "upgrading", so the SpecRef becomes normative.
    upgradeUrls = dupedUrls & informSpecRefUrls & normShepherdUrls
    upgradeRefs = {}
    popInformatives = []
    for key, ref in doc.informativeRefs.items():
        if ref.url in upgradeUrls and not isShepherdRef(ref):
            upgradeRefs[ref.url] = ref
            popInformatives.append(key)
    for key in popInformatives:
        doc.informativeRefs.pop(key)
    for key, ref in doc.normativeRefs.items():
        if ref.url in upgradeUrls:
            doc.normativeRefs[key] = upgradeRefs[ref.url]

    for url in upgradeUrls:
        normShepherdUrls.discard(url)
        informSpecRefUrls.discard(url)
        normSpecRefUrls.add(url)
    shepherdUrls = normShepherdUrls | informShepherdUrls
    specRefUrls = normSpecRefUrls | informSpecRefUrls
    dupedUrls = shepherdUrls & specRefUrls

    # Remove all the Shepherd refs that are left in duped
    poppedKeys: t.DefaultDict[str, dict[str, str]] = defaultdict(dict)
    for key, ref in list(doc.informativeRefs.items()):
        if ref.url in dupedUrls:
            if isShepherdRef(ref):
                doc.informativeRefs.pop(key)
                poppedKeys[ref.url]["shepherd"] = key
            else:
                poppedKeys[ref.url]["specref"] = key
    for key, ref in list(doc.normativeRefs.items()):
        if ref.url in dupedUrls:
            if isShepherdRef(ref):
                doc.normativeRefs.pop(key)
                poppedKeys[ref.url]["shepherd"] = key
            else:
                poppedKeys[ref.url]["specref"] = key

    # For every key that was popped,
    # swap out the "externalRefsUsed" for that key
    for keys in poppedKeys.values():
        if "shepherd" not in keys or "specref" not in keys:
            continue
        oldName = keys["shepherd"]
        newName = keys["specref"]
        if oldName in doc.externalRefsUsed.specs:
            oldSpecData = doc.externalRefsUsed.specs[oldName]
            del doc.externalRefsUsed.specs[oldName]
            if newName not in doc.externalRefsUsed.specs:
                # just move it over
                doc.externalRefsUsed.specs[newName] = oldSpecData
                continue
            else:
                # Merge it in
                newSpecData = doc.externalRefsUsed.specs[newName]
                if newSpecData.biblio is None:
                    newSpecData.biblio = oldSpecData.biblio
                for refGroup in oldSpecData.refs.values():
                    for forVal, refWrapper in refGroup.valuesByFor.items():
                        newSpecData.addRef(refWrapper, forVal)


================================================
FILE: bikeshed/boilerplate/README.md
================================================
Boilerplate Files Have Moved
============================

If you're here to modify or create a boilerplate file,
they've moved to a separate [bikeshed-boilerplate](https://github.com/speced/bikeshed-boilerplate) project,
to make it easier to update boilerplates
without having to roll new pip releases for Bikeshed.

Please file any PRs there.

================================================
FILE: bikeshed/boilerplate.py
================================================
from __future__ import annotations

import copy
import dataclasses
import os
import re
import subprocess
from collections import OrderedDict, defaultdict
from datetime import datetime

from . import conditional, config, dfnpanels, h, retrieve, t
from . import messages as m
from . import refs as r
from .translate import _t

if t.TYPE_CHECKING:
    type MetadataValueT = t.NodeT | None
    type MetadataT = t.Mapping[str, list[MetadataValueT]]


def boilerplateFromHtml(doc: t.SpecT, htmlString: str, context: str) -> list[t.NodeT]:
    htmlString = h.parseText(htmlString, h.ParseConfig.fromSpec(doc, context=context), context=context)
    # FIXME: Here I'm having to pass a value that's already an EarlyParsedHtmlStr
    # (and thus should be safe for parsing into a doc) back thru h.safeHtml(),
    # because h.parseHTML() is still using the lxml parser, not my SimpleParser,
    # so the virtualLinebreak chars don't get handled unless I do it myself.
    bp = h.E.div({}, *h.parseHTML(h.safeHtml(htmlString)))
    conditional.processConditionals(doc, bp)
    return h.childNodes(bp, clear=True)


def loadBoilerplate(doc: t.SpecT, filename: str, bpname: str | None = None) -> None:
    if bpname is None:
        bpname = filename
    html = retrieve.retrieveBoilerplateFile(doc, filename)
    el = boilerplateFromHtml(doc, html, context=f"{filename} boilerplate")
    fillWith(bpname, el, doc=doc)


def addBikeshedVersion(doc: t.SpecT) -> None:
    # Adds a <meta> containing the current Bikeshed semver.
    if "generator" not in doc.md.boilerplate:
        return
    try:
        # Check that we're in the bikeshed repo
        origin = subprocess.check_output(
            "git remote -v",
            cwd=config.scriptPath(),
            stderr=subprocess.DEVNULL,
            shell=True,
        ).decode(encoding="utf-8")
        if "bikeshed" not in origin:
            # In a repo, but not bikeshed's;
            # probably pip-installed into an environment's repo or something.
            raise Exception
        # Otherwise, success, this is a -e install,
        # so we're in Bikeshed's repo.
        bikeshedVersion = (
            subprocess.check_output(
                r"git log -1 --format='Bikeshed version %h, updated %cd'",
                cwd=config.scriptPath(),
                stderr=subprocess.DEVNULL,
                shell=True,
            )
            .decode(encoding="utf-8")
            .strip()
        )
    except Exception:
        # Not in Bikeshed's repo, so instead grab from the datafile.
        bikeshedVersion = doc.dataFile.fetch("bikeshed-version.txt", fileType="readonly", str=True).strip()
    h.appendChild(doc.head, h.E.meta({"name": "generator", "content": bikeshedVersion}))


def addCanonicalURL(doc: t.SpecT) -> None:
    # Adds a <link rel=canonical> to the configured canonical url
    if doc.md.canonicalURL:
        h.appendChild(doc.head, h.E.link({"rel": "canonical", "href": doc.md.canonicalURL}))


def addFavicon(doc: t.SpecT) -> None:
    # Adds a <link rel=icon> to the configured favicon url
    if doc.md.favicon:
        h.appendChild(doc.head, h.E.link({"rel": "icon", "href": doc.md.favicon}))


def addSpecVersion(doc: t.SpecT) -> None:
    # Adds a <meta> with the current spec revision, if one was detected
    if "document-revision" not in doc.md.boilerplate:
        return

    if not doc.inputSource.hasDirectory():
        return

    revision = None
    source_dir = doc.inputSource.directory()
    try:
        # Check for a Git repo
        with open(os.devnull, "wb") as fnull:
            revision = (
                subprocess.check_output("git rev-parse HEAD", stderr=fnull, shell=True, cwd=source_dir)
                .decode(encoding="utf-8")
                .strip()
            )
    except subprocess.CalledProcessError:
        try:
            # Check for an Hg repo
            with open(os.devnull, "wb") as fnull:
                revision = (
                    subprocess.check_output(
                        "hg parent --temp='{node}'",
                        stderr=fnull,
                        shell=True,
                        cwd=source_dir,
                    )
                    .decode(encoding="utf-8")
                    .strip()
                )
        except subprocess.CalledProcessError:
            pass
    if revision:
        h.appendChild(doc.head, h.E.meta({"name": "revision", "content": revision}))


def addHeaderFooter(doc: t.SpecT) -> None:
    header = retrieve.retrieveBoilerplateFile(doc, "header") if "header" in doc.md.boilerplate else ""
    footer = retrieve.retrieveBoilerplateFile(doc, "footer") if "footer" in doc.md.boilerplate else ""

    doc.html = "\n".join(
        [
            h.parseText(header, h.ParseConfig.fromSpec(doc, context="header.include"), context=None),
            doc.html,
            h.parseText(footer, h.ParseConfig.fromSpec(doc, context="footer.include"), context=None),
        ],
    )


def fillWith(tag: str, newElements: t.Sequence[t.NodeT], doc: t.SpecT) -> None:
    for el in doc.fillContainers[tag]:
        h.replaceContents(el, newElements)


def getFillContainer(tag: str, doc: t.SpecT, default: bool = False) -> t.ElementT | None:
    """
    Gets the element that should be filled with the stuff corresponding to tag.
    If it returns None, don't generate the section.

    If default=True,
    indicates that this is a "default on" section,
    and will be appended to <body> unless explicitly suppressed.
    Otherwise,
    it'll only be appended if explicitly requested with a data-fill-with attribute.
    """

    # If you've explicitly suppressed that section, don't do anything
    if tag not in doc.md.boilerplate:
        return None

    # If a fill-with is found, fill that
    if doc.fillContainers[tag]:
        return doc.fillContainers[tag][0]

    # Otherwise, append to the end of the document,
    # unless you're in the byos group
    if doc.doctype.group.name == "BYOS":
        return None
    if default:
        return doc.body
    return None


def addLogo(doc: t.SpecT) -> None:
    loadBoilerplate(doc, "logo")


def addCopyright(doc: t.SpecT) -> None:
    loadBoilerplate(doc, "copyright")


def addAbstract(doc: t.SpecT) -> None:
    if not doc.md.noAbstract:
        loadBoilerplate(doc, "abstract")
    else:
        container = getFillContainer("abstract", doc, default=False)
        if container is not None:
            h.removeNode(container)


def addStatusSection(doc: t.SpecT) -> None:
    loadBoilerplate(doc, "status")


def addExpiryNotice(doc: t.SpecT) -> None:
    if doc.md.expires is None:
        return
    if doc.md.date >= doc.md.expires or datetime.utcnow().date() >= doc.md.expires:
        boilerplate = "warning-expired"
    else:
        boilerplate = "warning-expires"
        doc.extraJC.addExpires()
    loadBoilerplate(doc, boilerplate, "warning")
    h.addClass(doc, doc.body, boilerplate)


def addObsoletionNotice(doc: t.SpecT) -> None:
    if doc.md.warning:
        loadBoilerplate(doc, doc.md.warning[0], "warning")


def addAtRisk(doc: t.SpecT) -> None:
    if len(doc.md.atRisk) == 0:
        return
    html = [
        h.E.p({}, "The following features are at-risk, and may be dropped during the CR period:\n"),
    ]
    ul = h.E.ul()
    html.append(ul)
    for feature in doc.md.atRisk:
        li = h.E.li()
        normFeature = h.safeBikeshedHtml(
            feature,
            h.ParseConfig.fromSpec(doc, context="At Risk metadata"),
            context="At Risk metadata",
        )
        h.parseInto(li, normFeature)
        h.appendChild(ul, li)
    html.append(
        h.E.p(
            {},
            "“At-risk” is a W3C Process term-of-art, and does not necessarily imply that the feature is in danger of being dropped or delayed. "
            + "It means that the WG believes the feature may have difficulty being interoperably implemented in a timely manner, "
            + "and marking it as such allows the WG to drop the feature if necessary when transitioning to the Proposed Rec stage, "
            + "without having to publish a new Candidate Rec without the feature first.",
        ),
    )
    fillWith("at-risk", html, doc=doc)


def addStyles(doc: t.SpecT) -> None:
    el = getFillContainer("stylesheet", doc)
    if el is not None:
        el.text = retrieve.retrieveBoilerplateFile(doc, "stylesheet")


def addCustomBoilerplate(doc: t.SpecT) -> None:
    for el in h.findAll("[boilerplate]", doc):
        tag = el.get("boilerplate", "")
        if doc.fillContainers[tag]:
            h.replaceContents(doc.fillContainers[tag][0], el)
            h.removeNode(el)


def removeUnwantedBoilerplate(doc: t.SpecT) -> None:
    for tag, els in doc.fillContainers.items():
        if tag not in doc.md.boilerplate:
            for el in els:
                h.removeNode(el)


def w3cStylesheetInUse(doc: t.SpecT) -> bool:
    return doc.md.prepTR or doc.doctype.group.name == "W3C"


def addBikeshedBoilerplate(doc: t.SpecT) -> None:
    for style in doc.extraJC.getStyles(doc.md.boilerplate):
        container = getFillContainer("style-" + style.name, doc)
        if container is None:
            container = getFillContainer("bs-styles", doc, default=True)
        if container is not None:
            h.appendChild(container, style.toElement(darkMode=doc.md.darkMode))
    for script in doc.extraJC.getScripts(doc.md.boilerplate):
        container = getFillContainer("script-" + script.name, doc)
        if container is None:
            container = getFillContainer("bs-scripts", doc, default=True)
        if container is not None:
            h.appendChild(container, script.toElement())


def addIndexSection(doc: t.SpecT) -> None:
    hasLocalDfns = len(h.findAll(config.dfnElementsSelector, doc)) > 0
    hasExternalDfns = doc.externalRefsUsed.hasRefs()
    if not hasLocalDfns and not hasExternalDfns:
        return

    container = getFillContainer("index", doc=doc, default=True)
    if container is None:
        return
    h.appendChild(container, h.E.h2({"class": "no-num no-ref", "id": h.safeID(doc, "index")}, _t("Index")))

    if hasLocalDfns:
        addIndexOfLocallyDefinedTerms(doc, container)

    if hasExternalDfns:
        addIndexOfExternallyDefinedTerms(doc, container)


def addIndexOfLocallyDefinedTerms(doc: t.SpecT, container: t.ElementT) -> None:
    h.appendChild(
        container,
        h.E.h3(
            {"class": "no-num no-ref", "id": h.safeID(doc, "index-defined-here")},
            _t("Terms defined by this specification"),
        ),
    )

    indexEntries = defaultdict(list)
    for el in h.findAll(config.dfnElementsSelector, doc):
        dfnID = el.get("id")
        dfnType = el.get("data-dfn-type")
        if dfnID is None or dfnType is None:
            continue
        linkTexts = h.linkTextsFromElement(el)
        headingLevel = h.headingLevelOfElement(el) or _t("Unnumbered section")
        if dfnType == "argument":
            # Don't generate index entries for arguments.
            continue
        if el.get("data-dfn-for") is not None:
            disamb = _t("{type} for {forVals}").format(
                type=dfnType,
                forVals=", ".join(config.splitForValues(el.get("data-dfn-for", ""))),
            )
        elif dfnType == "dfn":
            disamb = _t("definition of")
        else:
            disamb = "({})".format(dfnType)

        for linkText in linkTexts:
            entry = IndexTerm(
                url="#" + dfnID,
                label="§\u202f" + headingLevel,
                disambiguator=disamb,
            )
            indexEntries[linkText].append(entry)

    # Now print the indexes
    indexHTML = htmlFromIndexTerms(indexEntries)
    h.appendChild(container, indexHTML, allowEmpty=True)


def disambiguator(ref: r.RefWrapper, types: set[str] | None, specs: list[str] | None) -> str:
    disambInfo = []
    if types is None or len(types) > 1:
        disambInfo.append(ref.type)
    if specs is None or len(specs) > 1:
        disambInfo.append(_t("in {spec}").format(spec=ref.spec))
    if ref.for_:
        disambInfo.append(_t("for {forVals}").format(forVals=", ".join(x.strip() for x in ref.for_)))
    return ", ".join(disambInfo)


def addExplicitIndexes(doc: t.SpecT) -> None:
    # Explicit indexes can be requested for specs with <index spec="example-spec-1"></index>

    for el in h.findAll("index", doc):
        status = el.get("status")
        if status and status not in config.specStatuses:
            m.die(
                f"<index> has unknown value '{status}' for status. Must be {config.englishFromList(config.specStatuses)}.",
                el=el,
            )
            continue

        if el.get("type"):
            elTypes = {x.strip() for x in el.get("type", "").split(",")}
            for elType in elTypes:
                if elType not in config.dfnTypes:
                    m.die(
                        f"Unknown type value '{elType}' on {h.outerHTML(el)}",
                        el=el,
                    )
                    elTypes.remove(elType)
        else:
            elTypes = None

        if el.get("data-link-spec"):
            # Yes, this is dumb. Accidental over-firing of a shortcut attribute. >_<
            specs = sorted({x.strip() for x in el.get("data-link-spec", "").split(",")})
            for s in list(specs):
                if s not in doc.refs.specs:
                    m.die(f"Unknown spec name '{s}' on {h.outerHTML(el)}", el=el)
                    specs.remove(s)
        else:
            specs = None

        if el.get("for"):
            fors = {x.strip() for x in el.get("for", "").split(",")}
        else:
            fors = None

        if el.get("export"):
            exportVal = el.get("export", "").lower().strip()
            if exportVal in ["yes", "y", "true", "on"]:
                export = True
            elif exportVal in ["no", "n", "false", "off"]:
                export = False
            else:
                m.die(
                    f"Unknown export value '{exportVal}' (should be boolish) on {h.outerHTML(el)}",
                    el=el,
                )
                export = None
        else:
            export = None

        # Initial filter of the ref database according to the <index> parameters
        possibleRefs = []
        for ref in doc.refs.queryAllRefs(dedupURLs=False, latestOnly=False, ignoreObsoletes=False):
            ref.text = re.sub(r"\s{2,}", " ", ref.text.strip())
            if export is not None and ref.export != export:
                continue
            if specs is not None and ref.spec not in specs:
                continue
            if elTypes is not None and ref.type not in elTypes:
                continue
            if fors is not None and not (set(ref.for_) & fors):
                continue
            possibleRefs.append(ref)

        # Group entries by linking text,
        # ensuring no duplicate disambiguators.
        refsFromText: t.DefaultDict[str, list[r.RefWrapper]] = defaultdict(list)
        for ref in possibleRefs:
            refDisambiguator = disambiguator(ref, elTypes, specs)
            for i, existingRef in enumerate(refsFromText[ref.text]):
                if disambiguator(existingRef, elTypes, specs) != refDisambiguator:
                    continue
                # Whoops, found an identical entry.
                if existingRef.status != ref.status:
                    if status:
                        if existingRef.status == status:
                            # Existing entry matches stated status, do nothing and don't add it.
                            break
                        if ref.status == status:
                            # New entry matches status, update and don't re-add it.
                            refsFromText[ref.text][i] = ref
                            break
                    else:
                        # Default to preferring current specs
                        if existingRef.status == "current":
                            break
                        if ref.status == "current":
                            refsFromText[ref.text][i] = ref
                            break
                else:
                    # Legit dupes. Shouldn't happen in a good spec, but whatever.
                    pass
            else:
                refsFromText[ref.text].append(ref)

        # Group entries by text/type/for,
        # then filter each group for obsolete/oldversions.
        refsFromTtf: t.DefaultDict[tuple[str, str, str | None], list[r.RefWrapper]] = defaultdict(list)
        for text, entries in refsFromText.items():
            for ref in entries:
                ttf = (text, ref.type, "".join(ref.for_) if ref.for_ else None)
                refsFromTtf[ttf].append(ref)
        filteredRefs: t.DefaultDict[str, list[IndexTerm]] = defaultdict(list)
        for ttf, refs in list(refsFromTtf.items()):
            refs = doc.refs.filterObsoletes(refs)
            refs = r.utils.filterOldVersions(refs)
            if refs:
                filteredRefs[ttf[0]].extend(
                    IndexTerm(url=ref.url, disambiguator=disambiguator(ref, elTypes, specs)) for ref in refs
                )

        h.appendChild(el, htmlFromIndexTerms(filteredRefs), allowEmpty=True)
        el.tag = "div"
        h.removeAttr(el, "export", "for", "spec", "status", "type")


@dataclasses.dataclass
class IndexTerm:
    url: str
    disambiguator: str
    label: str | None = None


def htmlFromIndexTerms(entries: t.Mapping[str, list[IndexTerm]]) -> t.ElementT:
    # entries: dict (preferably OrderedDict, if you want stability) of linkText=>{url, label, disambiguator}
    # label is used for the actual link (normally heading level), disambiguator is phrase to use when there are collisions

    def entryKey(x: tuple[str, t.Any]) -> tuple[str, str, str]:
        return (
            # first group by approximating a human-friendly "nearness" of terms
            re.sub(r"[^a-z0-9]", "", x[0].lower()),
            # then within that, by case-ignoring exact text
            x[0].lower(),
            # and finally uniquely by exact text
            x[0],
        )

    entries = OrderedDict(sorted(entries.items(), key=entryKey))

    topList = h.E.ul({"class": "index"})
    for text, items in entries.items():
        if len(items) == 1:
            item = items[0]
            li = h.appendChild(
                topList,
                h.E.li(
                    h.E.a({"href": item.url}, text),
                    h.E.span(_t(", in "), item.label) if item.label else "",
                ),
            )
        else:
            li = h.appendChild(topList, h.E.li(text))
            ul = h.appendChild(li, h.E.ul())
            for item in sorted(items, key=lambda x: x.disambiguator):
                h.appendChild(
                    ul,
                    h.E.li(
                        h.E.a({"href": item.url}, item.disambiguator),
                        h.E.span(_t(", in "), item.label) if item.label else "",
                    ),
                )
    return topList


def addIndexOfExternallyDefinedTerms(doc: t.SpecT, container: t.ElementT) -> None:
    if not doc.externalRefsUsed.hasRefs():
        return

    def makeEntry(ref: t.RefWrapper, contents: t.NodeListT) -> t.ElementT:
        return h.E.span(
            {"id": h.uniqueID("external-term", ref.url, ref.text)},
            *contents,
        )

    ul = h.E.ul({"class": "index"})

    for specName, specData in doc.externalRefsUsed.sorted():
        # Skip entries that are *solely* a biblio entry.
        if not specData.refs:
            continue

        # ref.spec is always lowercase; if the same string shows up in biblio data,
        # use its casing instead.
        biblioRef = specData.biblio or doc.refs.getBiblioRef(specName, quiet=True)
        if biblioRef:
            printableSpec = biblioRef.linkText
        else:
            printableSpec = specName

        attrs = {
            "data-lt": specName,
            "data-link-type": "biblio",
            "data-biblio-type": "informative",
            "data-okay-to-fail": "true",
        }
        specLi = h.appendChild(
            ul,
            h.E.li(h.E.a(attrs, "[", formatBiblioTerm(printableSpec), "]"), " defines the following terms:"),
        )
        termsUl = h.appendChild(specLi, h.E.ul())
        for _, refGroup in specData.sorted():
            if len(refGroup) == 1:
                ref = refGroup.single()
                entry = makeEntry(ref, ref.displayText)
                h.appendChild(termsUl, h.E.li(entry))
                dfnpanels.addExternalDfnPanel(entry, ref, doc)
            else:
                for forVal, ref in refGroup.sorted():
                    if forVal:
                        entry = makeEntry(ref, [ref.displayText, " ", h.E.small({}, f"({_t('for')} {forVal})")])
                    else:
                        entry = makeEntry(ref, ref.displayText)
                    h.appendChild(termsUl, h.E.li(entry))
                    dfnpanels.addExternalDfnPanel(entry, ref, doc)
    h.appendChild(
        container,
        h.E.h3(
            {"class": "no-num no-ref", "id": h.safeID(doc, "index-defined-elsewhere")},
            _t(
                "Terms defined by reference",
            ),
        ),
        ul,
    )


def addPropertyIndex(doc: t.SpecT) -> None:
    # Extract all the data from the propdef and descdef tables

    if len(h.findAll("table.propdef, table.descdef", doc)) == 0:
        return
    html = getFillContainer("property-index", doc=doc, default=True)
    if html is None:
        return

    h.appendChild(
        html,
        h.E.h2(
            {"class": "no-num no-ref", "id": h.safeID(doc, "property-index")},
            _t("Property Index"),
        ),
    )

    def extractKeyValFromRow(row: t.ElementT, table: t.ElementT) -> tuple[str, str]:
        # Extract the key, minus the trailing :
        result = re.match(r"(.*):", h.textContent(row[0]).strip())
        if result is None:
            m.die(
                f"Propdef row headers must be a word followed by a colon. Got:\n{h.textContent(row[0]).strip()}",
                el=table,
            )
            return "", ""
        key = result.group(1).strip().capitalize()
        # Extract the value from the second cell
        val = h.textContent(row[1]).strip()
        return key, val

    # Extract propdef info
    props = []
    for table in h.findAll("table.propdef", doc):
        prop = {}
        names = []
        for row in h.findAll("tr", table):
            key, val = extractKeyValFromRow(row, table)
            if key == "Name":
                names = [h.textContent(x) for x in h.findAll("dfn", row[1])]
            else:
                prop[key] = val
        for name in names:
            tempProp = prop.copy()
            tempProp["Name"] = name
            props.append(tempProp)
    props.sort(key=lambda x: x["Name"])
    # Extract descdef info
    atRules = defaultdict(list)
    for table in h.findAll("table.descdef", doc):
        desc = {}
        names = []
        atRule = ""
        for row in h.findAll("tr", table):
            key, val = extractKeyValFromRow(row, table)
            if key == "Name":
                names = [h.textContent(x) for x in h.findAll("dfn", row[1])]
            elif key == "For":
                atRule = val
            else:
                desc[key] = val
        for name in names:
            tempDesc = desc.copy()
            tempDesc["Name"] = name
            atRules[atRule].append(tempDesc)
    for descs in atRules.values():
        descs.sort(key=lambda x: x["Name"])

    def createRow(prop: dict[str, str], linkType: str, for_: str | None = None) -> t.ElementT:
        attrs = {"data-link-type": linkType}
        if for_:
            attrs["data-link-for"] = for_
        return h.E.tr(
            h.E.th({"scope": "row"}, h.E.a(attrs, prop["Name"])),
            *[h.E.td(prop.get(column, "")) for column in columns[1:]],
        )

    if len(props) > 0:
        # Set up the initial table columns for properties
        columns = ["Name", "Value", "Initial", "Applies to", "Inherited", "Percentages"]
        # Add any additional keys used in the document.
        allKeys = set()
        for prop in props:
            allKeys |= set(prop.keys())
        columns.extend(sorted(allKeys - set(columns)))
        # Create the table

        def formatColumnName(name: str) -> str:
            if name == "Inherited":
                return "Inh."
            if name == "Percentages":
                return "%ages"
            if name == "Animatable":
                return "Ani\xadmat\xadable"
            if name == "Animation type":
                return "Anim\xadation type"
            if name == "Computed value":
                return "Com\xadputed value"
            return name

        h.appendChild(
            html,
            h.E.div(
                {"class": "big-element-wrapper"},
                h.E.table(
                    {"class": "index"},
                    h.E.thead(h.E.tr(*[h.E.th({"scope": "col"}, formatColumnName(column)) for column in columns])),
                    h.E.tbody(*[createRow(prop, "property") for prop in props]),
                ),
            ),
        )
    else:
        h.appendChild(html, h.E.p("No properties defined."))

    if len(atRules) > 0:
        atRuleNames = sorted(atRules.keys())
        for atRuleName in atRuleNames:
            descs = atRules[atRuleName]
            if atRuleName == "":
                atRuleName = "Miscellaneous"
            columns = ["Name", "Value", "Initial"]
            allKeys = set()
            for desc in descs:
                allKeys |= set(desc.keys())
            columns.extend(sorted(allKeys - set(columns)))
            id = config.simplifyText(atRuleName) + "-descriptor-table"
            if atRuleName:
                h.appendChild(
                    html,
                    h.E.h3(
                        {"class": "no-num no-ref", "id": h.safeID(doc, id)},
                        h.E.a({"data-link-type": "at-rule"}, atRuleName),
                        " Descriptors",
                    ),
                )
            else:
                h.appendChild(
                    html,
                    h.E.h3(
                        {"class": "no-num no-ref", "id": h.safeID(doc, id)},
                        "Miscellaneous Descriptors",
                    ),
                )
            h.appendChild(
                html,
                h.E.div(
                    {"class": "big-element-wrapper"},
                    h.E.table(
                        {"class": "index"},
                        h.E.thead(h.E.tr(*[h.E.th({"scope": "col"}, column) for column in columns])),
                        h.E.tbody(*[createRow(desc, "descriptor", for_=atRuleName) for desc in descs]),
                    ),
                ),
            )


def addIDLSection(doc: t.SpecT) -> None:
    idlBlocks = [x for x in h.findAll("pre.idl, xmp.idl", doc) if h.isNormative(doc, x)]
    if len(idlBlocks) == 0:
        return
    html = getFillContainer("idl-index", doc=doc, default=True)
    if html is None:
        return

    h.appendChild(
        html,
        h.E.h2({"class": "no-num no-ref", "id": h.safeID(doc, "idl-index")}, _t("IDL Index")),
    )

    container = h.appendChild(html, h.E.pre({"class": "idl"}))
    for block in idlBlocks:
        if h.hasClass(doc, block, "extract"):
            continue
        blockCopy = copy.deepcopy(block)
        h.appendContents(container, blockCopy)
        h.appendChild(container, "\n")
    for el in h.findAll("[id]", container):
        if el.tag == "dfn":
            el.tag = "a"
            el.set("href", "#" + el.get("id", ""))
        del el.attrib["id"]
    h.addClass(doc, container, "highlight")


def addCDDLSection(doc: t.SpecT) -> None:
    allCddlBlocks = [x for x in h.findAll("pre.cddl, xmp.cddl", doc) if h.isNormative(doc, x)]
    if len(allCddlBlocks) == 0:
        return
    html = getFillContainer("cddl-index", doc=doc, default=True)
    if html is None:
        return

    h.appendChild(
        html,
        h.E.h2({"class": "no-num no-ref", "id": h.safeID(doc, "cddl-index")}, _t("CDDL Index")),
    )

    # Specs such as WebDriver BiDi define two sets of CDDL definitions for
    # the local and remote ends of the protocol. These modules need to be
    # defined with a dfn of type "cddl-module". CDDL blocks can then reference
    # one or more modules through a "data-cddl-module" attribute.
    # When modules are defined, CDDL blocks that do not reference a module
    # are considered to apply to all modules. In particular, they do not create
    # a "default" module
    cddlModules = [
        (x.get("id", ""), x.get("data-lt", x.text or "").split("|"))
        for x in h.findAll("dfn[data-dfn-type=cddl-module]", doc)
    ]
    if len(cddlModules) == 0:
        cddlModules = [("", [""])]
    for module in cddlModules:
        cddlBlocks = []
        for block in allCddlBlocks:
            forModules = [x.strip() for x in block.get("data-cddl-module", "").split(",")]
            if (len(forModules) == 1 and forModules[0] == "") or any(name in forModules for name in module[1]):
                cddlBlocks.append(block)
        if len(cddlBlocks) == 0:
            continue
        if module[1][0] != "":
            h.appendChild(
                html,
                h.E.h3(
                    {"class": "no-num no-ref", "id": h.safeID(doc, "cddl-index-" + module[0])},
                    _t(module[1][0].capitalize()),
                ),
            )
        container = h.appendChild(html, h.E.pre({"class": "cddl"}))
        for block in cddlBlocks:
            if h.hasClass(doc, block, "extract"):
                continue
            blockCopy = copy.deepcopy(block)
            h.appendContents(container, blockCopy)
            h.appendChild(container, "\n")
        for el in h.findAll("[id]", container):
            if el.tag == "dfn":
                el.tag = "a"
                el.set("href", "#" + el.get("id", ""))
            del el.attrib["id"]
        h.addClass(doc, container, "highlight")


def addTOCSection(doc: t.SpecT) -> None:
    toc = getFillContainer("table-of-contents", doc=doc, default=False)
    if toc is None:
        return
    h.appendChild(
        toc,
        h.E.h2(
            {"class": "no-num no-toc no-ref", "id": h.safeID(doc, "contents")},
            _t("Table of Contents"),
        ),
    )

    # containers[n] holds the current <ol> for inserting each heading's <li> into.
    # containers[1] is initialized with something arbitrary
    # (anything non-int and non-None will do, to avoid tripping error-handling),
    # and containers[2] is initialized with the top-level <ol>
    # (because <h2>s and below are all that should show up in your doc)
    # and whenever we hit a heading of level N,
    # we append an <li> for it to containers[N],
    # and create a new <ol> at containers[N+1] to hold its child sections
    # (nested inside the <li>).
    # We'll clean up empty subsections at the end.
    # There's a containers[0] just to make the levels map directly to indexes,
    # and a containers[7] just to avoid IndexErrors when dealing with <h6>s.
    # Aside from the above initialization,
    # containers[N] is initialized to an int,
    # arbitrarily set to the index just for readability.
    # If a heading specifies it shouldn't be in the ToC,
    # it sets containers[N+1] to None
    # to indicate that no children should go there.
    previousLevel = 1
    containers: list[t.ElementT | None] = [None, None, None, None, None, None, None, None]
    containers[1] = toc
    containers[2] = h.appendChild(toc, h.E.ol({"class": "toc"}))
    for header in h.findAll("h2, h3, h4, h5, h6", doc):
        level = int(header.tag[-1])
        container = containers[level]
        if isinstance(container, int):
            # Saw a low-level heading without first seeing a higher heading.
            m.die(
                f"Saw an <h{level}> without seeing an <h{level-1}> first. Please order your headings properly.\n{h.outerHTML(header)}",
                el=header,
            )
            return
        if level > previousLevel + 1:
            # Jumping two levels is a no-no.
            m.die(
                f"Heading level jumps more than one level, from h{previousLevel} to h{level}:\n{h.outerHTML(header)}",
                el=header,
            )
            return

        addToTOC = True
        if h.hasClass(doc, header, "no-toc"):
            # Hit a no-toc, suppress the entire section.
            addToTOC = False
        elif container is None:
            addToTOC = False
        elif (level - 1) > (doc.md.maxToCDepth or float("inf")):
            addToTOC = False

        if addToTOC:
            assert container is not None
            li = h.appendChild(
                container,
                h.E.li(
                    h.E.a(
                        {"href": "#" + header.get("id", "")},
                        h.E.span({"class": "secno"}, header.get("data-level", "")),
                        " ",
                        copy.deepcopy(h.find(".content", header)),
                    ),
                ),
            )
            containers[level + 1] = h.appendChild(li, h.E.ol({"class": "toc"}))
        else:
            containers[level + 1] = None
        previousLevel = level

    container = t.cast("t.ElementT", containers[1])
    for el in h.findAll(".content a, .content dfn", container):
        el.tag = "span"
        if "href" in el.attrib:
            del el.attrib["href"]
    for el in h.findAll(".content [id]", container):
        del el.attrib["id"]
    for el in h.findAll("ol:empty", container):
        h.removeNode(el)


def addSpecMetadataSection(doc: t.SpecT) -> None:
    def printEditor(editor: dict[str, str | None]) -> t.ElementT | None:
        dd = h.E.dd({"class": "editor p-author h-card vcard"})
        if editor["w3cid"]:
            dd.attrib["data-editor-id"] = editor["w3cid"]
        if editor["link"]:
            h.appendChild(
                dd,
                h.E.a(
                    {"class": "p-name fn u-url url", "href": editor["link"]},
                    editor["name"],
                ),
            )
        elif editor["email"]:
            h.appendChild(
                dd,
                h.E.a(
                    {
                        "class": "p-name fn u-email email",
                        "href": "mailto:" + editor["email"],
                    },
                    editor["name"],
                ),
            )
        else:
            h.appendChild(dd, h.E.span({"class": "p-name fn"}, editor["name"]))
        if editor["org"]:
            if editor["orglink"]:
                el = h.E.a({"class": "p-org org", "href": editor["orglink"]}, editor["org"])
            else:
                el = h.E.span({"class": "p-org org"}, editor["org"])
            h.appendChild(dd, " (", el, ")")
        if editor["email"] and editor["link"]:
            h.appendChild(
                dd,
                " ",
                h.E.a(
                    {"class": "u-email email", "href": "mailto:" + editor["email"]},
                    editor["email"],
                ),
            )
        return dd

    def printTranslation(tr: dict[str, str]) -> t.ElementT | None:
        lang = tr["lang-code"]
        # canonicalize the lang-code structure
        lang = lang.lower().replace("_", "-")
        name = tr["name"]
        nativeName = tr["native-name"]
        url = tr["url"]
        missingInfo = False
        if name is None:
            if lang in doc.languages:
                name = doc.languages[lang].name
            else:
                missingInfo = True
        if nativeName is None:
            if lang in doc.languages:
                nativeName = doc.languages[lang].nativeName
            else:
                missingInfo = True
        if missingInfo:
            m.warn(
                f"Bikeshed doesn't have all the translation info for '{lang}'. Please add to bikeshed/spec-data/readonly/languages.json and submit a PR!",
            )
        if nativeName:
            return h.E.span(
                {"title": name or lang},
                h.E.a(
                    {"href": url, "hreflang": lang, "rel": "alternate", "lang": lang},
                    nativeName,
                ),
            )
        if name:
            return h.E.a({"href": url, "hreflang": lang, "rel": "alternate", "title": lang}, name)
        return h.E.a({"href": url, "hreflang": lang, "rel": "alternate"}, lang)

    def printPreviousVersion(v: dict[str, str]) -> t.ElementT | None:
        if v["type"] == "url":
            return h.E.a({"href": v["value"], "rel": "prev"}, v["value"])
        # Otherwise, generate an implicit line from the latest known
        key: str
        if v["type"] == "from-biblio":
            key = v["value"]
        elif v["type"] == "from-biblio-implicit":  # "from-biblio-implicit"
            if doc.md.vshortname is None:
                return None
            key = doc.md.vshortname
        dated = doc.refs.getLatestBiblioRef(key)
        if not dated:
            m.die(
                f"While trying to generate a Previous Version line, couldn't find a dated biblio reference for {key}.",
            )
            return None
        return h.E.a({"href": dated.url, "rel": "prev"}, dated.url)

    md: OrderedDict[str, list[MetadataValueT]] = OrderedDict()
    mac = doc.macros
    if "version" in mac:
        md.setdefault("This version", []).append(h.E.a({"href": mac["version"], "class": "u-url"}, mac["version"]))
    if doc.md.TR:
        md.setdefault("Latest published version", []).append(h.E.a({"href": doc.md.TR}, doc.md.TR))
    if doc.md.ED and "TR" in doc.doctype.status.requires:
        md.setdefault("Editor's Draft", []).append(h.E.a({"href": doc.md.ED}, doc.md.ED))
    if doc.md.previousVersions:
        md["Previous Versions"] = [printPreviousVersion(ver) for ver in doc.md.previousVersions]
    if "history" in mac:
        md["History"] = [h.E.a({"href": mac["history"], "class": "u-url"}, mac["history"])]
    else:
        if doc.md.versionHistory:
            md["Version History"] = [h.E.a({"href": vh}, vh) for vh in doc.md.versionHistory]
    if doc.md.mailingList:
        span = h.E.span(
            h.E.a(
                {
                    "href": "mailto:"
                    + doc.md.mailingList
                    + "?subject=%5B"
                    + mac["shortname"]
                    + "%5D%20YOUR%20TOPIC%20HERE",
                },
                doc.md.mailingList,
            ),
            " with subject line “",
            h.E.kbd("[", mac["shortname"], "] ", h.E.i({"lt": ""}, "… message topic …")),
            "”",
        )
        if doc.md.mailingListArchives:
            h.appendChild(
                span,
                " (",
                h.E.a(
                    {"rel": "discussion", "href": doc.md.mailingListArchives},
                    "archives",
                ),
                ")",
            )
        md.setdefault("Feedback", []).append(span)
    if doc.md.implementationReport is not None:
        md.setdefault("Implementation Report", []).append(
            h.E.a({"href": doc.md.implementationReport}, doc.md.implementationReport),
        )
    if doc.md.testSuite is not None:
        md.setdefault("Test Suite", []).append(h.E.a({"href": doc.md.testSuite}, doc.md.testSuite))
    if doc.md.issues:
        if doc.md.TR:
            md.setdefault("Feedback", []).extend([h.E.a({"href": href}, text) for text, href in doc.md.issues])
        else:
            md["Issue Tracking"] = [h.E.a({"href": href}, text) for text, href in doc.md.issues]
    if doc.md.editors:
        md["Editor"] = list(map(printEditor, doc.md.editors))
    if doc.md.previousEditors:
        md["Former Editor"] = list(map(printEditor, doc.md.previousEditors))
    if doc.md.translations:
        md["Translations"] = list(map(printTranslation, doc.md.translations))
    if doc.md.audience:
        md["Audience"] = [", ".join(doc.md.audience)]
    if doc.md.toggleDiffs:
        md["Toggle Diffs"] = [
            h.E.label(
                {"for": h.safeID(doc, "hidedel"), "id": h.safeID(doc, "hidedel-label")},
                "Hide deleted text",
            ),
        ]
        h.prependChild(
            doc.body,
            h.E.input(
                {
                    "type": "checkbox",
                    "id": h.safeID(doc, "hidedel"),
                    "style": "display:none",
                },
            ),
        )
        doc.extraJC.addHidedel()

    # Merge "custom" metadata into non-custom, when they match up
    # and upgrade html-text values into real elements
    otherMd: OrderedDict[str, list[MetadataValueT]] = OrderedDict()
    for k, vs in doc.md.otherMetadata.items():
        parsed: list[t.NodeT | None] = []
        for v in vs:
            if isinstance(v, str):
                if v == "":
                    continue
                htmlText = h.parseText(
                    v,
                    h.ParseConfig.fromSpec(doc, context=f"!{k} metadata"),
                    context=f"!{k} metadata",
                )
                parsed.append(h.E.inline({}, *h.parseHTML(htmlText)))
            else:
                parsed.append(v)
        if k in md:
            md[k].extend(parsed)
        else:
            otherMd[k] = parsed

    fillWith("spec-metadata", [htmlFromMd(md, otherMd, doc)], doc=doc)


def createMdEntry(key: str, dirtyVals: t.Sequence[MetadataValueT], doc: t.SpecT) -> list[t.ElementT]:
    # Turns a metadata key/vals pair
    # into a list of dt/dd elements.

    vals: list[t.NodeT] = [x for x in dirtyVals if x is not None]
    if not vals:
        return []
    # Convert the canonical key to a display version
    if key == "Editor":
        displayKey = doc.md.editorTerm["singular"]
    elif key == "Former Editor":
        displayKey = "Former " + doc.md.editorTerm["singular"]
    else:
        displayKey = key
    # Pluralize appropriate words
    pluralization = {
        "Previous Version": "Previous Versions",
        "Test Suite": "Test Suites",
        doc.md.editorTerm["singular"]: doc.md.editorTerm["plural"],
        "Former " + doc.md.editorTerm["singular"]: "Former " + doc.md.editorTerm["plural"],
    }
    if len(vals) > 1 and displayKey in pluralization:
        displayKey = pluralization[displayKey]
    displayKey = _t(displayKey)
    # Handle some custom <dt> structures
    if key in ("Editor", "Former Editor"):
        ret = [h.E.dt({"class": "editor"}, displayKey, ":")]
    elif key == "Translations":
        ret = [h.E.dt(displayKey, " ", h.E.small(_t("(non-normative)")), ":")]
    else:
        ret = [h.E.dt(displayKey, ":")]
    # Add all the values, wrapping in a <dd> if necessary.
    for val in vals:
        if h.isElement(val) and h.tagName(val) == "dd":
            ret.append(val)
        else:
            ret.append(h.E.dd({}, val))
    return ret


def htmlFromMd(md: MetadataT, otherMd: MetadataT, doc: t.SpecT) -> t.ElementT:
    # Turns canonical and "other" metadata
    # into a <dl>, per Metadata Order.

    dl = h.E.dl({"bs-line-number": "[auto-generated spec-metadata block]"})
    for key in doc.md.metadataOrder:
        if key == "*":
            # Do all the non-explicit non-custom keys
            for k, vs in md.items():
                if k in doc.md.metadataOrder:
                    # Handled explicitly, don't put in the * spot
                    continue
                if k not in doc.md.metadataInclude:
                    # Explicitly excluded
                    continue
                h.appendChild(dl, *createMdEntry(k, vs, doc), allowEmpty=True)
        elif key == "!*":
            # Do all the non-explicit custom keys
            for k, vs in otherMd.items():
                if k in doc.md.metadataOrder:
                    continue
                if k not in doc.md.metadataInclude:
                    continue
                h.appendChild(dl, *createMdEntry(k, vs, doc), allowEmpty=True)
        elif key not in doc.md.metadataInclude:
            # Key explicitly excluded
            continue
        elif key in md:
            h.appendChild(dl, *createMdEntry(key, md[key], doc), allowEmpty=True)
        elif key in otherMd:
            h.appendChild(dl, *createMdEntry(key, otherMd[key], doc), allowEmpty=True)
    return dl


def addReferencesSection(doc: t.SpecT) -> None:
    if not doc.normativeRefs and not doc.informativeRefs:
        return
    container = getFillContainer("references", doc=doc, default=True)
    if container is None:
        return

    h.appendChild(
        container,
        h.E.h2({"class": "no-num no-ref", "id": h.safeID(doc, "references")}, _t("References")),
    )

    normRefs = sorted(doc.normativeRefs.values(), key=lambda r: r.linkText.lower())
    normRefKeys = {r.linkText.lower() for r in doc.normativeRefs.values()}
    if len(normRefs) > 0:
        dl = h.appendChild(
            container,
            h.E.h3(
                {"class": "no-num no-ref", "id": h.safeID(doc, "normative")},
                _t("Normative References"),
            ),
            h.E.dl(),
        )
        for ref in normRefs:
            id = "biblio-" + config.simplifyText(ref.linkText)
            h.appendChild(
                dl,
                h.E.dt(
                    {"id": h.safeID(doc, id), "data-no-self-link": ""},
                    "[" + formatBiblioTerm(ref.linkText) + "]",
                ),
            )
            h.appendChild(dl, h.E.dd({}, ref.toHTML()))

    informRefs = [
        x
        for x in sorted(doc.informativeRefs.values(), key=lambda r: r.linkText.lower())
        if x.linkText.lower() not in normRefKeys
    ]
    if len(informRefs) > 0:
        dl = h.appendChild(
            container,
            h.E.h3(
                {"class": "no-num no-ref", "id": h.safeID(doc, "informative")},
                _t("Non-Normative References"),
            ),
            h.E.dl(),
        )
        for ref in informRefs:
            id = "biblio-" + config.simplifyText(ref.linkText)
            h.appendChild(
                dl,
                h.E.dt(
                    {"id": h.safeID(doc, id), "data-no-self-link": ""},
                    "[" + formatBiblioTerm(ref.linkText) + "]",
                ),
            )
            h.appendChild(dl, h.E.dd({}, ref.toHTML()))


def addIssuesSection(doc: t.SpecT) -> None:
    issues = h.findAll(".issue", doc)
    if len(issues) == 0:
        return
    container = getFillContainer("issues-index", doc=doc, default=True)
    if container is None:
        return

    h.appendChild(
        container,
        h.E.h2(
            {"class": "no-num no-ref", "id": h.safeID(doc, "issues-index")},
            _t("Issues Index"),
        ),
    )
    container = h.appendChild(container, h.E.div({"style": "counter-reset:issue"}))
    for issue in issues:
        el = copy.deepcopy(issue)
        el.tail = None
        if el.tag not in ("pre", "xmp"):
            el.tag = "div"
        h.appendChild(container, el)
        h.appendChild(
            el,
            " ",
            h.E.a({"href": "#" + issue.get("id", ""), "class": "issue-return", "title": _t("Jump to section")}, "↵"),
        )
    for idel in h.findAll("[id]", container):
        del idel.attrib["id"]
    for dfnel in h.findAll(config.dfnElementsSelector, container):
        dfnel.tag = "span"


def formatBiblioTerm(linkText: str) -> str:
    """
    If the term is all uppercase, leave it like that.
    If it's all lowercase, uppercase it.
    If it's mixed case, leave it like that.
    """
    if linkText.islower():
        return linkText.upper()
    return linkText


def addDarkmodeIndicators(doc: t.SpecT) -> None:
    # Unless otherwise indicated, Bikeshed docs are assumed
    # to be darkmode-aware.
    if not doc.md.darkMode:
        return

    # If a boilerplate already contains a color-scheme,
    # assume they know what they're doing.
    # Otherwise, add the color-scheme meta to indicate darkmode-ness.
    existingColorScheme = h.find('meta[name="color-scheme"]', doc)
    if existingColorScheme is not None:
        return
    h.appendChild(
        doc.head,
        h.E.meta({"name": "color-scheme", "content": "dark light"}),
    )

    # Specs using the Bikeshed stylesheet will get darkmode colors
    # automatically, but W3C specs don't. Instead, auto-add their
    # darkmode styles.
    w3cStylesheet = h.find('link[href^="https://www.w3.org/StyleSheets/TR"]', doc)
    if w3cStylesheet is not None:
        h.appendChild(
            doc.head,
            h.E.link(
                {
                    "rel": "stylesheet",
                    "href": "https://www.w3.org/StyleSheets/TR/2021/dark.css",
                    "type": "text/css",
                    "media": "(prefers-color-scheme: dark)",
                },
            ),
        )


================================================
FILE: bikeshed/caniuse/__init__.py
================================================
from .caniuse import CIUData, addCanIUsePanels


================================================
FILE: bikeshed/caniuse/caniuse-panel.css
================================================
@media (max-width: 767px) {
	.caniuse-status {
		opacity: .1;
		transition: opacity .1s;
	}
}
:root {
	--caniuse-bg: #EEE;
	--caniuse-shadow: #999;
	--caniuse-nosupport-text: #ccc;
	--caniuse-partialsupport-text: #666;
}
@media (prefers-color-scheme: dark) {
	:root {
		--caniuse-bg: #222;
		--caniuse-shadow: #444;
		--caniuse-nosupport-text: #666;
		--caniuse-partialsupport-text: #bbb;
	}
}
.caniuse-status {
	background: var(--caniuse-bg, #EEE);
	border-radius: .25em;
	box-shadow: 0 0 3px var(--caniuse-shadow, #999);
	color: var(--text, black);
	font: 1em sans-serif;
	hyphens: none;
	max-width: min-content;
	overflow: hidden;
	padding: .2em;
	position: absolute;
	right: 0.3em;
	top: auto;
	width: fit-content;
	word-wrap: normal;
	z-index: 8;
}
.caniuse-status.unpositioned {
	display: none;
}
.caniuse-status.overlapping-main {
	opacity: .2;
	transition: opacity .1s;
}
.caniuse-status[open] {
	opacity: 1;
	z-index: 9;
	min-width: 9em;
	width: fit-content;
}
.caniuse-status:hover {
	outline: var(--text, black) 1px solid;
	opacity: 1;
}
.caniuse-status > summary {
	font-weight: normal;
	text-align: right;
	cursor: pointer;
	display: block;
}
.caniuse-status > p {
	font-size: 0.6em;
	margin: 0;
	padding: 0;
	clear: both;
}
.caniuse-status > p + p {
	padding-top: 0.5em;
}
.caniuse-status > .support {
	display: block;
}
.caniuse-status > .support > span {
	padding: 0.2em 0;
	display: block;
	display: table;
}
.caniuse-status > .support > span.partial {
	color: var(--caniuse-partialsupport-text, #666666);
	filter: grayscale(50%);
}
.caniuse-status > .support > span.no {
	color: var(--caniuse-nosupport-text, #CCCCCC);
	filter: grayscale(100%);
}
.caniuse-status > .support > span.no::before {
	opacity: 0.5;
}
.caniuse-status > .support > span:first-of-type {
	padding-top: 0.5em;
}
.caniuse-status > .support > span > span {
	padding: 0 0.5em;
	display: table-cell;
	vertical-align: top;
}
.caniuse-status > .support > span > span:first-child {
	width: 100%;
}
.caniuse-status > .support > span > span:last-child {
	width: 100%;
	white-space: pre;
	padding: 0;
}
.caniuse-status > .support > span::before {
	content: ' ';
	display: table-cell;
	height: 1.5em;
	background: no-repeat center center;
	background-size: contain;
	text-align: right;
	font-size: 0.75em;
	font-weight: bold;
}
.caniuse-status > .support > .and_chr::before {
	background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg);
}
.caniuse-status > .support > .and_ff::before {
	background-image: url(https://resources.whatwg.org/browser-logos/firefox.png);
}
.caniuse-status > .support > .and_uc::before {
	background-image: url(https://resources.whatwg.org/browser-logos/uc.png);
}
/* UC Browser for Android */
.caniuse-status > .support > .android::before {
	background-image: url(https://resources.whatwg.org/browser-logos/android.svg);
}
.caniuse-status > .support > .bb::before {
	background-image: url(https://resources.whatwg.org/browser-logos/bb.jpg);
}
/* Blackberry Browser */
.caniuse-status > .support > .chrome::before {
	background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg);
}
.caniuse-status > .support > .edge::before {
	background-image: url(https://resources.whatwg.org/browser-logos/edge.svg);
}
.caniuse-status > .support > .firefox::before {
	background-image: url(https://resources.whatwg.org/browser-logos/firefox.png);
}
.caniuse-status > .support > .ie::before {
	background-image: url(https://resources.whatwg.org/browser-logos/ie.png);
}
.caniuse-status > .support > .ie_mob::before {
	background-image: url(https://resources.whatwg.org/browser-logos/ie-mobile.svg);
}
.caniuse-status > .support > .ios_saf::before {
	background-image: url(https://resources.whatwg.org/browser-logos/safari-ios.svg);
}
.caniuse-status > .support > .op_mini::before {
	background-image: url(https://resources.whatwg.org/browser-logos/opera-mini.png);
}
.caniuse-status > .support > .op_mob::before {
	background-image: url(https://resources.whatwg.org/browser-logos/opera.svg);
}
.caniuse-status > .support > .opera::before {
	background-image: url(https://resources.whatwg.org/browser-logos/opera.svg);
}
.caniuse-status > .support > .safari::before {
	background-image: url(https://resources.whatwg.org/browser-logos/safari.png);
}
.caniuse-status > .support > .samsung::before {
	background-image: url(https://resources.whatwg.org/browser-logos/samsung.svg);
}
.caniuse-status > .caniuse {
	text-align: right;
	font-style: italic;
}
 @media (max-width: 767px) {
	.caniuse-status.wrapped {
		width: 9em;
		height: auto;
	}
	.caniuse-status:not(.wrapped) {
		height: 1em;
		max-width: min-content;
	}
	.caniuse-status.wrapped > :not(input) {
		display: block;
	}
	.caniuse-status:not(.wrapped) > :not(input) {
		display: none;
	}
}


================================================
FILE: bikeshed/caniuse/caniuse.py
================================================
from __future__ import annotations

import dataclasses
import json
from collections import OrderedDict
from datetime import datetime

from .. import h, t
from .. import messages as m
from ..translate import _t


def addCanIUsePanels(doc: t.SpecT) -> list[t.ElementT]:
    # Constructs "Can I Use panels" which show a compatibility data summary
    # for a term's feature.
    if not doc.md.includeCanIUsePanels:
        return []

    canIUseData = CIUData(dataFile=doc.dataFile)

    lastUpdated = datetime.utcfromtimestamp(canIUseData.updated).date().isoformat()

    panels = []
    elements = h.findAll("[caniuse]", doc)
    if not elements:
        return []
    validateCanIUseURLs(doc, canIUseData, elements)
    for dfn in elements:
        dfnId = dfn.get("id")
        if not dfnId:
            m.die(f"Elements with `caniuse` attribute need to have an ID as well. Got:\n{h.serializeTag(dfn)}", el=dfn)
            continue

        featId = dfn.get("caniuse", "").lower()
        if not featId:
            continue
        feature = canIUseData.getFeature(featId)
        if not feature:
            m.die(f"Unrecognized Can I Use feature ID: {featId}", el=dfn)
            continue
        del dfn.attrib["caniuse"]

        h.addClass(doc, dfn, "caniuse-paneled")
        panel = canIUsePanelFor(
            id=featId,
            feature=feature,
            update=lastUpdated,
        )
        panel.set("data-anno-for", dfnId)
        h.appendChild(doc.body, panel)
        panels.append(panel)

    if panels:
        doc.extraJC.addCiu()

    return panels


def canIUsePanelFor(id: str, feature: CIUFeature, update: str) -> t.ElementT:
    panel = h.E.details(
        {"class": "caniuse-status unpositioned", "data-deco": ""},
        h.E.summary({}, "CanIUse"),
    )
    mainPara = h.E.p({"class": "support"}, h.E.b({}, _t("Support:")))
    h.appendChild(panel, mainPara)
    for support in feature.support:
        if support.status == "unsupported":
            continue
        h.appendChild(
            mainPara,
            browserCompatSpan(support),
        )
    h.appendChild(
        panel,
        h.E.p(
            {"class": "caniuse"},
            _t("Source: "),
            h.E.a({"href": "https://caniuse.com/#feat=" + id}, "caniuse.com"),
            _t(" as of {date}").format(date=update),
        ),
    )
    return panel


def browserCompatSpan(support: CIUSupport) -> t.ElementT:
    # browserCodeName: e.g. and_chr, ios_saf, ie, etc...
    # browserFullName: e.g. "Chrome for Android"
    outer = h.E.span({"class": support.browserClass + " " + support.status})
    if support.status == "partial":
        h.appendChild(outer, h.E.span({}, h.E.span({}, support.browserName, _t(" (limited)"))))
    else:
        h.appendChild(outer, h.E.span({}, support.browserName))
    h.appendChild(outer, h.E.span({}, support.minVersion))
    return outer


def validateCanIUseURLs(doc: t.SpecT, canIUseData: CIUData, elements: list[t.ElementT]) -> None:
    # First, ensure that each Can I Use URL shows up at least once in the data;
    # otherwise, it's an error to be corrected somewhere.
    urlFeatures = set()
    for url in doc.md.canIUseURLs:
        sawTheURL = False
        for featureID, featureUrl in canIUseData.urlFromFeatureName.items():
            if featureUrl.startswith(url):
                sawTheURL = True
                urlFeatures.add(featureID)
        if not sawTheURL and url not in doc.md.ignoreCanIUseUrlFailure:
            m.warn(
                f"The Can I Use URL '{url}' isn't associated with any of the Can I Use features."
                + "Please check Can I Use for the correct spec url, and either correct your spec or correct Can I Use."
                + "If the URL is correct and you'd like to keep it in pre-emptively, add the URL to a 'Ignore Can I Use URL Failure' metadata.",
            )

    # Second, ensure that every feature in the data corresponding to one of the listed URLs
    # has a corresponding Can I Use entry in the document;
    # otherwise, you're missing some features.
    docFeatures = set()
    for el in elements:
        canIUseAttr = el.get("caniuse")
        assert canIUseAttr is not None
        featureID = canIUseAttr.lower()
        docFeatures.add(featureID)

    unusedFeatures = urlFeatures - docFeatures
    if unusedFeatures:
        featureList = "\n".join(" * {0} - https://caniuse.com/#feat={0}".format(x) for x in sorted(unusedFeatures))
        m.warn(
            f"The following Can I Use features are associated with your URLs, but don't show up in your spec:\n{featureList}",
        )


class CIUData:
    def __init__(self, dataFile: t.DataFileRequester) -> None:
        self.dataFile = dataFile
        data = json.loads(
            self.dataFile.fetch("caniuse", "data.json", str=True),
            object_pairs_hook=OrderedDict,
        )
        self.updated = t.cast(int, data["updated"])
        self.classFromBrowser = t.cast("dict[str, str]", data["agents"])
        self.urlFromFeatureName = t.cast("dict[str, str]", data["features"])
        self.features: dict[str, CIUFeature] = {}

    def hasFeature(self, featureName: str) -> bool:
        return featureName in self.urlFromFeatureName

    def getFeature(self, featureName: str) -> CIUFeature | None:
        if featureName in self.features:
            return self.features[featureName]
        if not self.hasFeature(featureName):
            return None
        data = CIUFeature.fromJSON(
            self,
            json.loads(
                self.dataFile.fetch("caniuse", f"feature-{featureName}.json", str=True),
                object_pairs_hook=OrderedDict,
            ),
        )
        self.features[featureName] = data
        return data


@dataclasses.dataclass
class CIUFeature:
    notes: str
    url: str
    support: list[CIUSupport]

    @classmethod
    def fromJSON(cls, data: CIUData, j: t.JSONObject) -> t.Self:
        return cls(
            notes=t.cast(str, j["notes"]),
            url=t.cast(str, j["url"]),
            support=[
                CIUSupport.fromJSON(data, name, unparsed)
                for name, unparsed in t.cast("dict[str, str]", j["support"]).items()
            ],
        )


@dataclasses.dataclass
class CIUSupport:
    browserName: str
    browserClass: str
    status: str
    minVersion: str

    @classmethod
    def fromJSON(cls, data: CIUData, browserName: str, unparsed: str) -> t.Self:
        code = unparsed[0]
        if code == "y":
            status = "yes"
        elif code == "n":
            status = "no"
        elif code == "a":
            status = "partial"
        else:
            status = "unsupported"
        minVersion = unparsed[2:]
        if code == "n" or not minVersion:
            # has to come first, "n all" should output as "none"
            minVersion = "None"
        elif minVersion == "all":
            minVersion = "All"
        else:
            # numeric
            minVersion += "+"
        browserClass = data.classFromBrowser[browserName]
        return cls(browserName, browserClass, status, minVersion)


================================================
FILE: bikeshed/cddl.py
================================================
from __future__ import annotations

import dataclasses
from typing import get_args

import cddlparser

from . import config, h, t
from . import messages as m


@dataclasses.dataclass
class CDDLTerm:
    type: str
    name: str
    dfnFor: str | None


class CDDLMarker(cddlparser.ast.Marker):
    """
    Marker that wraps CDDL definitions and references in <cddl> and <a> blocks
    so that cross-referencing logic may take place.
    """

    # Keep pointers on the current rule context to track generic parameters
    # that are scoped to it
    currentRule: cddlparser.ast.Rule | None
    currentParameters: list[str]

    # List of all CDDL terms defined so far to track and report duplicates
    defined: list[CDDLTerm]

    def __init__(self) -> None:
        self.currentRule = None
        self.currentParameters = []
        self.defined = []

    def _recordDefinition(self, type: str, name: str, dfnFor: str | None = None) -> bool:
        for term in self.defined:
            if term.type == type and term.name == name and term.dfnFor == dfnFor:
                forText = "" if dfnFor is None else f' defined in type "{dfnFor}"'
                m.die(
                    f"CDDL {type} {name}{forText} creates a duplicate and cannot be referenced.\nPlease create additional CDDL types to disambiguate.",
                )
                return False
        if type != "parameter":
            for term in self.defined:
                if term.type != "parameter" and term.name == name and term.dfnFor == dfnFor:
                    forText = "" if dfnFor is None else f' defined in type "{dfnFor}"'
                    m.warn(
                        f"CDDL {type} {name}{forText} creates a duplicate with a CDDL {term.type}.\nLink type needs to be specified to reference the term.\nConsider creating additional CDDL types to disambiguate.",
                    )
                    break
        term = CDDLTerm(type=type, name=name, dfnFor=dfnFor)
        self.defined.append(term)
        return True

    def serializeValue(self, prefix: str, value: str, suffix: str, node: cddlparser.ast.Value) -> str:
        name = prefix + value + suffix
        if node.type not in {"text", "bytes"}:
            return name
        parent = node.parentNode
        assert parent is not None
        if isinstance(parent, cddlparser.ast.Memberkey) and node.type == "text":
            # A literal text string also gives rise to a type
            # see RFC 8610, section 3.5.1:
            # https://datatracker.ietf.org/doc/html/rfc8610#section-3.5.1
            assert parent.parentNode is not None
            forName = self._getFor(parent.parentNode)
            if forName is None:
                # Cannot easily link member key back to a definition
                return name
            elif self._recordDefinition("key", value, forName):
                # Create a key with and without quotes as linking text
                lts = [value, name]
                return '<cddl data-cddl-type="key" data-cddl-for="{}" data-lt="{}">{}</cddl>'.format(
                    h.escapeAttr(forName),
                    h.escapeAttr("|".join(lts)),
                    name,
                )
            else:
                # Duplicate found, don't create a dfn
                return name
        elif isinstance(parent, cddlparser.ast.Operator) and parent.controller == node:
            # Probably a ".default" value. It may be possible to link the value
            # back to an enumeration but it's equally possible that this is just
            # a string that's not defined anywhere. Let's ignore.
            return name
        else:
            forName = self._getFor(node)
            if forName is None:
                return name
            elif self._recordDefinition("value", value, forName):
                lts = [value, name]
                return '<cddl data-cddl-type="value" data-cddl-for="{}" data-lt="{}">{}</cddl>'.format(
                    h.escapeAttr(forName),
                    h.escapeAttr("|".join(lts)),
                    name,
                )
            else:
                # Duplicate found, don't create a dfn
                return name

    def serializeName(self, name: str, node: cddlparser.ast.CDDLNode) -> str:
        # The node is a Typename. Such a node may appear in a Rule, a Type,
        # a Reference, a Memberkey, a GroupEntry, or GenericParameters
        parent = node.parentNode
        if isinstance(parent, cddlparser.ast.Rule):
            # Rule definition
            # Keep a pointer to the rule not to have to look for it again
            # when the function is called on the rule's children
            self.currentRule = parent
            self.currentParameters = []
            if parent.name.parameters is not None:
                assert isinstance(parent.name.parameters, cddlparser.ast.GenericParameters)
                self.currentParameters = [p.name for p in parent.name.parameters.parameters]
            if parent.assign.type in {cddlparser.Tokens.TCHOICEALT, cddlparser.Tokens.GCHOICEALT}:
                # The definition extends a base definition
                return '<a data-link-type="cddl-type" data-link-for="/">{}</a>'.format(name)
            elif self._recordDefinition("type", name):
                return '<cddl data-cddl-type="type" data-lt="{}">{}</cddl>'.format(h.escapeAttr(name), name)
            else:
                # Duplicate found, don't create a dfn
                return name
        elif isinstance(parent, cddlparser.ast.Memberkey):
            # Member definition
            if not parent.hasColon:
                # The key is actually a reference to a type
                if name in get_args(cddlparser.ast.PreludeType):
                    return '<a data-link-type="cddl-type" data-link-for="/" data-link-spec="rfc8610">{}</a>'.format(
                        name,
                    )
                else:
                    return '<a data-link-type="cddl-type" data-link-for="/">{}</a>'.format(name)
            assert parent.parentNode is not None
            forName = self._getFor(parent.parentNode)
            if forName is None:
                # Cannot easily link member key back to a definition
                return name
            else:
                lts = []
                if name[0] == '"':
                    lts = [name[1:-1], name]
                else:
                    lts = [name, '"' + name + '"']
                if self._recordDefinition("key", lts[0], forName):
                    return '<cddl data-cddl-type="key" data-cddl-for="{}" data-lt="{}">{}</cddl>'.format(
                        h.escapeAttr(forName),
                        h.escapeAttr("|".join(lts)),
                        name,
                    )
                else:
                    # Duplicate found, don't create a dfn
                    return name
        elif isinstance(parent, cddlparser.ast.GenericParameters):
            typename = parent.parentNode
            assert isinstance(typename, cddlparser.ast.Typename)
            if self._recordDefinition("parameter", name, typename.name):
                return '<cddl data-cddl-type="parameter" data-cddl-for="{}" data-lt="{}">{}</cddl>'.format(
                    h.escapeAttr(typename.name),
                    h.escapeAttr(name),
                    name,
                )
            else:
                # Duplicate found, don't create a dfn
                return name
        elif name in get_args(cddlparser.ast.PreludeType):
            # Link types that come from the CDDL prelude in RFC 8610
            return '<a data-link-type="cddl-type" data-link-for="/" data-link-spec="rfc8610">{}</a>'.format(name)
        elif name in self.currentParameters:
            # Name is a reference to a generic parameter
            assert self.currentRule is not None
            return '<a data-link-type="cddl-parameter" data-link-for="{}">{}</a>'.format(
                h.escapeAttr(self.currentRule.name.name),
                name,
            )
        else:
            return '<a data-link-type="cddl" data-link-for="/">{}</a>'.format(name)

    def _getFor(self, node: cddlparser.ast.CDDLNode) -> str | None:
        """
        Retrieve the "for" attribute for the node.
        """
        parent = node.parentNode
        while parent is not None:
            if isinstance(parent, cddlparser.ast.Rule):
                # Something defined in a rule
                return parent.name.name
            elif isinstance(parent, cddlparser.ast.GroupEntry) and parent.key is not None:
                # A type in a member key definition
                assert parent.parentNode is not None
                parentFor = self._getFor(parent.parentNode)
                if parentFor is None:
                    return parentFor
                if isinstance(parent.key.type, cddlparser.ast.Value) and parent.key.type.type == "text":
                    return parentFor + "/" + parent.key.type.value
                elif isinstance(parent.key.type, cddlparser.ast.Typename):
                    return parentFor + "/" + parent.key.type.name
                else:
                    return None
            parent = parent.parentNode
        return None


def markupCDDL(doc: t.SpecT) -> None:
    cddlEls = h.findAll("pre.cddl:not([data-no-cddl]), xmp.cddl:not([data-no-cddl])", doc)

    marker = CDDLMarker()
    for el in cddlEls:
        if h.isNormative(doc, el):
            text = h.textContent(el)
            try:
                ast = cddlparser.parse(text)
                h.parseInto(el, h.safeHtml(ast.serialize(marker)))
            except Exception as err:
                m.die(
                    f"{err}\nInvalid CDDL block (first 100 characters):\n{text[0:100]}{'...' if len(text) > 100 else ''}",
                )
        h.addClass(doc, el, "highlight")
        doc.extraJC.addCDDLHighlighting()


def markupCDDLBlock(pre: t.ElementT, doc: t.SpecT) -> set[t.ElementT]:
    """
    Convert <cddl> blocks into "dfn" or links.
    """
    localDfns = set()

    for el in h.findAll("cddl", pre):
        # Prefix CDDL types with "cddl-" to avoid confusion with other
        # types (notably CSS ones such as "value")
        cddlType = "cddl-" + (el.get("data-cddl-type") or "")
        assert isinstance(cddlType, str)
        url = None
        ref = None
        cddlText: str
        for cddlText in (el.get("data-lt") or "").split("|"):
            linkFors: t.Sequence[str | None] | None = config.splitForValues(el.get("data-cddl-for"))
            if linkFors is None:
                linkFors = [None]
            for linkFor in linkFors:
                ref = doc.refs.getRef(
                    cddlType,
                    cddlText,
                    linkFor=linkFor,
                    status="local",
                    el=el,
                    error=True,
                )
                if isinstance(ref, str):
                    ref = None
                if ref:
                    url = ref.url
                    break
            if ref:
                break

        if url is None:
            el.tag = "dfn"
            el.set("data-dfn-type", cddlType)
            del el.attrib["data-cddl-type"]
            if el.get("data-cddl-for"):
                el.set("data-dfn-for", el.get("data-cddl-for") or "")
                del el.attrib["data-cddl-for"]
        else:
            # Copy over the auto-generated linking text to the manual dfn.
            # Note: "url" is not an absolute URL but rather a fragment ref. It
            # can thus be used as an ID selector to find the underlying dfn
            dfn = h.find(url, doc)
            assert dfn is not None
            lts = combineCDDLLinkingTexts(el.get("data-lt"), dfn.get("data-lt"))
            dfn.set("data-lt", lts)
            localDfns.add(dfn)

            # Reset the <cddl> element to be a link to the manual dfn.
            el.tag = "a"
            el.set("data-link-type", cddlType)
            el.set("data-lt", cddlText)
            del el.attrib["data-cddl-type"]
            if el.get("data-cddl-for"):
                el.set("data-link-for", el.get("data-cddl-for") or "")
                del el.attrib["data-cddl-for"]
            if el.get("id"):
                # ID was defensively added by the Marker.
                del el.attrib["id"]
    return localDfns


def combineCDDLLinkingTexts(t1: str | None, t2: str | None) -> str:
    t1s = (t1 or "").split("|")
    t2s = (t2 or "").split("|")
    for lt in t2s:
        if lt not in t1s:
            t1s.append(lt)
    return "|".join(t1s)


================================================
FILE: bikeshed/cli.py
================================================
from __future__ import annotations

import argparse
import json
import os
import sys

from . import config, constants, printjson, template, update
from . import messages as m


def main() -> None:
    # Hack around argparse's lack of optional subparsers
    if len(sys.argv) == 1:
        sys.argv.append("spec")

    try:
        with open(config.scriptPath("semver.txt"), encoding="utf-8") as fh:
            semver = fh.read().strip()
        try:
            with open(config.scriptPath("semver-dev.txt"), encoding="utf-8") as fh:
                devSegment = fh.read().strip()
                semver += "-" + devSegment
        except FileNotFoundError:
            pass
        semverText = f"Bikeshed v{semver}: "
    except FileNotFoundError:
        semver = "???"
        semverText = ""

    argparser = argparse.ArgumentParser(description=f"{semverText}Processes spec source files into valid HTML.")
    argparser.add_argument("--version", action="version", version=semver)
    argparser.add_argument(
        "-q",
        "--quiet",
        dest="quiet",
        action="count",
        default=0,
        help="Silences one level of message, least-important first.",
    )
    argparser.add_argument(
        "-s",
        "--silent",
        dest="silent",
        action="store_true",
        help="Shorthand for 'as many -q as you need to shut it up'",
    )
    argparser.add_argument(
        "-f",
        "--force",
        dest="errorLevel",
        action="store_const",
        const="nothing",
        help="Force the preprocessor to run to completion; fatal errors don't stop processing.",
    )
    argparser.add_argument(
        "-d",
        "--dry-run",
        dest="dryRun",
        action="store_true",
        help="Prevents the processor from actually saving anything to disk, but otherwise fully runs.",
    )
    argparser.add_argument(
        "-a",
        "--ascii-only",
        dest="asciiOnly",
        action="store_true",
        help="Force all Bikeshed messages to be ASCII-only.",
    )
    argparser.add_argument(
        "--print",
        dest="printMode",
        choices=m.PRINT_MODES,
        default=None,
        help="How Bikeshed formats its message output. Options are 'plain' (just text), 'console' (text with console color codes), 'markup' (XML), and 'json' (JSON stream). Defaults to 'console'.",
    )
    argparser.add_argument(
        "--die-on",
        dest="errorLevel",
        choices=list(m.MESSAGE_LEVELS.keys()),
        help="Determines what sorts of errors cause Bikeshed to die (refuse to generate an output document). Default is 'fatal'; the -f flag is a shorthand for 'nothing'",
    )
    argparser.add_argument(
        "--die-when",
        dest="errorTiming",
        choices=m.DEATH_TIMING,
        default="late",
        help="When a disallowed error should force Bikeshed to stop. 'early' causes it to stop immediately so you can deal with the first error; 'late' makes it process the entire document first and only stop at the end so you can see all the errors.",
    )
    argparser.add_argument(
        "--no-update",
        dest="skipUpdate",
        action="store_true",
        help="Skips checking if your data files are up-to-date.",
    )
    argparser.add_argument(
        "--allow-nonlocal-files",
        dest="allowNonlocalFiles",
        action="store_true",
        help="Allows Bikeshed to see/include files from folders higher than the one your source document is in.",
    )
    argparser.add_argument(
        "--allow-execute",
        dest="allowExecute",
        action="store_true",
        help="Allow some features to execute arbitrary code from outside the Bikeshed codebase.",
    )

    subparsers = argparser.add_subparsers(title="Subcommands", dest="subparserName")

    specParser = subparsers.add_parser("spec", help="Process a spec source file into a valid output file.")
    specParser.add_argument(
        "infile",
        nargs="?",
        default=None,
        help='Path to the source file: stdin ("-"), an https URL, a .bs or.src.html file, or a tar archive containing an index.bs file.',
    )
    specParser.add_argument(
        "outfile",
        nargs="?",
        default=None,
        help='Path to the output file: stdout ("-"), or a filename.',
    )
    specParser.add_argument(
        "--debug",
        dest="debug",
        action="store_true",
        help="Switches on some debugging tools. Don't use for production!",
    )
    specParser.add_argument(
        "--debug-print",
        dest="debugPrint",
        choices=["none", "early-parse", "pre-md", "post-md", "boilerplate", "datablocks", "final"],
        nargs="?",
        help="Debug tool to print various views of the document at different stages.",
    )
    specParser.add_argument(
        "--gh-token",
        dest="ghToken",
        nargs="?",
        help="GitHub access token. Useful to avoid API rate limits. Generate tokens: https://github.com/settings/tokens.",
    )
    specParser.add_argument(
        "--byos",
        dest="byos",
        action="store_true",
        help="Bring-Your-Own-Spec: turns off all the Bikeshed auto-niceties, so you can piecemeal its features into your existing doc instead. Experimental, let me know if things get crashy or weird.",
    )
    specParser.add_argument(
        "-l",
        "--line-numbers",
        dest="lineNumbers",
        action="store_true",
        help="Hacky support for outputting line numbers on all error messages. Disables output, as this is hacky and might mess up your source.",
    )

    echidnaParser = subparsers.add_parser(
        "echidna",
        help="Process a spec source file into a valid output file and publish it according to certain automatic protocols.",
    )
    echidnaParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    echidnaParser.add_argument("--u", dest="un", metavar="USERNAME", required=False, help="W3C username.")
    echidnaParser.add_argument("--p", dest="pw", metavar="PASSWORD", required=False, help="W3C password.")
    echidnaParser.add_argument(
        "--decision",
        dest="decision",
        metavar="URL",
        required=False,
        help="URL recording the decision to publish.",
    )
    echidnaParser.add_argument(
        "--gh-token",
        dest="ghToken",
        required=False,
        help="GitHub access token. Useful to avoid API rate limits. Generate tokens: https://github.com/settings/tokens.",
    )
    echidnaParser.add_argument(
        "--timeout",
        dest="timeout",
        metavar="SECONDS",
        required=False,
        default=3,
        type=float,
        help="The timeout for contacting the publication service (default 3s).",
    )
    echidnaParser.add_argument(
        "--editorial",
        dest="editorial",
        action="store_true",
        required=False,
        help="Flags update as editorial.",
    )
    echidnaParser.add_argument(
        "--cc",
        dest="cc",
        metavar="EMAIL",
        required=False,
        help="Comma-separated list of email addresses to ping with the publication status when complete.",
    )
    echidnaParser.add_argument(
        "--additional-directories",
        dest="additionalDirectories",
        required=False,
        nargs="*",
        help="Directories to bundle in the tar file. Defaults to examples/, diagrams/, and images/.",
    )
    echidnaParser.add_argument(
        "--self-contained",
        dest="selfContained",
        action="store_true",
        help="The spec is self-contained, do not bundle any extra directories in the tar file.",
    )
    echidnaParser.add_argument(
        "--just-tar",
        dest="justTar",
        action="store_true",
        help="Don't actually submit to the echidna service, instead just echo the prepared TAR file to stdout.",
    )

    watchParser = subparsers.add_parser(
        "watch",
        help="Process a spec source file into a valid output file, automatically rebuilding when it changes.",
    )
    watchParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    watchParser.add_argument("outfile", nargs="?", default=None, help="Path to the output file.")
    watchParser.add_argument(
        "--gh-token",
        dest="ghToken",
        nargs="?",
        help="GitHub access token. Useful to avoid API rate limits. Generate tokens: https://github.com/settings/tokens.",
    )
    watchParser.add_argument(
        "--byos",
        dest="byos",
        action="store_true",
        help="Bring-Your-Own-Spec: turns off all the Bikeshed auto-niceties, so you can piecemeal its features into your existing doc instead. Experimental, let me know if things get crashy or weird.",
    )

    serveParser = subparsers.add_parser("serve", help="Identical to 'watch', but also serves the folder on localhost.")
    serveParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    serveParser.add_argument("outfile", nargs="?", default=None, help="Path to the output file.")
    serveParser.add_argument(
        "--port",
        dest="port",
        nargs="?",
        default="8000",
        help="Specify the port to serve it over.",
    )
    serveParser.add_argument(
        "--localhost",
        dest="localhost",
        action="store_true",
        help="Only allow connections from localhost.",
    )
    serveParser.add_argument(
        "--gh-token",
        dest="ghToken",
        nargs="?",
        help="GitHub access token. Useful to avoid API rate limits. Generate tokens: https://github.com/settings/tokens.",
    )
    serveParser.add_argument(
        "--byos",
        dest="byos",
        action="store_true",
        help="Bring-Your-Own-Spec: turns off all the Bikeshed auto-niceties, so you can piecemeal its features into your existing doc instead. Experimental, let me know if things get crashy or weird.",
    )

    updateParser = subparsers.add_parser(
        "update",
        help="Update supporting files (those in /spec-data).",
        epilog="If no options are specified, everything is downloaded.",
    )
    updateModeGroup = updateParser.add_mutually_exclusive_group()
    updateModeGroup.add_argument(
        "--skip-manifest",
        dest="updateMode",
        action="store_const",
        const=update.UpdateMode.MANUAL,
        help="Forces Bikeshed to do a full update manually, rather than using the manifest to get the preprocessed update (which can be several minutes old).",
    )
    updateModeGroup.add_argument(
        "--force-manifest",
        dest="updateMode",
        action="store_const",
        const=update.UpdateMode.MANIFEST | update.UpdateMode.FORCE,
        help="Force a manifest-based update even if local manifest data is more recent than the remote manifest.",
    )
    updateModeGroup.set_defaults(
        updateMode=update.UpdateMode.BOTH,
    )
    updateParser.add_argument("--anchors", action="store_true", help="Download crossref anchor data.")
    updateParser.add_argument("--backrefs", action="store_true", help="Download link backref data.")
    updateParser.add_argument("--biblio", action="store_true", help="Download biblio data.")
    updateParser.add_argument("--boilerplate", action="store_true", help="Download boilerplate files.")
    updateParser.add_argument("--caniuse", action="store_true", help="Download Can I Use... data.")
    updateParser.add_argument("--mdn", action="store_true", help="Download MDN Spec Links... data.")
    updateParser.add_argument(
        "--link-defaults",
        dest="linkDefaults",
        action="store_true",
        help="Download link default data.",
    )
    updateParser.add_argument(
        "--languages",
        dest="languages",
        action="store_true",
        help="Download language/translation data.",
    )
    updateParser.add_argument(
        "--wpt",
        dest="wpt",
        action="store_true",
        help="Download web-platform-tests data.",
    )

    issueParser = subparsers.add_parser(
        "issues-list",
        help="Process a plain-text issues file into HTML. Call with no args to see an example input text.",
    )
    issueParser.add_argument(
        "-t",
        dest="printTemplate",
        action="store_true",
        help="Output example Issues List template.",
    )
    issueParser.add_argument("infile", nargs="?", default=None, help="Path to the plain-text issue file.")
    issueParser.add_argument(
        "outfile",
        nargs="?",
        default=None,
        help="Path to the output file. Default is file of the same name as input, with .html.",
    )

    debugParser = subparsers.add_parser("debug", help="Run various debugging commands.")
    debugParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    debugCommands = debugParser.add_mutually_exclusive_group(required=True)
    debugCommands.add_argument(
        "--print-exports",
        dest="printExports",
        action="store_true",
        help="Prints those terms that will be exported for cross-ref purposes.",
    )
    debugCommands.add_argument("--print", dest="code", help="Runs the specified code and prints it.")
    debugCommands.add_argument(
        "--print-json",
        dest="jsonCode",
        help="Runs the specified code and prints it as formatted JSON.",
    )
    debugCommands.add_argument(
        "--refresh-data",
        dest="refreshData",
        action="store_true",
        help="Clobbers the readonly data files with the mutable ones.",
    )
    debugCommands.add_argument(
        "--print-metadata",
        dest="printMetadata",
        action="store_true",
        help="Prints all the metadata parsed for the spec as JSON. Top-level keys are presented in increasing order of importance; second-level keys are in order of first appearance in each context.",
    )

    refParser = subparsers.add_parser("refs", help="Search Bikeshed's ref database.")
    refParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    refParser.add_argument("--text", dest="text", default=None)
    refParser.add_argument("--type", dest="linkType", default=None)
    refParser.add_argument("--for", dest="linkFor", default=None)
    refParser.add_argument("--spec", dest="spec", default=None)
    refParser.add_argument("--status", dest="status", default=None)
    refParser.add_argument(
        "--exact",
        dest="exact",
        action="store_true",
        help="Only search for the exact text provided; don't apply Bikeshed's automatic conjugation help for plurals/etc.",
    )
    refParser.add_argument(
        "--latest-only",
        dest="latestOnly",
        action="store_true",
        help="Apply Bikeshed's logic for only returning the latest version of a given ref when it exists in multiple levels of a spec.",
    )

    sourceParser = subparsers.add_parser("source", help="Tools for formatting the *source* document.")
    sourceParser.add_argument(
        "--big-text",
        dest="bigText",
        action="store_true",
        help="Finds HTML comments containing 'Big Text: foo' and turns them into comments containing 'foo' in big text.",
    )
    sourceParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")
    sourceParser.add_argument("outfile", nargs="?", default=None, help="Path to the output file.")

    outlineParser = subparsers.add_parser("outline", help="Generates an outline for the spec.")
    outlineParser.add_argument("infile", nargs="?", default=None, help="Path to the source file.")

    testParser = subparsers.add_parser("test", help="Tools for running Bikeshed's testsuite.")
    testParser.add_argument(
        "--rebase",
        default=False,
        action="store_true",
        help="Rebase the specified files.",
    )
    testParser.add_argument(
        "--manual",
        dest="manualOnly",
        default=False,
        action="store_true",
        help="Skip testing the real-world files in the repo, and only run the manually-written ones.",
    )
    testParser.add_argument(
        "--folder",
        dest="folders",
        default=None,
        nargs="+",
        help="Only run tests whose paths contain any of these folder names.",
    )
    testParser.add_argument(
        "--file",
        dest="files",
        default=None,
        nargs="+",
        help="Only run tests whose filenames contain any of these strings as substrings.",
    )

    profileParser = subparsers.add_parser(
        "profile",
        help="Profiling Bikeshed. Needs graphviz, gprof2dot, and xdot installed.",
    )
    profileParser.add_argument(
        "--root",
        dest="root",
        default=None,
        metavar="ROOTFUNC",
        help="Prune the graph to start with the specified root node.",
    )
    profileParser.add_argument(
        "--leaf",
        dest="leaf",
        default=None,
        metavar="LEAFFUNC",
        help="Prune the graph to only show ancestors of the specified leaf node.",
    )
    profileParser.add_argument(
        "--svg",
        dest="svgFile",
        default=None,
        help="Save the graph to a specified SVG file, rather than outputting with xdot immediately.",
    )

    templateParser = subparsers.add_parser("template", help="Outputs a skeleton .bs file for you to start with.")
    templateParser.add_argument(
        "variant",
        choices=["spec", "minimal", "test"],
        nargs="?",
        default="spec",
    )
    templateParser.add_argument("outfile", nargs="?", default=None, help="Path to the output file.")

    wptParser = subparsers.add_parser("wpt", help="Tools for writing Web Platform Tests.")
    wptParser.add_argument(
        "--template",
        default=False,
        action="store_true",
        help="Outputs a skeleton WPT file for you to start with.",
    )
    wptParser.add_argument("outfile", nargs="?", default=None, help="Path to the output file.")

    options, extras = argparser.parse_known_args()

    if options.silent:
        m.state.printOn = "nothing"
        m.state.silent = True
    else:
        m.state.printOn = m.MessagesState.categoryName(options.quiet)
    if options.errorLevel is not None:
        m.state.dieOn = options.errorLevel
    m.state.dieWhen = options.errorTiming
    m.state.asciiOnly = options.asciiOnly
    if options.printMode is None:
        if "NO_COLOR" in os.environ or os.environ.get("TERM") == "dumb":
            m.state.printMode = "plain"
        else:
            m.state.printMode = "console"
    else:
        m.state.printMode = options.printMode
    constants.dryRun = options.dryRun
    constants.chroot = not options.allowNonlocalFiles
    constants.executeCode = options.allowExecute

    m.printOpener()

    if options.subparserName in ("spec", "echnida", "watch", "serve", "refs"):
        updateMode = update.UpdateMode.NONE if options.skipUpdate else update.UpdateMode.BOTH
        update.fixupDataFiles(updateMode=updateMode)
    if options.subparserName == "update":
        handleUpdate(options)
    elif options.subparserName == "spec":
        handleSpec(options, extras)
    elif options.subparserName == "echidna":
        handleEchidna(options, extras)
    elif options.subparserName == "watch":
        handleWatch(options, extras)
    elif options.subparserName == "serve":
        handleServe(options, extras)
    elif options.subparserName == "debug":
        handleDebug(options, extras)
    elif options.subparserName == "refs":
        handleRefs(options, extras)
    elif options.subparserName == "issues-list":
        handleIssuesList(options)
    elif options.subparserName == "source":
        handleSource(options)
    elif options.subparserName == "outline":
        handleOutline(options)
    elif options.subparserName == "test":
        handleTest(options, extras)
    elif options.subparserName == "profile":
        handleProfile(options)
    elif options.subparserName == "template":
        handleTemplate(options)
    elif options.subparserName == "wpt":
        handleWpt(options)

    m.printCloser()


def handleUpdate(options: argparse.Namespace) -> None:
    update.update(
        anchors=options.anchors,
        backrefs=options.backrefs,
        biblio=options.biblio,
        boilerplate=options.boilerplate,
        caniuse=options.caniuse,
        mdn=options.mdn,
        linkDefaults=options.linkDefaults,
        languages=options.languages,
        wpt=options.wpt,
        dryRun=constants.dryRun,
        updateMode=options.updateMode,
    )


def handleSpec(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata
    from .Spec import Spec

    doc = Spec(
        inputFilename=options.infile,
        debug=options.debug,
        debugPrint=options.debugPrint,
        token=options.ghToken,
        lineNumbers=options.lineNumbers,
    )
    if not doc.valid:
        m.die("Spec is in an invalid state; exitting.")
        return
    doc.mdCommandLine = metadata.fromCommandLine(extras)
    if options.errorLevel:
        doc.mdCommandLine.addData("Die On", options.errorLevel)
    if options.errorTiming:
        doc.mdCommandLine.addData("Die When", options.errorTiming)
    if options.byos:
        doc.mdCommandLine.addData("Group", "byos")
    doc.preprocess()
    doc.finish(outputFilename=options.outfile)


def handleEchidna(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata, publish
    from .Spec import Spec

    doc = Spec(inputFilename=options.infile, token=options.ghToken)
    if not doc.valid:
        m.die("Spec is in an invalid state; exitting.")
        return
    doc.mdCommandLine = metadata.fromCommandLine(extras)
    doc.mdCommandLine.addData("Prepare For TR", "yes")
    doc.preprocess()
    addDirs = [] if options.selfContained else options.additionalDirectories
    if options.justTar:
        tarBytes = publish.prepareTar(doc, additionalDirectories=addDirs)
        sys.stdout.buffer.write(tarBytes)
    else:
        publish.publishEchidna(
            doc,
            username=options.un,
            password=options.pw,
            decision=options.decision,
            additionalDirectories=addDirs,
            cc=options.cc,
            editorial=options.editorial,
            timeout=options.timeout,
        )


def handleWatch(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata
    from .Spec import Spec

    doc = Spec(inputFilename=options.infile, token=options.ghToken)
    if not doc.valid:
        m.die("Spec is in an invalid state; exitting.")
        return
    doc.mdCommandLine = metadata.fromCommandLine(extras)
    if options.byos:
        doc.mdCommandLine.addData("Group", "byos")
    doc.watch(outputFilename=options.outfile)


def handleServe(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata
    from .Spec import Spec

    doc = Spec(inputFilename=options.infile, token=options.ghToken)
    if not doc.valid:
        m.die("Spec is in an invalid state; exitting.")
        return
    doc.mdCommandLine = metadata.fromCommandLine(extras)
    # Can't have an error killing the watcher
    doc.mdCommandLine.addData("Die On", "nothing")
    if options.byos:
        doc.mdCommandLine.addData("Group", "byos")
    doc.watch(outputFilename=options.outfile, port=int(options.port))


def handleDebug(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata
    from .Spec import Spec

    m.state.dieOn = "nothing"
    m.state.printOn = "fatal"
    if options.printExports:
        doc = Spec(inputFilename=options.infile)
        doc.mdCommandLine = metadata.fromCommandLine(extras)
        doc.preprocess()
        doc.printTargets()
    elif options.jsonCode:
        doc = Spec(inputFilename=options.infile)
        doc.mdCommandLine = metadata.fromCommandLine(extras)
        doc.preprocess()
        exec(f"print(config.printjson({options.jsonCode}))")
    elif options.code:
        doc = Spec(inputFilename=options.infile)
        doc.mdCommandLine = metadata.fromCommandLine(extras)
        doc.preprocess()
        exec(f"print({options.code})")
    elif options.refreshData:
        m.state.printOn = "everything"
        update.updateReadonlyDataFiles()
        m.warn("Don't forget to bump the version number!")
    elif options.printMetadata:
        doc = Spec(inputFilename=options.infile)
        doc.mdCommandLine = metadata.fromCommandLine(extras)
        doc.preprocess()
        md = {
            "defaults.include": doc.mdDefaults.allData if doc.mdDefaults else [],
            "computed-metadata.include": doc.mdOverridingDefaults.allData if doc.mdOverridingDefaults else [],
            "document": doc.mdDocument.allData if doc.mdDocument else [],
            "command-line": doc.mdCommandLine.allData,
        }
        print(json.dumps(md, indent=2, default=printjson.getjson))  # noqa: T201


def handleRefs(options: argparse.Namespace, extras: list[str]) -> None:
    from . import datablocks, metadata
    from .refs import ReferenceManager
    from .Spec import Spec

    m.state.dieOn = "nothing"
    m.state.printOn = "nothing"
    doc = Spec(inputFilename=options.infile)
    if doc.valid:
        doc.mdCommandLine = metadata.fromCommandLine(extras)
        doc.preprocess()
        rm = doc.refs
    else:
        rm = ReferenceManager()
        rm.initializeRefs(datablocks=datablocks)
    if options.text:
        options.text = options.text
    refs = rm.queryAllRefs(
        text=options.text,
        linkFor=options.linkFor,
        linkType=options.linkType,
        status=options.status,
        spec=options.spec,
        latestOnly=options.latestOnly,
        exact=options.exact,
    )
    if m.state.printMode == "json":
        dumped = json.dumps(refs, indent=2, default=printjson.getjson)
        dumped = dumped[1:]  # Remove the opening [ since that's printed by printOpener()
        m.p(dumped)  # Go straight to m.p() so no formatting happens.
        sys.exit(0)  # Exit early so printCloser() doesn't run
    else:
        m.state.printOn = "everything"
        m.say(printjson.printjson(refs))


def handleIssuesList(options: argparse.Namespace) -> None:
    from . import issuelist

    if options.printTemplate:
        issuelist.printHelpMessage()
    else:
        success = issuelist.printIssueList(options.infile, options.outfile)
        if not success:
            m.failure("An error prevented the issues list from being generated.")


def handleSource(options: argparse.Namespace) -> None:
    from . import fonts

    try:
        fontPath = config.scriptPath("fonts", "smallblocks.bsfont")
        font = fonts.Font.fromPath(fontPath)
        fonts.replaceComments(font=font, inputFilename=options.infile, outputFilename=options.outfile)
    except Exception as e:
        m.die(f"Error trying to embiggen text:\n{e}")
        return


def handleOutline(options: argparse.Namespace) -> None:
    from . import outline
    from .Spec import Spec

    doc = Spec(inputFilename=options.infile)
    if not doc.valid:
        return
    with m.messagesSilent() as _:
        doc.preprocess()
    m.say(outline.printOutline(doc))


def handleTest(options: argparse.Namespace, extras: list[str]) -> None:
    from . import metadata, test

    md = metadata.fromCommandLine(extras)
    m.state.dieOn = "nothing"
    filters = test.TestFilter.fromOptions(options)
    if options.rebase:
        test.rebase(filters, md=md)
    else:
        result = test.run(filters, md=md)
        sys.exit(0 if result else 1)


def handleProfile(options: argparse.Namespace) -> None:
    root = f'--root="{options.root}"' if options.root else ""
    leaf = f'--leaf="{options.leaf}"' if options.leaf else ""
    if options.svgFile:
        os.system(  # noqa: S605
            f"time python -m cProfile -o stat.prof -m bikeshed -f spec && gprof2dot -f pstats --skew=.0001 {root} {leaf} stat.prof | dot -Tsvg -o {options.svgFile} && rm stat.prof",
        )
    else:
        os.system(  # noqa: S605
            f"time python -m cProfile -o /tmp/stat.prof -m bikeshed -f spec && gprof2dot -f pstats --skew=.0001 {root} {leaf} /tmp/stat.prof | xdot &",
        )


def handleTemplate(options: argparse.Namespace) -> None:
    if not options.outfile:
        ret = template.getTemplate(options.variant)
        if ret:
            m.say(ret)
        else:
            m.failure("Could not generate a template.")
    else:
        with open(options.outfile, "w", encoding="utf-8") as fh:
            fh.write(template.getTemplate(options.variant) or "")


def handleWpt(options: argparse.Namespace) -> None:
    if options.template:
        if not options.outfile:
            ret = template.getTemplate("wpt")
            if ret:
                m.say(ret)
            else:
                m.failure("Could not generate a template.")
        else:
            with open(options.outfile, "w", encoding="utf-8") as fh:
                fh.write(template.getTemplate("wpt") or "")
    else:
        m.failure("Unknown sub-option for `bikeshed wpt` (currently only --template is supported).")


================================================
FILE: bikeshed/conditional.py
================================================
from __future__ import annotations

import dataclasses
import re

from . import h, t
from . import messages as m

# Any element can have an include-if or exclude-if attribute,
# containing a comma-separated list of conditions (described below).
# If an element has include-if, it must match at least one condition,
# or else it's removed from the document.
# If an element has exclude-if, if it matches at least one condition,
# it's removed from the document.
# (An element can have both; both of the above conditions apply.)
#
# A condition is either a Status value, or a `!Foo: bar` custom metadata declaration,
Download .txt
Showing preview only (233K chars total). Download the full file or copy to clipboard to get everything.
gitextract_fx1j65pu/

├── .gitattributes
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── build-docs.yml
│       ├── ci.yml
│       ├── playwright.yml
│       ├── pylint-problem-matcher.json
│       ├── update-tests/
│       │   ├── README.md
│       │   ├── requirements.txt
│       │   ├── specs.data
│       │   └── update.py
│       └── update-tests.yml
├── .gitignore
├── .vscode/
│   └── settings.json
├── Bikeshed.tmLanguage
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── README.md
├── bikeshed/
│   ├── InputSource.py
│   ├── Spec.py
│   ├── __init__.py
│   ├── __main__.py
│   ├── biblio.py
│   ├── boilerplate/
│   │   └── README.md
│   ├── boilerplate.py
│   ├── caniuse/
│   │   ├── __init__.py
│   │   ├── caniuse-panel.css
│   │   └── caniuse.py
│   ├── cddl.py
│   ├── cli.py
│   ├── conditional.py
│   ├── config/
│   │   ├── BoolSet.py
│   │   ├── __init__.py
│   │   ├── dfnTypes.py
│   │   └── main.py
│   ├── constants.py
│   ├── datablocks.py
│   ├── dfnpanels/
│   │   ├── __init__.py
│   │   ├── dfn-panel.css
│   │   ├── dfn-panel.js
│   │   └── dfnpanels.py
│   ├── dfns/
│   │   ├── __init__.py
│   │   └── attributeInfo.py
│   ├── doctypes/
│   │   ├── __init__.py
│   │   ├── manager.py
│   │   └── utils.py
│   ├── extensions.py
│   ├── fingerprinting.py
│   ├── fonts/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── bigblocks.bsfont
│   │   ├── fonts.py
│   │   ├── rewrite.py
│   │   └── smallblocks.bsfont
│   ├── func.py
│   ├── h/
│   │   ├── __init__.py
│   │   ├── dom.py
│   │   ├── merge.py
│   │   ├── parser/
│   │   │   ├── __init__.py
│   │   │   ├── main.py
│   │   │   ├── nodes.py
│   │   │   ├── parser.py
│   │   │   ├── preds.py
│   │   │   ├── result.py
│   │   │   ├── simpleparser.py
│   │   │   └── stream.py
│   │   └── serializer.py
│   ├── headings.py
│   ├── highlight/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── highlight.py
│   │   ├── line-highlighting.css
│   │   ├── line-numbers.css
│   │   └── syntax-highlighting.css
│   ├── idl.py
│   ├── includes.py
│   ├── inlineTags/
│   │   └── __init__.py
│   ├── issuelist.py
│   ├── language.py
│   ├── lexers.py
│   ├── line.py
│   ├── lint/
│   │   ├── __init__.py
│   │   ├── accidental2119.py
│   │   ├── brokenLinks.py
│   │   ├── exampleIDs.py
│   │   ├── missingExposed.py
│   │   ├── requiredIDs.py
│   │   └── unusedInternalDfns.py
│   ├── markdown/
│   │   ├── __init__.py
│   │   ├── inlines.py
│   │   └── markdown.py
│   ├── mdn/
│   │   ├── __init__.py
│   │   ├── mdn-anno.css
│   │   └── mdnspeclinks.py
│   ├── messages.py
│   ├── metadata.py
│   ├── outline.py
│   ├── printjson.py
│   ├── publish.py
│   ├── py.typed
│   ├── pyg.py
│   ├── railroaddiagrams.py
│   ├── railroadparser.py
│   ├── refs/
│   │   ├── __init__.py
│   │   ├── external.py
│   │   ├── headingdata.py
│   │   ├── manager.py
│   │   ├── ref-hints.css
│   │   ├── ref-hints.js
│   │   ├── source.py
│   │   ├── utils.py
│   │   └── wrapper.py
│   ├── repository.py
│   ├── result/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── retrieve.py
│   ├── semver-dev.txt
│   ├── semver.txt
│   ├── shorthands/
│   │   ├── __init__.py
│   │   └── oldShorthands.py
│   ├── spec-data/
│   │   └── readonly/
│   │       ├── anchors/
│   │       │   ├── anchors-1_.data
│   │       │   ├── anchors-1d.data
│   │       │   ├── anchors-1s.data
│   │       │   ├── anchors-1u.data
│   │       │   ├── anchors-24.data
│   │       │   ├── anchors-2d.data
│   │       │   ├── anchors-2g.data
│   │       │   ├── anchors-2n.data
│   │       │   ├── anchors-2u.data
│   │       │   ├── anchors-2x.data
│   │       │   ├── anchors-34.data
│   │       │   ├── anchors-3d.data
│   │       │   ├── anchors-3f.data
│   │       │   ├── anchors-3g.data
│   │       │   ├── anchors-3r.data
│   │       │   ├── anchors-4c.data
│   │       │   ├── anchors-4g.data
│   │       │   ├── anchors-4t.data
│   │       │   ├── anchors-4x.data
│   │       │   ├── anchors-54.data
│   │       │   ├── anchors-55.data
│   │       │   ├── anchors-64.data
│   │       │   ├── anchors-6d.data
│   │       │   ├── anchors-__.data
│   │       │   ├── anchors-a1.data
│   │       │   ├── anchors-a3.data
│   │       │   ├── anchors-a4.data
│   │       │   ├── anchors-a5.data
│   │       │   ├── anchors-a9.data
│   │       │   ├── anchors-a_.data
│   │       │   ├── anchors-aa.data
│   │       │   ├── anchors-ab.data
│   │       │   ├── anchors-ac.data
│   │       │   ├── anchors-ad.data
│   │       │   ├── anchors-ae.data
│   │       │   ├── anchors-af.data
│   │       │   ├── anchors-ag.data
│   │       │   ├── anchors-ak.data
│   │       │   ├── anchors-al.data
│   │       │   ├── anchors-am.data
│   │       │   ├── anchors-an.data
│   │       │   ├── anchors-ap.data
│   │       │   ├── anchors-aq.data
│   │       │   ├── anchors-ar.data
│   │       │   ├── anchors-as.data
│   │       │   ├── anchors-at.data
│   │       │   ├── anchors-au.data
│   │       │   ├── anchors-av.data
│   │       │   ├── anchors-aw.data
│   │       │   ├── anchors-ax.data
│   │       │   ├── anchors-ay.data
│   │       │   ├── anchors-az.data
│   │       │   ├── anchors-b4.data
│   │       │   ├── anchors-b5.data
│   │       │   ├── anchors-b_.data
│   │       │   ├── anchors-ba.data
│   │       │   ├── anchors-bc.data
│   │       │   ├── anchors-bd.data
│   │       │   ├── anchors-be.data
│   │       │   ├── anchors-bf.data
│   │       │   ├── anchors-bg.data
│   │       │   ├── anchors-bi.data
│   │       │   ├── anchors-bl.data
│   │       │   ├── anchors-bm.data
│   │       │   ├── anchors-bo.data
│   │       │   ├── anchors-br.data
│   │       │   ├── anchors-bs.data
│   │       │   ├── anchors-bt.data
│   │       │   ├── anchors-bu.data
│   │       │   ├── anchors-bv.data
│   │       │   ├── anchors-by.data
│   │       │   ├── anchors-c0.data
│   │       │   ├── anchors-c_.data
│   │       │   ├── anchors-ca.data
│   │       │   ├── anchors-cb.data
│   │       │   ├── anchors-cc.data
│   │       │   ├── anchors-cd.data
│   │       │   ├── anchors-ce.data
│   │       │   ├── anchors-cf.data
│   │       │   ├── anchors-ch.data
│   │       │   ├── anchors-ci.data
│   │       │   ├── anchors-cj.data
│   │       │   ├── anchors-cl.data
│   │       │   ├── anchors-cm.data
│   │       │   ├── anchors-cn.data
│   │       │   ├── anchors-co.data
│   │       │   ├── anchors-cp.data
│   │       │   ├── anchors-cq.data
│   │       │   ├── anchors-cr.data
│   │       │   ├── anchors-cs.data
│   │       │   ├── anchors-ct.data
│   │       │   ├── anchors-cu.data
│   │       │   ├── anchors-cw.data
│   │       │   ├── anchors-cx.data
│   │       │   ├── anchors-cy.data
│   │       │   ├── anchors-d5.data
│   │       │   ├── anchors-d6.data
│   │       │   ├── anchors-d_.data
│   │       │   ├── anchors-da.data
│   │       │   ├── anchors-db.data
│   │       │   ├── anchors-dc.data
│   │       │   ├── anchors-dd.data
│   │       │   ├── anchors-de.data
│   │       │   ├── anchors-df.data
│   │       │   ├── anchors-di.data
│   │       │   ├── anchors-dl.data
│   │       │   ├── anchors-dn.data
│   │       │   ├── anchors-do.data
│   │       │   ├── anchors-dp.data
│   │       │   ├── anchors-dq.data
│   │       │   ├── anchors-dr.data
│   │       │   ├── anchors-ds.data
│   │       │   ├── anchors-dt.data
│   │       │   ├── anchors-du.data
│   │       │   ├── anchors-dv.data
│   │       │   ├── anchors-dx.data
│   │       │   ├── anchors-dy.data
│   │       │   ├── anchors-e_.data
│   │       │   ├── anchors-ea.data
│   │       │   ├── anchors-ec.data
│   │       │   ├── anchors-ed.data
│   │       │   ├── anchors-ef.data
│   │       │   ├── anchors-ei.data
│   │       │   ├── anchors-ej.data
│   │       │   ├── anchors-el.data
│   │       │   ├── anchors-em.data
│   │       │   ├── anchors-en.data
│   │       │   ├── anchors-eo.data
│   │       │   ├── anchors-ep.data
│   │       │   ├── anchors-eq.data
│   │       │   ├── anchors-er.data
│   │       │   ├── anchors-es.data
│   │       │   ├── anchors-et.data
│   │       │   ├── anchors-eu.data
│   │       │   ├── anchors-ev.data
│   │       │   ├── anchors-ew.data
│   │       │   ├── anchors-ex.data
│   │       │   ├── anchors-ey.data
│   │       │   ├── anchors-f1.data
│   │       │   ├── anchors-f3.data
│   │       │   ├── anchors-f6.data
│   │       │   ├── anchors-f_.data
│   │       │   ├── anchors-fa.data
│   │       │   ├── anchors-fe.data
│   │       │   ├── anchors-ff.data
│   │       │   ├── anchors-fg.data
│   │       │   ├── anchors-fi.data
│   │       │   ├── anchors-fl.data
│   │       │   ├── anchors-fm.data
│   │       │   ├── anchors-fn.data
│   │       │   ├── anchors-fo.data
│   │       │   ├── anchors-fr.data
│   │       │   ├── anchors-fu.data
│   │       │   ├── anchors-fw.data
│   │       │   ├── anchors-fx.data
│   │       │   ├── anchors-fy.data
│   │       │   ├── anchors-g_.data
│   │       │   ├── anchors-ga.data
│   │       │   ├── anchors-gb.data
│   │       │   ├── anchors-gc.data
│   │       │   ├── anchors-ge.data
│   │       │   ├── anchors-gh.data
│   │       │   ├── anchors-gi.data
│   │       │   ├── anchors-gl.data
│   │       │   ├── anchors-go.data
│   │       │   ├── anchors-gp.data
│   │       │   ├── anchors-gr.data
│   │       │   ├── anchors-gt.data
│   │       │   ├── anchors-gu.data
│   │       │   ├── anchors-gy.data
│   │       │   ├── anchors-gz.data
│   │       │   ├── anchors-h1.data
│   │       │   ├── anchors-h2.data
│   │       │   ├── anchors-h3.data
│   │       │   ├── anchors-h4.data
│   │       │   ├── anchors-h5.data
│   │       │   ├── anchors-h6.data
│   │       │   ├── anchors-h_.data
│   │       │   ├── anchors-ha.data
│   │       │   ├── anchors-hd.data
│   │       │   ├── anchors-he.data
│   │       │   ├── anchors-hg.data
│   │       │   ├── anchors-hh.data
│   │       │   ├── anchors-hi.data
│   │       │   ├── anchors-hk.data
│   │       │   ├── anchors-hl.data
│   │       │   ├── anchors-hm.data
│   │       │   ├── anchors-ho.data
│   │       │   ├── anchors-hr.data
│   │       │   ├── anchors-hs.data
│   │       │   ├── anchors-ht.data
│   │       │   ├── anchors-hu.data
│   │       │   ├── anchors-hv.data
│   │       │   ├── anchors-hw.data
│   │       │   ├── anchors-hy.data
│   │       │   ├── anchors-hz.data
│   │       │   ├── anchors-i1.data
│   │       │   ├── anchors-i3.data
│   │       │   ├── anchors-i4.data
│   │       │   ├── anchors-i6.data
│   │       │   ├── anchors-i_.data
│   │       │   ├── anchors-ia.data
│   │       │   ├── anchors-ib.data
│   │       │   ├── anchors-ic.data
│   │       │   ├── anchors-id.data
│   │       │   ├── anchors-ie.data
│   │       │   ├── anchors-if.data
│   │       │   ├── anchors-ig.data
│   │       │   ├── anchors-ih.data
│   │       │   ├── anchors-ii.data
│   │       │   ├── anchors-ij.data
│   │       │   ├── anchors-il.data
│   │       │   ├── anchors-im.data
│   │       │   ├── anchors-in.data
│   │       │   ├── anchors-io.data
│   │       │   ├── anchors-ip.data
│   │       │   ├── anchors-ir.data
│   │       │   ├── anchors-is.data
│   │       │   ├── anchors-it.data
│   │       │   ├── anchors-iv.data
│   │       │   ├── anchors-ja.data
│   │       │   ├── anchors-ji.data
│   │       │   ├── anchors-jo.data
│   │       │   ├── anchors-js.data
│   │       │   ├── anchors-ju.data
│   │       │   ├── anchors-jw.data
│   │       │   ├── anchors-jz.data
│   │       │   ├── anchors-k1.data
│   │       │   ├── anchors-k2.data
│   │       │   ├── anchors-k3.data
│   │       │   ├── anchors-k4.data
│   │       │   ├── anchors-k_.data
│   │       │   ├── anchors-ka.data
│   │       │   ├── anchors-kb.data
│   │       │   ├── anchors-ke.data
│   │       │   ├── anchors-kh.data
│   │       │   ├── anchors-ki.data
│   │       │   ├── anchors-kn.data
│   │       │   ├── anchors-ko.data
│   │       │   ├── anchors-kr.data
│   │       │   ├── anchors-kt.data
│   │       │   ├── anchors-l1.data
│   │       │   ├── anchors-l2.data
│   │       │   ├── anchors-l3.data
│   │       │   ├── anchors-l_.data
│   │       │   ├── anchors-la.data
│   │       │   ├── anchors-lb.data
│   │       │   ├── anchors-lc.data
│   │       │   ├── anchors-le.data
│   │       │   ├── anchors-lh.data
│   │       │   ├── anchors-li.data
│   │       │   ├── anchors-ln.data
│   │       │   ├── anchors-lo.data
│   │       │   ├── anchors-lr.data
│   │       │   ├── anchors-ls.data
│   │       │   ├── anchors-lt.data
│   │       │   ├── anchors-lu.data
│   │       │   ├── anchors-lv.data
│   │       │   ├── anchors-lz.data
│   │       │   ├── anchors-m1.data
│   │       │   ├── anchors-m2.data
│   │       │   ├── anchors-m3.data
│   │       │   ├── anchors-m4.data
│   │       │   ├── anchors-ma.data
│   │       │   ├── anchors-mb.data
│   │       │   ├── anchors-mc.data
│   │       │   ├── anchors-me.data
│   │       │   ├── anchors-mf.data
│   │       │   ├── anchors-mi.data
│   │       │   ├── anchors-ml.data
│   │       │   ├── anchors-mm.data
│   │       │   ├── anchors-mn.data
│   │       │   ├── anchors-mo.data
│   │       │   ├── anchors-mp.data
│   │       │   ├── anchors-mq.data
│   │       │   ├── anchors-mr.data
│   │       │   ├── anchors-ms.data
│   │       │   ├── anchors-mt.data
│   │       │   ├── anchors-mu.data
│   │       │   ├── anchors-my.data
│   │       │   ├── anchors-n_.data
│   │       │   ├── anchors-na.data
│   │       │   ├── anchors-nc.data
│   │       │   ├── anchors-nd.data
│   │       │   ├── anchors-ne.data
│   │       │   ├── anchors-nf.data
│   │       │   ├── anchors-nh.data
│   │       │   ├── anchors-ni.data
│   │       │   ├── anchors-nn.data
│   │       │   ├── anchors-no.data
│   │       │   ├── anchors-np.data
│   │       │   ├── anchors-nq.data
│   │       │   ├── anchors-nr.data
│   │       │   ├── anchors-ns.data
│   │       │   ├── anchors-nt.data
│   │       │   ├── anchors-nu.data
│   │       │   ├── anchors-nv.data
│   │       │   ├── anchors-nw.data
│   │       │   ├── anchors-ny.data
│   │       │   ├── anchors-oa.data
│   │       │   ├── anchors-ob.data
│   │       │   ├── anchors-oc.data
│   │       │   ├── anchors-od.data
│   │       │   ├── anchors-oe.data
│   │       │   ├── anchors-of.data
│   │       │   ├── anchors-og.data
│   │       │   ├── anchors-oh.data
│   │       │   ├── anchors-oi.data
│   │       │   ├── anchors-ok.data
│   │       │   ├── anchors-ol.data
│   │       │   ├── anchors-om.data
│   │       │   ├── anchors-on.data
│   │       │   ├── anchors-op.data
│   │       │   ├── anchors-or.data
│   │       │   ├── anchors-os.data
│   │       │   ├── anchors-ot.data
│   │       │   ├── anchors-ou.data
│   │       │   ├── anchors-ov.data
│   │       │   ├── anchors-ow.data
│   │       │   ├── anchors-p1.data
│   │       │   ├── anchors-p2.data
│   │       │   ├── anchors-p3.data
│   │       │   ├── anchors-p4.data
│   │       │   ├── anchors-p_.data
│   │       │   ├── anchors-pa.data
│   │       │   ├── anchors-pb.data
│   │       │   ├── anchors-pc.data
│   │       │   ├── anchors-pd.data
│   │       │   ├── anchors-pe.data
│   │       │   ├── anchors-ph.data
│   │       │   ├── anchors-pi.data
│   │       │   ├── anchors-pk.data
│   │       │   ├── anchors-pl.data
│   │       │   ├── anchors-pm.data
│   │       │   ├── anchors-pn.data
│   │       │   ├── anchors-po.data
│   │       │   ├── anchors-pq.data
│   │       │   ├── anchors-pr.data
│   │       │   ├── anchors-ps.data
│   │       │   ├── anchors-pt.data
│   │       │   ├── anchors-pu.data
│   │       │   ├── anchors-px.data
│   │       │   ├── anchors-q_.data
│   │       │   ├── anchors-qi.data
│   │       │   ├── anchors-qp.data
│   │       │   ├── anchors-qr.data
│   │       │   ├── anchors-qu.data
│   │       │   ├── anchors-qv.data
│   │       │   ├── anchors-qw.data
│   │       │   ├── anchors-r1.data
│   │       │   ├── anchors-r3.data
│   │       │   ├── anchors-r8.data
│   │       │   ├── anchors-r_.data
│   │       │   ├── anchors-ra.data
│   │       │   ├── anchors-rb.data
│   │       │   ├── anchors-rc.data
│   │       │   ├── anchors-rd.data
│   │       │   ├── anchors-re.data
│   │       │   ├── anchors-rf.data
│   │       │   ├── anchors-rg.data
│   │       │   ├── anchors-rh.data
│   │       │   ├── anchors-ri.data
│   │       │   ├── anchors-rk.data
│   │       │   ├── anchors-rl.data
│   │       │   ├── anchors-rm.data
│   │       │   ├── anchors-ro.data
│   │       │   ├── anchors-rp.data
│   │       │   ├── anchors-rr.data
│   │       │   ├── anchors-rs.data
│   │       │   ├── anchors-rt.data
│   │       │   ├── anchors-ru.data
│   │       │   ├── anchors-rx.data
│   │       │   ├── anchors-ry.data
│   │       │   ├── anchors-rz.data
│   │       │   ├── anchors-s1.data
│   │       │   ├── anchors-s2.data
│   │       │   ├── anchors-s3.data
│   │       │   ├── anchors-s_.data
│   │       │   ├── anchors-sa.data
│   │       │   ├── anchors-sc.data
│   │       │   ├── anchors-sd.data
│   │       │   ├── anchors-se.data
│   │       │   ├── anchors-sf.data
│   │       │   ├── anchors-sh.data
│   │       │   ├── anchors-si.data
│   │       │   ├── anchors-sk.data
│   │       │   ├── anchors-sl.data
│   │       │   ├── anchors-sm.data
│   │       │   ├── anchors-sn.data
│   │       │   ├── anchors-so.data
│   │       │   ├── anchors-sp.data
│   │       │   ├── anchors-sq.data
│   │       │   ├── anchors-sr.data
│   │       │   ├── anchors-ss.data
│   │       │   ├── anchors-st.data
│   │       │   ├── anchors-su.data
│   │       │   ├── anchors-sv.data
│   │       │   ├── anchors-sw.data
│   │       │   ├── anchors-sx.data
│   │       │   ├── anchors-sy.data
│   │       │   ├── anchors-t0.data
│   │       │   ├── anchors-t1.data
│   │       │   ├── anchors-t2.data
│   │       │   ├── anchors-t_.data
│   │       │   ├── anchors-ta.data
│   │       │   ├── anchors-tb.data
│   │       │   ├── anchors-tc.data
│   │       │   ├── anchors-td.data
│   │       │   ├── anchors-te.data
│   │       │   ├── anchors-tf.data
│   │       │   ├── anchors-th.data
│   │       │   ├── anchors-ti.data
│   │       │   ├── anchors-tk.data
│   │       │   ├── anchors-tl.data
│   │       │   ├── anchors-tn.data
│   │       │   ├── anchors-to.data
│   │       │   ├── anchors-tr.data
│   │       │   ├── anchors-ts.data
│   │       │   ├── anchors-tt.data
│   │       │   ├── anchors-tu.data
│   │       │   ├── anchors-tv.data
│   │       │   ├── anchors-tw.data
│   │       │   ├── anchors-tx.data
│   │       │   ├── anchors-ty.data
│   │       │   ├── anchors-tz.data
│   │       │   ├── anchors-u3.data
│   │       │   ├── anchors-u8.data
│   │       │   ├── anchors-u_.data
│   │       │   ├── anchors-ua.data
│   │       │   ├── anchors-ub.data
│   │       │   ├── anchors-ud.data
│   │       │   ├── anchors-ui.data
│   │       │   ├── anchors-ul.data
│   │       │   ├── anchors-un.data
│   │       │   ├── anchors-up.data
│   │       │   ├── anchors-ur.data
│   │       │   ├── anchors-us.data
│   │       │   ├── anchors-ut.data
│   │       │   ├── anchors-uu.data
│   │       │   ├── anchors-uv.data
│   │       │   ├── anchors-v1.data
│   │       │   ├── anchors-v_.data
│   │       │   ├── anchors-va.data
│   │       │   ├── anchors-vb.data
│   │       │   ├── anchors-vc.data
│   │       │   ├── anchors-ve.data
│   │       │   ├── anchors-vh.data
│   │       │   ├── anchors-vi.data
│   │       │   ├── anchors-vl.data
│   │       │   ├── anchors-vm.data
│   │       │   ├── anchors-vo.data
│   │       │   ├── anchors-vp.data
│   │       │   ├── anchors-vs.data
│   │       │   ├── anchors-vt.data
│   │       │   ├── anchors-vw.data
│   │       │   ├── anchors-w3.data
│   │       │   ├── anchors-w_.data
│   │       │   ├── anchors-wa.data
│   │       │   ├── anchors-wb.data
│   │       │   ├── anchors-wc.data
│   │       │   ├── anchors-wd.data
│   │       │   ├── anchors-we.data
│   │       │   ├── anchors-wg.data
│   │       │   ├── anchors-wh.data
│   │       │   ├── anchors-wi.data
│   │       │   ├── anchors-wo.data
│   │       │   ├── anchors-wp.data
│   │       │   ├── anchors-wq.data
│   │       │   ├── anchors-wr.data
│   │       │   ├── anchors-ws.data
│   │       │   ├── anchors-x1.data
│   │       │   ├── anchors-x2.data
│   │       │   ├── anchors-x_.data
│   │       │   ├── anchors-xa.data
│   │       │   ├── anchors-xb.data
│   │       │   ├── anchors-xc.data
│   │       │   ├── anchors-xe.data
│   │       │   ├── anchors-xf.data
│   │       │   ├── anchors-xh.data
│   │       │   ├── anchors-xl.data
│   │       │   ├── anchors-xm.data
│   │       │   ├── anchors-xo.data
│   │       │   ├── anchors-xp.data
│   │       │   ├── anchors-xr.data
│   │       │   ├── anchors-xs.data
│   │       │   ├── anchors-xu.data
│   │       │   ├── anchors-xw.data
│   │       │   ├── anchors-xx.data
│   │       │   ├── anchors-xy.data
│   │       │   ├── anchors-y1.data
│   │       │   ├── anchors-y2.data
│   │       │   ├── anchors-y_.data
│   │       │   ├── anchors-ya.data
│   │       │   ├── anchors-yb.data
│   │       │   ├── anchors-yc.data
│   │       │   ├── anchors-ye.data
│   │       │   ├── anchors-yi.data
│   │       │   ├── anchors-yo.data
│   │       │   ├── anchors-ys.data
│   │       │   ├── anchors-yu.data
│   │       │   ├── anchors-z_.data
│   │       │   ├── anchors-za.data
│   │       │   ├── anchors-zb.data
│   │       │   ├── anchors-zc.data
│   │       │   ├── anchors-ze.data
│   │       │   ├── anchors-zh.data
│   │       │   ├── anchors-zi.data
│   │       │   ├── anchors-zl.data
│   │       │   ├── anchors-zo.data
│   │       │   ├── anchors-zr.data
│   │       │   └── anchors-zu.data
│   │       ├── biblio/
│   │       │   ├── biblio-2d.data
│   │       │   ├── biblio-3g.data
│   │       │   ├── biblio-aa.data
│   │       │   ├── biblio-ab.data
│   │       │   ├── biblio-ac.data
│   │       │   ├── biblio-ad.data
│   │       │   ├── biblio-ae.data
│   │       │   ├── biblio-af.data
│   │       │   ├── biblio-ag.data
│   │       │   ├── biblio-al.data
│   │       │   ├── biblio-am.data
│   │       │   ├── biblio-an.data
│   │       │   ├── biblio-ao.data
│   │       │   ├── biblio-ap.data
│   │       │   ├── biblio-ar.data
│   │       │   ├── biblio-as.data
│   │       │   ├── biblio-at.data
│   │       │   ├── biblio-au.data
│   │       │   ├── biblio-av.data
│   │       │   ├── biblio-ax.data
│   │       │   ├── biblio-ba.data
│   │       │   ├── biblio-bb.data
│   │       │   ├── biblio-bc.data
│   │       │   ├── biblio-be.data
│   │       │   ├── biblio-bi.data
│   │       │   ├── biblio-bl.data
│   │       │   ├── biblio-bo.data
│   │       │   ├── biblio-br.data
│   │       │   ├── biblio-bu.data
│   │       │   ├── biblio-c1.data
│   │       │   ├── biblio-ca.data
│   │       │   ├── biblio-cb.data
│   │       │   ├── biblio-cc.data
│   │       │   ├── biblio-cd.data
│   │       │   ├── biblio-ce.data
│   │       │   ├── biblio-cg.data
│   │       │   ├── biblio-ch.data
│   │       │   ├── biblio-ci.data
│   │       │   ├── biblio-cj.data
│   │       │   ├── biblio-cl.data
│   │       │   ├── biblio-cm.data
│   │       │   ├── biblio-co.data
│   │       │   ├── biblio-cp.data
│   │       │   ├── biblio-cr.data
│   │       │   ├── biblio-cs.data
│   │       │   ├── biblio-ct.data
│   │       │   ├── biblio-cu.data
│   │       │   ├── biblio-cv.data
│   │       │   ├── biblio-cw.data
│   │       │   ├── biblio-cx.data
│   │       │   ├── biblio-cy.data
│   │       │   ├── biblio-d0.data
│   │       │   ├── biblio-d1.data
│   │       │   ├── biblio-d2.data
│   │       │   ├── biblio-d4.data
│   │       │   ├── biblio-da.data
│   │       │   ├── biblio-dc.data
│   │       │   ├── biblio-dd.data
│   │       │   ├── biblio-de.data
│   │       │   ├── biblio-df.data
│   │       │   ├── biblio-di.data
│   │       │   ├── biblio-dm.data
│   │       │   ├── biblio-dn.data
│   │       │   ├── biblio-do.data
│   │       │   ├── biblio-dp.data
│   │       │   ├── biblio-dr.data
│   │       │   ├── biblio-ds.data
│   │       │   ├── biblio-dt.data
│   │       │   ├── biblio-dv.data
│   │       │   ├── biblio-dw.data
│   │       │   ├── biblio-dx.data
│   │       │   ├── biblio-e..data
│   │       │   ├── biblio-ea.data
│   │       │   ├── biblio-eb.data
│   │       │   ├── biblio-ec.data
│   │       │   ├── biblio-ed.data
│   │       │   ├── biblio-eg.data
│   │       │   ├── biblio-el.data
│   │       │   ├── biblio-em.data
│   │       │   ├── biblio-en.data
│   │       │   ├── biblio-eo.data
│   │       │   ├── biblio-ep.data
│   │       │   ├── biblio-er.data
│   │       │   ├── biblio-es.data
│   │       │   ├── biblio-et.data
│   │       │   ├── biblio-eu.data
│   │       │   ├── biblio-ev.data
│   │       │   ├── biblio-ew.data
│   │       │   ├── biblio-ex.data
│   │       │   ├── biblio-ey.data
│   │       │   ├── biblio-fe.data
│   │       │   ├── biblio-fi.data
│   │       │   ├── biblio-fl.data
│   │       │   ├── biblio-fo.data
│   │       │   ├── biblio-fr.data
│   │       │   ├── biblio-fs.data
│   │       │   ├── biblio-fu.data
│   │       │   ├── biblio-ga.data
│   │       │   ├── biblio-gd.data
│   │       │   ├── biblio-ge.data
│   │       │   ├── biblio-gi.data
│   │       │   ├── biblio-gl.data
│   │       │   ├── biblio-gm.data
│   │       │   ├── biblio-go.data
│   │       │   ├── biblio-gp.data
│   │       │   ├── biblio-gr.data
│   │       │   ├── biblio-gs.data
│   │       │   ├── biblio-gt.data
│   │       │   ├── biblio-gu.data
│   │       │   ├── biblio-gy.data
│   │       │   ├── biblio-h-.data
│   │       │   ├── biblio-ha.data
│   │       │   ├── biblio-hb.data
│   │       │   ├── biblio-hc.data
│   │       │   ├── biblio-he.data
│   │       │   ├── biblio-hg.data
│   │       │   ├── biblio-hi.data
│   │       │   ├── biblio-hl.data
│   │       │   ├── biblio-hm.data
│   │       │   ├── biblio-hn.data
│   │       │   ├── biblio-hr.data
│   │       │   ├── biblio-hs.data
│   │       │   ├── biblio-ht.data
│   │       │   ├── biblio-hu.data
│   │       │   ├── biblio-i1.data
│   │       │   ├── biblio-ia.data
│   │       │   ├── biblio-ic.data
│   │       │   ├── biblio-id.data
│   │       │   ├── biblio-ie.data
│   │       │   ├── biblio-if.data
│   │       │   ├── biblio-il.data
│   │       │   ├── biblio-im.data
│   │       │   ├── biblio-in.data
│   │       │   ├── biblio-ip.data
│   │       │   ├── biblio-ir.data
│   │       │   ├── biblio-is.data
│   │       │   ├── biblio-it.data
│   │       │   ├── biblio-ja.data
│   │       │   ├── biblio-je.data
│   │       │   ├── biblio-jf.data
│   │       │   ├── biblio-ji.data
│   │       │   ├── biblio-jl.data
│   │       │   ├── biblio-jp.data
│   │       │   ├── biblio-js.data
│   │       │   ├── biblio-ju.data
│   │       │   ├── biblio-jw.data
│   │       │   ├── biblio-ke.data
│   │       │   ├── biblio-kh.data
│   │       │   ├── biblio-kl.data
│   │       │   ├── biblio-kn.data
│   │       │   ├── biblio-ko.data
│   │       │   ├── biblio-ku.data
│   │       │   ├── biblio-kv.data
│   │       │   ├── biblio-la.data
│   │       │   ├── biblio-lb.data
│   │       │   ├── biblio-ld.data
│   │       │   ├── biblio-le.data
│   │       │   ├── biblio-li.data
│   │       │   ├── biblio-ll.data
│   │       │   ├── biblio-lo.data
│   │       │   ├── biblio-lp.data
│   │       │   ├── biblio-lt.data
│   │       │   ├── biblio-lw.data
│   │       │   ├── biblio-ma.data
│   │       │   ├── biblio-mb.data
│   │       │   ├── biblio-mc.data
│   │       │   ├── biblio-md.data
│   │       │   ├── biblio-me.data
│   │       │   ├── biblio-mf.data
│   │       │   ├── biblio-mi.data
│   │       │   ├── biblio-ml.data
│   │       │   ├── biblio-mm.data
│   │       │   ├── biblio-mn.data
│   │       │   ├── biblio-mo.data
│   │       │   ├── biblio-mp.data
│   │       │   ├── biblio-mq.data
│   │       │   ├── biblio-mr.data
│   │       │   ├── biblio-ms.data
│   │       │   ├── biblio-mu.data
│   │       │   ├── biblio-mw.data
│   │       │   ├── biblio-n-.data
│   │       │   ├── biblio-n1.data
│   │       │   ├── biblio-n2.data
│   │       │   ├── biblio-n3.data
│   │       │   ├── biblio-n4.data
│   │       │   ├── biblio-na.data
│   │       │   ├── biblio-nd.data
│   │       │   ├── biblio-ne.data
│   │       │   ├── biblio-nf.data
│   │       │   ├── biblio-ng.data
│   │       │   ├── biblio-nk.data
│   │       │   ├── biblio-nl.data
│   │       │   ├── biblio-no.data
│   │       │   ├── biblio-np.data
│   │       │   ├── biblio-ns.data
│   │       │   ├── biblio-nt.data
│   │       │   ├── biblio-nv.data
│   │       │   ├── biblio-oa.data
│   │       │   ├── biblio-ob.data
│   │       │   ├── biblio-oc.data
│   │       │   ├── biblio-od.data
│   │       │   ├── biblio-oe.data
│   │       │   ├── biblio-of.data
│   │       │   ├── biblio-og.data
│   │       │   ├── biblio-oi.data
│   │       │   ├── biblio-om.data
│   │       │   ├── biblio-op.data
│   │       │   ├── biblio-or.data
│   │       │   ├── biblio-os.data
│   │       │   ├── biblio-ov.data
│   │       │   ├── biblio-ow.data
│   │       │   ├── biblio-p0.data
│   │       │   ├── biblio-p1.data
│   │       │   ├── biblio-p2.data
│   │       │   ├── biblio-p3.data
│   │       │   ├── biblio-p4.data
│   │       │   ├── biblio-pa.data
│   │       │   ├── biblio-pc.data
│   │       │   ├── biblio-pd.data
│   │       │   ├── biblio-pe.data
│   │       │   ├── biblio-pf.data
│   │       │   ├── biblio-pg.data
│   │       │   ├── biblio-ph.data
│   │       │   ├── biblio-pi.data
│   │       │   ├── biblio-pk.data
│   │       │   ├── biblio-pl.data
│   │       │   ├── biblio-pn.data
│   │       │   ├── biblio-po.data
│   │       │   ├── biblio-pp.data
│   │       │   ├── biblio-pr.data
│   │       │   ├── biblio-ps.data
│   │       │   ├── biblio-pt.data
│   │       │   ├── biblio-pu.data
│   │       │   ├── biblio-pw.data
│   │       │   ├── biblio-qa.data
│   │       │   ├── biblio-qb.data
│   │       │   ├── biblio-qn.data
│   │       │   ├── biblio-qu.data
│   │       │   ├── biblio-r2.data
│   │       │   ├── biblio-ra.data
│   │       │   ├── biblio-rc.data
│   │       │   ├── biblio-rd.data
│   │       │   ├── biblio-re.data
│   │       │   ├── biblio-rf.data
│   │       │   ├── biblio-ri.data
│   │       │   ├── biblio-ro.data
│   │       │   ├── biblio-rt.data
│   │       │   ├── biblio-ru.data
│   │       │   ├── biblio-s6.data
│   │       │   ├── biblio-sa.data
│   │       │   ├── biblio-sc.data
│   │       │   ├── biblio-sd.data
│   │       │   ├── biblio-se.data
│   │       │   ├── biblio-sf.data
│   │       │   ├── biblio-sg.data
│   │       │   ├── biblio-sh.data
│   │       │   ├── biblio-si.data
│   │       │   ├── biblio-sk.data
│   │       │   ├── biblio-sm.data
│   │       │   ├── biblio-sn.data
│   │       │   ├── biblio-so.data
│   │       │   ├── biblio-sp.data
│   │       │   ├── biblio-sr.data
│   │       │   ├── biblio-ss.data
│   │       │   ├── biblio-st.data
│   │       │   ├── biblio-su.data
│   │       │   ├── biblio-sv.data
│   │       │   ├── biblio-sw.data
│   │       │   ├── biblio-sx.data
│   │       │   ├── biblio-sy.data
│   │       │   ├── biblio-ta.data
│   │       │   ├── biblio-tc.data
│   │       │   ├── biblio-te.data
│   │       │   ├── biblio-th.data
│   │       │   ├── biblio-ti.data
│   │       │   ├── biblio-tl.data
│   │       │   ├── biblio-to.data
│   │       │   ├── biblio-tp.data
│   │       │   ├── biblio-tr.data
│   │       │   ├── biblio-ts.data
│   │       │   ├── biblio-tt.data
│   │       │   ├── biblio-tu.data
│   │       │   ├── biblio-tv.data
│   │       │   ├── biblio-ty.data
│   │       │   ├── biblio-tz.data
│   │       │   ├── biblio-ua.data
│   │       │   ├── biblio-uc.data
│   │       │   ├── biblio-uf.data
│   │       │   ├── biblio-ui.data
│   │       │   ├── biblio-um.data
│   │       │   ├── biblio-un.data
│   │       │   ├── biblio-up.data
│   │       │   ├── biblio-ur.data
│   │       │   ├── biblio-us.data
│   │       │   ├── biblio-ut.data
│   │       │   ├── biblio-uw.data
│   │       │   ├── biblio-va.data
│   │       │   ├── biblio-vb.data
│   │       │   ├── biblio-vc.data
│   │       │   ├── biblio-ve.data
│   │       │   ├── biblio-vi.data
│   │       │   ├── biblio-vm.data
│   │       │   ├── biblio-vo.data
│   │       │   ├── biblio-vs.data
│   │       │   ├── biblio-vt.data
│   │       │   ├── biblio-vx.data
│   │       │   ├── biblio-w3.data
│   │       │   ├── biblio-wa.data
│   │       │   ├── biblio-wb.data
│   │       │   ├── biblio-wc.data
│   │       │   ├── biblio-wd.data
│   │       │   ├── biblio-we.data
│   │       │   ├── biblio-wf.data
│   │       │   ├── biblio-wg.data
│   │       │   ├── biblio-wh.data
│   │       │   ├── biblio-wi.data
│   │       │   ├── biblio-wm.data
│   │       │   ├── biblio-wo.data
│   │       │   ├── biblio-wp.data
│   │       │   ├── biblio-ws.data
│   │       │   ├── biblio-ww.data
│   │       │   ├── biblio-x1.data
│   │       │   ├── biblio-x5.data
│   │       │   ├── biblio-x6.data
│   │       │   ├── biblio-xa.data
│   │       │   ├── biblio-xb.data
│   │       │   ├── biblio-xd.data
│   │       │   ├── biblio-xe.data
│   │       │   ├── biblio-xf.data
│   │       │   ├── biblio-xh.data
│   │       │   ├── biblio-xi.data
│   │       │   ├── biblio-xk.data
│   │       │   ├── biblio-xl.data
│   │       │   ├── biblio-xm.data
│   │       │   ├── biblio-xo.data
│   │       │   ├── biblio-xp.data
│   │       │   ├── biblio-xq.data
│   │       │   ├── biblio-xs.data
│   │       │   ├── biblio-xt.data
│   │       │   ├── biblio-xu.data
│   │       │   ├── biblio-ya.data
│   │       │   ├── biblio-ze.data
│   │       │   ├── biblio-zh.data
│   │       │   └── biblio-zi.data
│   │       ├── biblio-keys.json
│   │       ├── biblio-numeric-suffixes.json
│   │       ├── bikeshed-version.txt
│   │       ├── boilerplate/
│   │       │   ├── ab/
│   │       │   │   ├── footer.include
│   │       │   │   └── status.include
│   │       │   ├── abstract.include
│   │       │   ├── act-rules-format/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── aom/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults-FD.include
│   │       │   │   ├── defaults-PD.include
│   │       │   │   ├── defaults-WGA.include
│   │       │   │   ├── defaults-WGD.include
│   │       │   │   ├── header-FD.include
│   │       │   │   └── logo.include
│   │       │   ├── audiowg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── browser-testing-tools/
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── bs-extensions.include
│   │       │   ├── byos/
│   │       │   │   ├── abstract.include
│   │       │   │   └── defaults.include
│   │       │   ├── computed-metadata.include
│   │       │   ├── copyright.include
│   │       │   ├── cssnext/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── csswg/
│   │       │   │   ├── abstract.include
│   │       │   │   ├── computed-metadata.include
│   │       │   │   ├── copyright-DREAM.include
│   │       │   │   ├── defaults-ED.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── status.include
│   │       │   │   ├── warning-not-ready.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── dap/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-NOTE.include
│   │       │   │   └── status-WD.include
│   │       │   ├── defaults.include
│   │       │   ├── doctypes.kdl
│   │       │   ├── fedid/
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-FPWD.include
│   │       │   ├── fedidcg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── footer.include
│   │       │   ├── fxtf/
│   │       │   │   ├── bs-extensions.include
│   │       │   │   ├── defaults-ED.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-CR.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── geolocation/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-ED.include
│   │       │   ├── gpuwg/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── header.include
│   │       │   ├── houdini/
│   │       │   │   ├── bs-extensions.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   └── status.include
│   │       │   ├── html/
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   ├── status-PR.include
│   │       │   │   └── status-WD.include
│   │       │   ├── htmlwg/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── httpslocal/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-CG-FINAL.include
│   │       │   ├── i18n/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-WD.include
│   │       │   │   ├── warning-not-ready.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── immersivewebwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── logo.include
│   │       │   ├── mediacapture/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── mediawg/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── patcg-id/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── ping/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-ED.include
│   │       │   ├── privacycg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── processcg/
│   │       │   │   └── status.include
│   │       │   ├── ricg/
│   │       │   │   ├── logo.include
│   │       │   │   ├── status-WD.include
│   │       │   │   └── status.include
│   │       │   ├── sacg/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── secondscreencg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── secondscreenwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── serviceworkers/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── solidcg/
│   │       │   │   ├── copyright-CG-DRAFT.include
│   │       │   │   ├── copyright-CG-FINAL.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-CG-FINAL.include
│   │       │   ├── status.include
│   │       │   ├── stylesheet.include
│   │       │   ├── svg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── tag/
│   │       │   │   ├── header-WG-NOTE.include
│   │       │   │   ├── status-DRAFT-FINDING.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FINDING.include
│   │       │   │   ├── status-NOTE.include
│   │       │   │   ├── status-UD.include
│   │       │   │   ├── status-WG-NOTE.include
│   │       │   │   └── status.include
│   │       │   ├── tc39/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── test/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults-DREAM.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-DREAM.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header-DREAM.include
│   │       │   │   ├── header.include
│   │       │   │   └── logo.include
│   │       │   ├── texttracks/
│   │       │   │   ├── copyright-CG-DRAFT.include
│   │       │   │   ├── defaults-CG-DRAFT.include
│   │       │   │   ├── header-CG-DRAFT.include
│   │       │   │   ├── header.include
│   │       │   │   ├── status-CG-DRAFT.include
│   │       │   │   └── status-WD.include
│   │       │   ├── uievents/
│   │       │   │   └── status-WD.include
│   │       │   ├── w3c/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-NOTE.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header.include
│   │       │   │   └── logo.include
│   │       │   ├── w3t/
│   │       │   │   └── header.include
│   │       │   ├── warning-branch.include
│   │       │   ├── warning-commit.include
│   │       │   ├── warning-custom.include
│   │       │   ├── warning-expired.include
│   │       │   ├── warning-expires.include
│   │       │   ├── warning-new-version.include
│   │       │   ├── warning-not-ready.include
│   │       │   ├── warning-obsolete.include
│   │       │   ├── warning-replaced-by.include
│   │       │   ├── wasm/
│   │       │   │   ├── abstract.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── web-bluetooth-cg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── web-payments/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status-FPWD.include
│   │       │   ├── webapps/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webappsec/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   ├── status-LCWD.include
│   │       │   │   ├── status-PR.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webauthn/
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webediting/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── webfontswg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header-ED.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webgl/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   ├── webgpu/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── webml/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── logo.include
│   │       │   │   └── status.include
│   │       │   ├── webmlwg/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-CRD.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webperf/
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── webrtc/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webspecs/
│   │       │   │   ├── defaults.include
│   │       │   │   └── header.include
│   │       │   ├── webtransport/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── status-CR.include
│   │       │   │   ├── status-ED.include
│   │       │   │   ├── status-FPWD.include
│   │       │   │   └── status-WD.include
│   │       │   ├── webvr/
│   │       │   │   ├── copyright.include
│   │       │   │   └── status.include
│   │       │   ├── wecg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   └── status.include
│   │       │   ├── wg14/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── wg21/
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer.include
│   │       │   │   └── header.include
│   │       │   ├── whatwg/
│   │       │   │   ├── computed-metadata-LS-COMMIT.include
│   │       │   │   ├── computed-metadata-LS-PR.include
│   │       │   │   ├── computed-metadata-RD.include
│   │       │   │   ├── computed-metadata.include
│   │       │   │   ├── defaults-RD.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── footer-RD.include
│   │       │   │   ├── footer.include
│   │       │   │   ├── header-RD.include
│   │       │   │   ├── header.include
│   │       │   │   ├── warning-custom.include
│   │       │   │   └── warning-obsolete.include
│   │       │   ├── wicg/
│   │       │   │   ├── copyright.include
│   │       │   │   ├── defaults.include
│   │       │   │   ├── header.include
│   │       │   │   └── status.include
│   │       │   └── wintercg/
│   │       │       ├── copyright.include
│   │       │       └── status.include
│   │       ├── caniuse/
│   │       │   ├── data.json
│   │       │   ├── feature-aac.json
│   │       │   ├── feature-abortcontroller.json
│   │       │   ├── feature-accelerometer.json
│   │       │   ├── feature-addeventlistener.json
│   │       │   ├── feature-ambient-light.json
│   │       │   ├── feature-apng.json
│   │       │   ├── feature-array-find-index.json
│   │       │   ├── feature-array-find.json
│   │       │   ├── feature-array-flat.json
│   │       │   ├── feature-array-includes.json
│   │       │   ├── feature-arrow-functions.json
│   │       │   ├── feature-asmjs.json
│   │       │   ├── feature-async-clipboard.json
│   │       │   ├── feature-async-functions.json
│   │       │   ├── feature-atob-btoa.json
│   │       │   ├── feature-audio-api.json
│   │       │   ├── feature-audio.json
│   │       │   ├── feature-audiotracks.json
│   │       │   ├── feature-autofocus.json
│   │       │   ├── feature-auxclick.json
│   │       │   ├── feature-av1.json
│   │       │   ├── feature-avif.json
│   │       │   ├── feature-background-attachment.json
│   │       │   ├── feature-background-clip-text.json
│   │       │   ├── feature-background-img-opts.json
│   │       │   ├── feature-background-position-x-y.json
│   │       │   ├── feature-background-repeat-round-space.json
│   │       │   ├── feature-background-sync.json
│   │       │   ├── feature-battery-status.json
│   │       │   ├── feature-beacon.json
│   │       │   ├── feature-beforeafterprint.json
│   │       │   ├── feature-bigint.json
│   │       │   ├── feature-blobbuilder.json
│   │       │   ├── feature-bloburls.json
│   │       │   ├── feature-border-image.json
│   │       │   ├── feature-border-radius.json
│   │       │   ├── feature-broadcastchannel.json
│   │       │   ├── feature-brotli.json
│   │       │   ├── feature-calc.json
│   │       │   ├── feature-canvas-blending.json
│   │       │   ├── feature-canvas-text.json
│   │       │   ├── feature-canvas.json
│   │       │   ├── feature-ch-unit.json
│   │       │   ├── feature-chacha20-poly1305.json
│   │       │   ├── feature-channel-messaging.json
│   │       │   ├── feature-childnode-remove.json
│   │       │   ├── feature-classlist.json
│   │       │   ├── feature-client-hints-dpr-width-viewport.json
│   │       │   ├── feature-clipboard.json
│   │       │   ├── feature-colr-v1.json
│   │       │   ├── feature-colr.json
│   │       │   ├── feature-comparedocumentposition.json
│   │       │   ├── feature-console-basic.json
│   │       │   ├── feature-console-time.json
│   │       │   ├── feature-const.json
│   │       │   ├── feature-constraint-validation.json
│   │       │   ├── feature-contenteditable.json
│   │       │   ├── feature-contentsecuritypolicy.json
│   │       │   ├── feature-contentsecuritypolicy2.json
│   │       │   ├── feature-cookie-store-api.json
│   │       │   ├── feature-cors.json
│   │       │   ├── feature-createimagebitmap.json
│   │       │   ├── feature-credential-management.json
│   │       │   ├── feature-cryptography.json
│   │       │   ├── feature-css-all.json
│   │       │   ├── feature-css-anchor-positioning.json
│   │       │   ├── feature-css-animation.json
│   │       │   ├── feature-css-any-link.json
│   │       │   ├── feature-css-appearance.json
│   │       │   ├── feature-css-at-counter-style.json
│   │       │   ├── feature-css-backdrop-filter.json
│   │       │   ├── feature-css-background-offsets.json
│   │       │   ├── feature-css-backgroundblendmode.json
│   │       │   ├── feature-css-boxdecorationbreak.json
│   │       │   ├── feature-css-boxshadow.json
│   │       │   ├── feature-css-canvas.json
│   │       │   ├── feature-css-caret-color.json
│   │       │   ├── feature-css-cascade-layers.json
│   │       │   ├── feature-css-cascade-scope.json
│   │       │   ├── feature-css-case-insensitive.json
│   │       │   ├── feature-css-clip-path.json
│   │       │   ├── feature-css-color-adjust.json
│   │       │   ├── feature-css-color-function.json
│   │       │   ├── feature-css-conic-gradients.json
│   │       │   ├── feature-css-container-queries-style.json
│   │       │   ├── feature-css-container-queries.json
│   │       │   ├── feature-css-container-query-units.json
│   │       │   ├── feature-css-containment.json
│   │       │   ├── feature-css-content-visibility.json
│   │       │   ├── feature-css-counters.json
│   │       │   ├── feature-css-crisp-edges.json
│   │       │   ├── feature-css-cross-fade.json
│   │       │   ├── feature-css-default-pseudo.json
│   │       │   ├── feature-css-descendant-gtgt.json
│   │       │   ├── feature-css-deviceadaptation.json
│   │       │   ├── feature-css-dir-pseudo.json
│   │       │   ├── feature-css-display-contents.json
│   │       │   ├── feature-css-element-function.json
│   │       │   ├── feature-css-env-function.json
│   │       │   ├── feature-css-exclusions.json
│   │       │   ├── feature-css-featurequeries.json
│   │       │   ├── feature-css-filter-function.json
│   │       │   ├── feature-css-filters.json
│   │       │   ├── feature-css-first-letter.json
│   │       │   ├── feature-css-first-line.json
│   │       │   ├── feature-css-fixed.json
│   │       │   ├── feature-css-focus-visible.json
│   │       │   ├── feature-css-focus-within.json
│   │       │   ├── feature-css-font-palette.json
│   │       │   ├── feature-css-font-rendering-controls.json
│   │       │   ├── feature-css-font-stretch.json
│   │       │   ├── feature-css-gencontent.json
│   │       │   ├── feature-css-gradients.json
│   │       │   ├── feature-css-grid.json
│   │       │   ├── feature-css-hanging-punctuation.json
│   │       │   ├── feature-css-has.json
│   │       │   ├── feature-css-hyphens.json
│   │       │   ├── feature-css-image-orientation.json
│   │       │   ├── feature-css-image-set.json
│   │       │   ├── feature-css-in-out-of-range.json
│   │       │   ├── feature-css-indeterminate-pseudo.json
│   │       │   ├── feature-css-initial-letter.json
│   │       │   ├── feature-css-initial-value.json
│   │       │   ├── feature-css-lch-lab.json
│   │       │   ├── feature-css-letter-spacing.json
│   │       │   ├── feature-css-line-clamp.json
│   │       │   ├── feature-css-logical-props.json
│   │       │   ├── feature-css-marker-pseudo.json
│   │       │   ├── feature-css-masks.json
│   │       │   ├── feature-css-matches-pseudo.json
│   │       │   ├── feature-css-math-functions.json
│   │       │   ├── feature-css-media-interaction.json
│   │       │   ├── feature-css-media-range-syntax.json
│   │       │   ├── feature-css-media-resolution.json
│   │       │   ├── feature-css-mediaqueries.json
│   │       │   ├── feature-css-mixblendmode.json
│   │       │   ├── feature-css-motion-paths.json
│   │       │   ├── feature-css-namespaces.json
│   │       │   ├── feature-css-nesting.json
│   │       │   ├── feature-css-not-sel-list.json
│   │       │   ├── feature-css-nth-child-of.json
│   │       │   ├── feature-css-opacity.json
│   │       │   ├── feature-css-optional-pseudo.json
│   │       │   ├── feature-css-overflow-anchor.json
│   │       │   ├── feature-css-overflow-overlay.json
│   │       │   ├── feature-css-overflow.json
│   │       │   ├── feature-css-overscroll-behavior.json
│   │       │   ├── feature-css-page-break.json
│   │       │   ├── feature-css-paged-media.json
│   │       │   ├── feature-css-paint-api.json
│   │       │   ├── feature-css-placeholder-shown.json
│   │       │   ├── feature-css-placeholder.json
│   │       │   ├── feature-css-read-only-write.json
│   │       │   ├── feature-css-rebeccapurple.json
│   │       │   ├── feature-css-reflections.json
│   │       │   ├── feature-css-regions.json
│   │       │   ├── feature-css-relative-colors.json
│   │       │   ├── feature-css-repeating-gradients.json
│   │       │   ├── feature-css-resize.json
│   │       │   ├── feature-css-revert-value.json
│   │       │   ├── feature-css-rrggbbaa.json
│   │       │   ├── feature-css-scroll-behavior.json
│   │       │   ├── feature-css-scrollbar.json
│   │       │   ├── feature-css-sel2.json
│   │       │   ├── feature-css-sel3.json
│   │       │   ├── feature-css-selection.json
│   │       │   ├── feature-css-shapes.json
│   │       │   ├── feature-css-snappoints.json
│   │       │   ├── feature-css-sticky.json
│   │       │   ├── feature-css-subgrid.json
│   │       │   ├── feature-css-supports-api.json
│   │       │   ├── feature-css-table.json
│   │       │   ├── feature-css-text-align-last.json
│   │       │   ├── feature-css-text-box-trim.json
│   │       │   ├── feature-css-text-indent.json
│   │       │   ├── feature-css-text-justify.json
│   │       │   ├── feature-css-text-orientation.json
│   │       │   ├── feature-css-text-wrap-balance.json
│   │       │   ├── feature-css-textshadow.json
│   │       │   ├── feature-css-touch-action.json
│   │       │   ├── feature-css-transitions.json
│   │       │   ├── feature-css-unset-value.json
│   │       │   ├── feature-css-variables.json
│   │       │   ├── feature-css-when-else.json
│   │       │   ├── feature-css-widows-orphans.json
│   │       │   ├── feature-css-writing-mode.json
│   │       │   ├── feature-css-zoom.json
│   │       │   ├── feature-css3-attr.json
│   │       │   ├── feature-css3-boxsizing.json
│   │       │   ├── feature-css3-colors.json
│   │       │   ├── feature-css3-cursors-grab.json
│   │       │   ├── feature-css3-cursors-newer.json
│   │       │   ├── feature-css3-cursors.json
│   │       │   ├── feature-css3-tabsize.json
│   │       │   ├── feature-currentcolor.json
│   │       │   ├── feature-custom-elements.json
│   │       │   ├── feature-custom-elementsv1.json
│   │       │   ├── feature-customevent.json
│   │       │   ├── feature-datalist.json
│   │       │   ├── feature-dataset.json
│   │       │   ├── feature-datauri.json
│   │       │   ├── feature-date-tolocaledatestring.json
│   │       │   ├── feature-declarative-shadow-dom.json
│   │       │   ├── feature-decorators.json
│   │       │   ├── feature-details.json
│   │       │   ├── feature-deviceorientation.json
│   │       │   ├── feature-devicepixelratio.json
│   │       │   ├── feature-dialog.json
│   │       │   ├── feature-dispatchevent.json
│   │       │   ├── feature-dnssec.json
│   │       │   ├── feature-do-not-track.json
│   │       │   ├── feature-document-currentscript.json
│   │       │   ├── feature-document-evaluate-xpath.json
│   │       │   ├── feature-document-execcommand.json
│   │       │   ├── feature-document-policy.json
│   │       │   ├── feature-document-scrollingelement.json
│   │       │   ├── feature-documenthead.json
│   │       │   ├── feature-dom-manip-convenience.json
│   │       │   ├── feature-dom-range.json
│   │       │   ├── feature-domcontentloaded.json
│   │       │   ├── feature-dommatrix.json
│   │       │   ├── feature-download.json
│   │       │   ├── feature-dragndrop.json
│   │       │   ├── feature-element-closest.json
│   │       │   ├── feature-element-from-point.json
│   │       │   ├── feature-element-scroll-methods.json
│   │       │   ├── feature-eme.json
│   │       │   ├── feature-eot.json
│   │       │   ├── feature-es5.json
│   │       │   ├── feature-es6-class.json
│   │       │   ├── feature-es6-generators.json
│   │       │   ├── feature-es6-module-dynamic-import.json
│   │       │   ├── feature-es6-module.json
│   │       │   ├── feature-es6-number.json
│   │       │   ├── feature-es6-string-includes.json
│   │       │   ├── feature-es6.json
│   │       │   ├── feature-eventsource.json
│   │       │   ├── feature-extended-system-fonts.json
│   │       │   ├── feature-feature-policy.json
│   │       │   ├── feature-fetch.json
│   │       │   ├── feature-fieldset-disabled.json
│   │       │   ├── feature-fileapi.json
│   │       │   ├── feature-filereader.json
│   │       │   ├── feature-filereadersync.json
│   │       │   ├── feature-filesystem.json
│   │       │   ├── feature-flac.json
│   │       │   ├── feature-flexbox-gap.json
│   │       │   ├── feature-flexbox.json
│   │       │   ├── feature-flow-root.json
│   │       │   ├── feature-focusin-focusout-events.json
│   │       │   ├── feature-font-family-system-ui.json
│   │       │   ├── feature-font-feature.json
│   │       │   ├── feature-font-kerning.json
│   │       │   ├── feature-font-loading.json
│   │       │   ├── feature-font-size-adjust.json
│   │       │   ├── feature-font-smooth.json
│   │       │   ├── feature-font-unicode-range.json
│   │       │   ├── feature-font-variant-alternates.json
│   │       │   ├── feature-font-variant-numeric.json
│   │       │   ├── feature-fontface.json
│   │       │   ├── feature-form-attribute.json
│   │       │   ├── feature-form-submit-attributes.json
│   │       │   ├── feature-form-validation.json
│   │       │   ├── feature-fullscreen.json
│   │       │   ├── feature-gamepad.json
│   │       │   ├── feature-geolocation.json
│   │       │   ├── feature-getboundingclientrect.json
│   │       │   ├── feature-getcomputedstyle.json
│   │       │   ├── feature-getelementsbyclassname.json
│   │       │   ├── feature-getrandomvalues.json
│   │       │   ├── feature-gyroscope.json
│   │       │   ├── feature-hardwareconcurrency.json
│   │       │   ├── feature-hashchange.json
│   │       │   ├── feature-heif.json
│   │       │   ├── feature-hevc.json
│   │       │   ├── feature-hidden.json
│   │       │   ├── feature-high-resolution-time.json
│   │       │   ├── feature-history.json
│   │       │   ├── feature-html-media-capture.json
│   │       │   ├── feature-html5semantic.json
│   │       │   ├── feature-http-live-streaming.json
│   │       │   ├── feature-http2.json
│   │       │   ├── feature-http3.json
│   │       │   ├── feature-iframe-sandbox.json
│   │       │   ├── feature-iframe-seamless.json
│   │       │   ├── feature-iframe-srcdoc.json
│   │       │   ├── feature-imagecapture.json
│   │       │   ├── feature-ime.json
│   │       │   ├── feature-img-naturalwidth-naturalheight.json
│   │       │   ├── feature-import-maps.json
│   │       │   ├── feature-imports.json
│   │       │   ├── feature-indeterminate-checkbox.json
│   │       │   ├── feature-indexeddb.json
│   │       │   ├── feature-indexeddb2.json
│   │       │   ├── feature-inline-block.json
│   │       │   ├── feature-innertext.json
│   │       │   ├── feature-input-autocomplete-onoff.json
│   │       │   ├── feature-input-color.json
│   │       │   ├── feature-input-datetime.json
│   │       │   ├── feature-input-email-tel-url.json
│   │       │   ├── feature-input-event.json
│   │       │   ├── feature-input-file-accept.json
│   │       │   ├── feature-input-file-directory.json
│   │       │   ├── feature-input-file-multiple.json
│   │       │   ├── feature-input-inputmode.json
│   │       │   ├── feature-input-minlength.json
│   │       │   ├── feature-input-number.json
│   │       │   ├── feature-input-pattern.json
│   │       │   ├── feature-input-placeholder.json
│   │       │   ├── feature-input-range.json
│   │       │   ├── feature-input-search.json
│   │       │   ├── feature-input-selection.json
│   │       │   ├── feature-insert-adjacent.json
│   │       │   ├── feature-insertadjacenthtml.json
│   │       │   ├── feature-internationalization.json
│   │       │   ├── feature-intersectionobserver-v2.json
│   │       │   ├── feature-intersectionobserver.json
│   │       │   ├── feature-intl-pluralrules.json
│   │       │   ├── feature-intrinsic-width.json
│   │       │   ├── feature-jpeg2000.json
│   │       │   ├── feature-jpegxl.json
│   │       │   ├── feature-jpegxr.json
│   │       │   ├── feature-js-regexp-lookbehind.json
│   │       │   ├── feature-json.json
│   │       │   ├── feature-justify-content-space-evenly.json
│   │       │   ├── feature-kerning-pairs-ligatures.json
│   │       │   ├── feature-keyboardevent-charcode.json
│   │       │   ├── feature-keyboardevent-code.json
│   │       │   ├── feature-keyboardevent-getmodifierstate.json
│   │       │   ├── feature-keyboardevent-key.json
│   │       │   ├── feature-keyboardevent-location.json
│   │       │   ├── feature-keyboardevent-which.json
│   │       │   ├── feature-lazyload.json
│   │       │   ├── feature-let.json
│   │       │   ├── feature-link-icon-png.json
│   │       │   ├── feature-link-icon-svg.json
│   │       │   ├── feature-link-rel-dns-prefetch.json
│   │       │   ├── feature-link-rel-modulepreload.json
│   │       │   ├── feature-link-rel-preconnect.json
│   │       │   ├── feature-link-rel-prefetch.json
│   │       │   ├── feature-link-rel-preload.json
│   │       │   ├── feature-link-rel-prerender.json
│   │       │   ├── feature-loading-lazy-attr.json
│   │       │   ├── feature-localecompare.json
│   │       │   ├── feature-magnetometer.json
│   │       │   ├── feature-matchesselector.json
│   │       │   ├── feature-matchmedia.json
│   │       │   ├── feature-mathml.json
│   │       │   ├── feature-maxlength.json
│   │       │   ├── feature-media-fragments.json
│   │       │   ├── feature-mediacapture-fromelement.json
│   │       │   ├── feature-mediarecorder.json
│   │       │   ├── feature-mediasource.json
│   │       │   ├── feature-menu.json
│   │       │   ├── feature-meta-theme-color.json
│   │       │   ├── feature-meter.json
│   │       │   ├── feature-midi.json
│   │       │   ├── feature-minmaxwh.json
│   │       │   ├── feature-mp3.json
│   │       │   ├── feature-mpeg-dash.json
│   │       │   ├── feature-mpeg4.json
│   │       │   ├── feature-multibackgrounds.json
│   │       │   ├── feature-multicolumn.json
│   │       │   ├── feature-mutation-events.json
│   │       │   ├── feature-mutationobserver.json
│   │       │   ├── feature-namevalue-storage.json
│   │       │   ├── feature-native-filesystem-api.json
│   │       │   ├── feature-nav-timing.json
│   │       │   ├── feature-netinfo.json
│   │       │   ├── feature-notifications.json
│   │       │   ├── feature-object-entries.json
│   │       │   ├── feature-object-fit.json
│   │       │   ├── feature-object-observe.json
│   │       │   ├── feature-object-values.json
│   │       │   ├── feature-objectrtc.json
│   │       │   ├── feature-offline-apps.json
│   │       │   ├── feature-offscreencanvas.json
│   │       │   ├── feature-ogg-vorbis.json
│   │       │   ├── feature-ogv.json
│   │       │   ├── feature-ol-reversed.json
│   │       │   ├── feature-once-event-listener.json
│   │       │   ├── feature-online-status.json
│   │       │   ├── feature-opus.json
│   │       │   ├── feature-orientation-sensor.json
│   │       │   ├── feature-outline.json
│   │       │   ├── feature-pad-start-end.json
│   │       │   ├── feature-page-transition-events.json
│   │       │   ├── feature-pagevisibility.json
│   │       │   ├── feature-passive-event-listener.json
│   │       │   ├── feature-passkeys.json
│   │       │   ├── feature-path2d.json
│   │       │   ├── feature-payment-request.json
│   │       │   ├── feature-pdf-viewer.json
│   │       │   ├── feature-permissions-api.json
│   │       │   ├── feature-permissions-policy.json
│   │       │   ├── feature-picture-in-picture.json
│   │       │   ├── feature-picture.json
│   │       │   ├── feature-ping.json
│   │       │   ├── feature-png-alpha.json
│   │       │   ├── feature-pointer-events.json
│   │       │   ├── feature-pointer.json
│   │       │   ├── feature-pointerlock.json
│   │       │   ├── feature-portals.json
│   │       │   ├── feature-prefers-color-scheme.json
│   │       │   ├── feature-prefers-reduced-motion.json
│   │       │   ├── feature-progress.json
│   │       │   ├── feature-promise-finally.json
│   │       │   ├── feature-promises.json
│   │       │   ├── feature-proximity.json
│   │       │   ├── feature-proxy.json
│   │       │   ├── feature-publickeypinning.json
│   │       │   ├── feature-push-api.json
│   │       │   ├── feature-queryselector.json
│   │       │   ├── feature-readonly-attr.json
│   │       │   ├── feature-referrer-policy.json
│   │       │   ├── feature-registerprotocolhandler.json
│   │       │   ├── feature-rel-noopener.json
│   │       │   ├── feature-rel-noreferrer.json
│   │       │   ├── feature-rellist.json
│   │       │   ├── feature-rem.json
│   │       │   ├── feature-requestanimationframe.json
│   │       │   ├── feature-requestidlecallback.json
│   │       │   ├── feature-resizeobserver.json
│   │       │   ├── feature-resource-timing.json
│   │       │   ├── feature-rest-parameters.json
│   │       │   ├── feature-rtcpeerconnection.json
│   │       │   ├── feature-ruby.json
│   │       │   ├── feature-run-in.json
│   │       │   ├── feature-same-site-cookie-attribute.json
│   │       │   ├── feature-screen-orientation.json
│   │       │   ├── feature-script-async.json
│   │       │   ├── feature-script-defer.json
│   │       │   ├── feature-scrollintoview.json
│   │       │   ├── feature-scrollintoviewifneeded.json
│   │       │   ├── feature-sdch.json
│   │       │   ├── feature-selection-api.json
│   │       │   ├── feature-selectlist.json
│   │       │   ├── feature-server-timing.json
│   │       │   ├── feature-serviceworkers.json
│   │       │   ├── feature-setimmediate.json
│   │       │   ├── feature-shadowdom.json
│   │       │   ├── feature-shadowdomv1.json
│   │       │   ├── feature-sharedarraybuffer.json
│   │       │   ├── feature-sharedworkers.json
│   │       │   ├── feature-sni.json
│   │       │   ├── feature-spdy.json
│   │       │   ├── feature-speech-recognition.json
│   │       │   ├── feature-speech-synthesis.json
│   │       │   ├── feature-spellcheck-attribute.json
│   │       │   ├── feature-sql-storage.json
│   │       │   ├── feature-srcset.json
│   │       │   ├── feature-stream.json
│   │       │   ├── feature-streams.json
│   │       │   ├── feature-stricttransportsecurity.json
│   │       │   ├── feature-style-scoped.json
│   │       │   ├── feature-subresource-integrity.json
│   │       │   ├── feature-svg-css.json
│   │       │   ├── feature-svg-filters.json
│   │       │   ├── feature-svg-fonts.json
│   │       │   ├── feature-svg-fragment.json
│   │       │   ├── feature-svg-html.json
│   │       │   ├── feature-svg-html5.json
│   │       │   ├── feature-svg-img.json
│   │       │   ├── feature-svg-smil.json
│   │       │   ├── feature-svg.json
│   │       │   ├── feature-sxg.json
│   │       │   ├── feature-tabindex-attr.json
│   │       │   ├── feature-template-literals.json
│   │       │   ├── feature-template.json
│   │       │   ├── feature-temporal.json
│   │       │   ├── feature-text-decoration.json
│   │       │   ├── feature-text-emphasis.json
│   │       │   ├── feature-text-overflow.json
│   │       │   ├── feature-text-size-adjust.json
│   │       │   ├── feature-text-stroke.json
│   │       │   ├── feature-textcontent.json
│   │       │   ├── feature-textencoder.json
│   │       │   ├── feature-tls1-1.json
│   │       │   ├── feature-tls1-2.json
│   │       │   ├── feature-tls1-3.json
│   │       │   ├── feature-touch.json
│   │       │   ├── feature-transforms2d.json
│   │       │   ├── feature-transforms3d.json
│   │       │   ├── feature-trusted-types.json
│   │       │   ├── feature-ttf.json
│   │       │   ├── feature-typedarrays.json
│   │       │   ├── feature-u2f.json
│   │       │   ├── feature-unhandledrejection.json
│   │       │   ├── feature-upgradeinsecurerequests.json
│   │       │   ├── feature-url-scroll-to-text-fragment.json
│   │       │   ├── feature-url.json
│   │       │   ├── feature-urlsearchparams.json
│   │       │   ├── feature-use-strict.json
│   │       │   ├── feature-user-select-none.json
│   │       │   ├── feature-user-timing.json
│   │       │   ├── feature-variable-fonts.json
│   │       │   ├── feature-vector-effect.json
│   │       │   ├── feature-vibration.json
│   │       │   ├── feature-video.json
│   │       │   ├── feature-videotracks.json
│   │       │   ├── feature-view-transitions.json
│   │       │   ├── feature-viewport-unit-variants.json
│   │       │   ├── feature-viewport-units.json
│   │       │   ├── feature-wai-aria.json
│   │       │   ├── feature-wake-lock.json
│   │       │   ├── feature-wasm-bigint.json
│   │       │   ├── feature-wasm-bulk-memory.json
│   │       │   ├── feature-wasm-multi-value.json
│   │       │   ├── feature-wasm-mutable-globals.json
│   │       │   ├── feature-wasm-nontrapping-fptoint.json
│   │       │   ├── feature-wasm-reference-types.json
│   │       │   ├── feature-wasm-signext.json
│   │       │   ├── feature-wasm-simd.json
│   │       │   ├── feature-wasm-threads.json
│   │       │   ├── feature-wasm.json
│   │       │   ├── feature-wav.json
│   │       │   ├── feature-wbr-element.json
│   │       │   ├── feature-web-animation.json
│   │       │   ├── feature-web-bluetooth.json
│   │       │   ├── feature-web-serial.json
│   │       │   ├── feature-web-share.json
│   │       │   ├── feature-webauthn.json
│   │       │   ├── feature-webcodecs.json
│   │       │   ├── feature-webgl.json
│   │       │   ├── feature-webgl2.json
│   │       │   ├── feature-webgpu.json
│   │       │   ├── feature-webhid.json
│   │       │   ├── feature-webkit-user-drag.json
│   │       │   ├── feature-webm.json
│   │       │   ├── feature-webnfc.json
│   │       │   ├── feature-webp.json
│   │       │   ├── feature-websockets.json
│   │       │   ├── feature-webtransport.json
│   │       │   ├── feature-webusb.json
│   │       │   ├── feature-webvr.json
│   │       │   ├── feature-webvtt.json
│   │       │   ├── feature-webworkers.json
│   │       │   ├── feature-webxr.json
│   │       │   ├── feature-will-change.json
│   │       │   ├── feature-woff.json
│   │       │   ├── feature-woff2.json
│   │       │   ├── feature-word-break.json
│   │       │   ├── feature-wordwrap.json
│   │       │   ├── feature-x-doc-messaging.json
│   │       │   ├── feature-x-frame-options.json
│   │       │   ├── feature-xhr2.json
│   │       │   ├── feature-xhtml.json
│   │       │   ├── feature-xhtmlsmil.json
│   │       │   ├── feature-xml-serializer.json
│   │       │   └── feature-zstd.json
│   │       ├── caniuse.json
│   │       ├── fors.json
│   │       ├── github-issues.json
│   │       ├── headings/
│   │       │   ├── headings-accelerometer.json
│   │       │   ├── headings-accname-1.2.json
│   │       │   ├── headings-afgs1-spec.json
│   │       │   ├── headings-ambient-light.json
│   │       │   ├── headings-anchors.json
│   │       │   ├── headings-anonymous-iframe.json
│   │       │   ├── headings-appmanifest.json
│   │       │   ├── headings-at-driver.json
│   │       │   ├── headings-attribution-reporting-api.json
│   │       │   ├── headings-audio-output.json
│   │       │   ├── headings-audio-session.json
│   │       │   ├── headings-audiobooks.json
│   │       │   ├── headings-autoplay-detection.json
│   │       │   ├── headings-av1-avif.json
│   │       │   ├── headings-av1-hdr10plus.json
│   │       │   ├── headings-av1-isobmff.json
│   │       │   ├── headings-av1-mpeg2-ts.json
│   │       │   ├── headings-av1-rtp-spec.json
│   │       │   ├── headings-av1-spec.json
│   │       │   ├── headings-background-fetch.json
│   │       │   ├── headings-background-sync.json
│   │       │   ├── headings-badging.json
│   │       │   ├── headings-battery-status.json
│   │       │   ├── headings-beacon.json
│   │       │   ├── headings-capability-delegation.json
│   │       │   ├── headings-capture-handle-identity.json
│   │       │   ├── headings-captured-mouse-events.json
│   │       │   ├── headings-change-password-url.json
│   │       │   ├── headings-clear-site-data.json
│   │       │   ├── headings-client-hint-reliability.json
│   │       │   ├── headings-client-hints-infrastructure.json
│   │       │   ├── headings-clipboard-apis.json
│   │       │   ├── headings-compat.json
│   │       │   ├── headings-compositing-1.json
│   │       │   ├── headings-compositing-2.json
│   │       │   ├── headings-compression.json
│   │       │   ├── headings-compute-pressure.json
│   │       │   ├── headings-console.json
│   │       │   ├── headings-contact-picker.json
│   │       │   ├── headings-content-index.json
│   │       │   ├── headings-contenteditable.json
│   │       │   ├── headings-cookie-store.json
│   │       │   ├── headings-core-aam-1.2.json
│   │       │   ├── headings-crash-reporting.json
│   │       │   ├── headings-credential-management-1.json
│   │       │   ├── headings-csp-embedded-enforcement.json
│   │       │   ├── headings-csp-next.json
│   │       │   ├── headings-csp3.json
│   │       │   ├── headings-css-2022.json
│   │       │   ├── headings-css-2023.json
│   │       │   ├── headings-css-align-3.json
│   │       │   ├── headings-css-anchor-position-1.json
│   │       │   ├── headings-css-animation-worklet-1.json
│   │       │   ├── headings-css-animations-1.json
│   │       │   ├── headings-css-animations-2.json
│   │       │   ├── headings-css-backgrounds-3.json
│   │       │   ├── headings-css-backgrounds-4.json
│   │       │   ├── headings-css-borders-4.json
│   │       │   ├── headings-css-box-3.json
│   │       │   ├── headings-css-box-4.json
│   │       │   ├── headings-css-break-3.json
│   │       │   ├── headings-css-break-4.json
│   │       │   ├── headings-css-cascade-3.json
│   │       │   ├── headings-css-cascade-4.json
│   │       │   ├── headings-css-cascade-5.json
│   │       │   ├── headings-css-cascade-6.json
│   │       │   ├── headings-css-color-3.json
│   │       │   ├── headings-css-color-4.json
│   │       │   ├── headings-css-color-5.json
│   │       │   ├── headings-css-color-6.json
│   │       │   ├── headings-css-color-adjust-1.json
│   │       │   ├── headings-css-color-hdr.json
│   │       │   ├── headings-css-conditional-3.json
│   │       │   ├── headings-css-conditional-4.json
│   │       │   ├── headings-css-conditional-5.json
│   │       │   ├── headings-css-conditional-values-1.json
│   │       │   ├── headings-css-contain-1.json
│   │       │   ├── headings-css-contain-2.json
│   │       │   ├── headings-css-contain-3.json
│   │       │   ├── headings-css-content-3.json
│   │       │   ├── headings-css-counter-styles-3.json
│   │       │   ├── headings-css-display-3.json
│   │       │   ├── headings-css-display-4.json
│   │       │   ├── headings-css-easing-1.json
│   │       │   ├── headings-css-easing-2.json
│   │       │   ├── headings-css-env-1.json
│   │       │   ├── headings-css-extensions-1.json
│   │       │   ├── headings-css-flexbox-1.json
│   │       │   ├── headings-css-font-loading-3.json
│   │       │   ├── headings-css-fonts-4.json
│   │       │   ├── headings-css-fonts-5.json
│   │       │   ├── headings-css-forms-1.json
│   │       │   ├── headings-css-gcpm-3.json
│   │       │   ├── headings-css-gcpm-4.json
│   │       │   ├── headings-css-grid-1.json
│   │       │   ├── headings-css-grid-2.json
│   │       │   ├── headings-css-grid-3.json
│   │       │   ├── headings-css-highlight-api-1.json
│   │       │   ├── headings-css-images-3.json
│   │       │   ├── headings-css-images-4.json
│   │       │   ├── headings-css-images-5.json
│   │       │   ├── headings-css-inline-3.json
│   │       │   ├── headings-css-layout-api-1.json
│   │       │   ├── headings-css-line-grid-1.json
│   │       │   ├── headings-css-link-params-1.json
│   │       │   ├── headings-css-lists-3.json
│   │       │   ├── headings-css-logical-1.json
│   │       │   ├── headings-css-masking-1.json
│   │       │   ├── headings-css-mixins-1.json
│   │       │   ├── headings-css-multicol-1.json
│   │       │   ├── headings-css-multicol-2.json
│   │       │   ├── headings-css-namespaces-3.json
│   │       │   ├── headings-css-nav-1.json
│   │       │   ├── headings-css-nesting-1.json
│   │       │   ├── headings-css-overflow-3.json
│   │       │   ├── headings-css-overflow-4.json
│   │       │   ├── headings-css-overflow-5.json
│   │       │   ├── headings-css-overscroll-1.json
│   │       │   ├── headings-css-page-3.json
│   │       │   ├── headings-css-page-4.json
│   │       │   ├── headings-css-page-floats-3.json
│   │       │   ├── headings-css-paint-api-1.json
│   │       │   ├── headings-css-parser-api.json
│   │       │   ├── headings-css-position-3.json
│   │       │   ├── headings-css-position-4.json
│   │       │   ├── headings-css-properties-values-api-1.json
│   │       │   ├── headings-css-pseudo-4.json
│   │       │   ├── headings-css-regions-1.json
│   │       │   ├── headings-css-rhythm-1.json
│   │       │   ├── headings-css-round-display-1.json
│   │       │   ├── headings-css-ruby-1.json
│   │       │   ├── headings-css-scoping-1.json
│   │       │   ├── headings-css-scroll-anchoring-1.json
│   │       │   ├── headings-css-scroll-snap-1.json
│   │       │   ├── headings-css-scroll-snap-2.json
│   │       │   ├── headings-css-scrollbars-1.json
│   │       │   ├── headings-css-shadow-parts-1.json
│   │       │   ├── headings-css-shapes-1.json
│   │       │   ├── headings-css-shapes-2.json
│   │       │   ├── headings-css-size-adjust-1.json
│   │       │   ├── headings-css-sizing-3.json
│   │       │   ├── headings-css-sizing-4.json
│   │       │   ├── headings-css-speech-1.json
│   │       │   ├── headings-css-style-attr.json
│   │       │   ├── headings-css-syntax-3.json
│   │       │   ├── headings-css-tables-3.json
│   │       │   ├── headings-css-text-3.json
│   │       │   ├── headings-css-text-4.json
│   │       │   ├── headings-css-text-decor-3.json
│   │       │   ├── headings-css-text-decor-4.json
│   │       │   ├── headings-css-transforms-1.json
│   │       │   ├── headings-css-transforms-2.json
│   │       │   ├── headings-css-transitions-1.json
│   │       │   ├── headings-css-transitions-2.json
│   │       │   ├── headings-css-typed-om-1.json
│   │       │   ├── headings-css-typed-om-2.json
│   │       │   ├── headings-css-ui-3.json
│   │       │   ├── headings-css-ui-4.json
│   │       │   ├── headings-css-values-3.json
│   │       │   ├── headings-css-values-4.json
│   │       │   ├── headings-css-values-5.json
│   │       │   ├── headings-css-variables-1.json
│   │       │   ├── headings-css-variables-2.json
│   │       │   ├── headings-css-view-transitions-1.json
│   │       │   ├── headings-css-view-transitions-2.json
│   │       │   ├── headings-css-viewport-1.json
│   │       │   ├── headings-css-will-change-1.json
│   │       │   ├── headings-css-writing-modes-3.json
│   │       │   ├── headings-css-writing-modes-4.json
│   │       │   ├── headings-css2.json
│   │       │   ├── headings-css22.json
│   │       │   ├── headings-css3-exclusions.json
│   │       │   ├── headings-cssom-1.json
│   │       │   ├── headings-cssom-view-1.json
│   │       │   ├── headings-datacue.json
│   │       │   ├── headings-deprecation-reporting.json
│   │       │   ├── headings-device-attributes.json
│   │       │   ├── headings-device-memory-1.json
│   │       │   ├── headings-device-posture.json
│   │       │   ├── headings-digital-credentials.json
│   │       │   ├── headings-digital-goods.json
│   │       │   ├── headings-direct-sockets.json
│   │       │   ├── headings-document-picture-in-picture.json
│   │       │   ├── headings-document-policy.json
│   │       │   ├── headings-dom-level-2-style.json
│   │       │   ├── headings-dom-parsing.json
│   │       │   ├── headings-dom.json
│   │       │   ├── headings-dpub-aam-1.1.json
│   │       │   ├── headings-dpub-aria-1.1.json
│   │       │   ├── headings-ecma-402.json
│   │       │   ├── headings-ecmascript.json
│   │       │   ├── headings-edit-context.json
│   │       │   ├── headings-element-capture.json
│   │       │   ├── headings-element-timing.json
│   │       │   ├── headings-eme-hdcp-version-registry.json
│   │       │   ├── headings-eme-initdata-cenc.json
│   │       │   ├── headings-eme-initdata-keyids.json
│   │       │   ├── headings-eme-initdata-registry.json
│   │       │   ├── headings-eme-initdata-webm.json
│   │       │   ├── headings-eme-stream-mp4.json
│   │       │   ├── headings-eme-stream-registry.json
│   │       │   ├── headings-eme-stream-webm.json
│   │       │   ├── headings-encoding.json
│   │       │   ├── headings-encrypted-media-2.json
│   │       │   ├── headings-entries-api.json
│   │       │   ├── headings-epub-33.json
│   │       │   ├── headings-epub-rs-33.json
│   │       │   ├── headings-essl.json
│   │       │   ├── headings-event-timing.json
│   │       │   ├── headings-execcommand.json
│   │       │   ├── headings-eyedropper-api.json
│   │       │   ├── headings-fedcm-1.json
│   │       │   ├── headings-fenced-frame.json
│   │       │   ├── headings-fetch-metadata.json
│   │       │   ├── headings-fetch.json
│   │       │   ├── headings-fido-v2.1.json
│   │       │   ├── headings-file-system-access.json
│   │       │   ├── headings-fileapi.json
│   │       │   ├── headings-fill-stroke-3.json
│   │       │   ├── headings-filter-effects-1.json
│   │       │   ├── headings-filter-effects-2.json
│   │       │   ├── headings-fingerprinting-guidance.json
│   │       │   ├── headings-first-party-sets.json
│   │       │   ├── headings-font-metrics-api-1.json
│   │       │   ├── headings-fs.json
│   │       │   ├── headings-fullscreen.json
│   │       │   ├── headings-gamepad-extensions.json
│   │       │   ├── headings-gamepad.json
│   │       │   ├── headings-generic-sensor.json
│   │       │   ├── headings-geolocation-sensor.json
│   │       │   ├── headings-geolocation.json
│   │       │   ├── headings-geometry-1.json
│   │       │   ├── headings-get-installed-related-apps.json
│   │       │   ├── headings-gltf.json
│   │       │   ├── headings-gpc-spec.json
│   │       │   ├── headings-graphics-aam-1.0.json
│   │       │   ├── headings-graphics-aria-1.0.json
│   │       │   ├── headings-gyroscope.json
│   │       │   ├── headings-handwriting-recognition.json
│   │       │   ├── headings-hr-time-3.json
│   │       │   ├── headings-html-aam-1.0.json
│   │       │   ├── headings-html-aria.json
│   │       │   ├── headings-html-media-capture.json
│   │       │   ├── headings-html-ruby-extensions.json
│   │       │   ├── headings-html.json
│   │       │   ├── headings-i18n-glossary.json
│   │       │   ├── headings-idle-detection.json
│   │       │   ├── headings-ift.json
│   │       │   ├── headings-image-capture.json
│   │       │   ├── headings-image-resource.json
│   │       │   ├── headings-indexeddb-3.json
│   │       │   ├── headings-infra.json
│   │       │   ├── headings-ink-enhancement.json
│   │       │   ├── headings-input-device-capabilities.json
│   │       │   ├── headings-input-events-2.json
│   │       │   ├── headings-intersection-observer.json
│   │       │   ├── headings-intervention-reporting.json
│   │       │   ├── headings-is-input-pending.json
│   │       │   ├── headings-isolated-contexts.json
│   │       │   ├── headings-js-self-profiling.json
│   │       │   ├── headings-json-ld11-api.json
│   │       │   ├── headings-json-ld11-framing.json
│   │       │   ├── headings-json-ld11.json
│   │       │   ├── headings-keyboard-lock.json
│   │       │   ├── headings-keyboard-map.json
│   │       │   ├── headings-largest-contentful-paint.json
│   │       │   ├── headings-layout-instability.json
│   │       │   ├── headings-local-font-access.json
│   │       │   ├── headings-long-animation-frames.json
│   │       │   ├── headings-longtasks-1.json
│   │       │   ├── headings-magnetometer.json
│   │       │   ├── headings-managed-configuration.json
│   │       │   ├── headings-manifest-app-info.json
│   │       │   ├── headings-manifest-incubations.json
│   │       │   ├── headings-mathml-aam.json
│   │       │   ├── headings-mathml-core.json
│   │       │   ├── headings-mathml4.json
│   │       │   ├── headings-media-capabilities.json
│   │       │   ├── headings-media-feeds.json
│   │       │   ├── headings-media-playback-quality.json
│   │       │   ├── headings-media-source-2.json
│   │       │   ├── headings-mediacapture-automation.json
│   │       │   ├── headings-mediacapture-fromelement.json
│   │       │   ├── headings-mediacapture-handle-actions.json
│   │       │   ├── headings-mediacapture-region.json
│   │       │   ├── headings-mediacapture-streams.json
│   │       │   ├── headings-mediacapture-transform.json
│   │       │   ├── headings-mediacapture-viewport.json
│   │       │   ├── headings-mediaqueries-3.json
│   │       │   ├── headings-mediaqueries-4.json
│   │       │   ├── headings-mediaqueries-5.json
│   │       │   ├── headings-mediasession.json
│   │       │   ├── headings-mediastream-recording.json
│   │       │   ├── headings-mimesniff.json
│   │       │   ├── headings-miniapp-lifecycle.json
│   │       │   ├── headings-miniapp-manifest.json
│   │       │   ├── headings-miniapp-packaging.json
│   │       │   ├── headings-mixed-content.json
│   │       │   ├── headings-model-element.json
│   │       │   ├── headings-motion-1.json
│   │       │   ├── headings-mse-byte-stream-format-isobmff.json
│   │       │   ├── headings-mse-byte-stream-format-mp2t.json
│   │       │   ├── headings-mse-byte-stream-format-mpeg-audio.json
│   │       │   ├── headings-mse-byte-stream-format-registry.json
│   │       │   ├── headings-mse-byte-stream-format-webm.json
│   │       │   ├── headings-mst-content-hint.json
│   │       │   ├── headings-n-quads.json
│   │       │   ├── headings-nav-tracking-mitigations.json
│   │       │   ├── headings-navigation-timing-2.json
│   │       │   ├── headings-netinfo.json
│   │       │   ├── headings-network-error-logging.json
│   │       │   ├── headings-network-reporting.json
│   │       │   ├── headings-notifications.json
│   │       │   ├── headings-observable.json
│   │       │   ├── headings-openscreenprotocol.json
│   │       │   ├── headings-orientation-event.json
│   │       │   ├── headings-orientation-sensor.json
│   │       │   ├── headings-overscroll-scrollend-events.json
│   │       │   ├── headings-page-lifecycle.json
│   │       │   ├── headings-paint-timing.json
│   │       │   ├── headings-partitioned-cookies.json
│   │       │   ├── headings-passkey-endpoints.json
│   │       │   ├── headings-payment-handler.json
│   │       │   ├── headings-payment-method-id.json
│   │       │   ├── headings-payment-method-manifest.json
│   │       │   ├── headings-payment-request.json
│   │       │   ├── headings-performance-measure-memory.json
│   │       │   ├── headings-performance-timeline.json
│   │       │   ├── headings-periodic-background-sync.json
│   │       │   ├── headings-permissions-policy-1.json
│   │       │   ├── headings-permissions-registry.json
│   │       │   ├── headings-permissions-request.json
│   │       │   ├── headings-permissions-revoke.json
│   │       │   ├── headings-permissions.json
│   │       │   ├── headings-picture-in-picture.json
│   │       │   ├── headings-png-3.json
│   │       │   ├── headings-pointerevents3.json
│   │       │   ├── headings-pointerlock-2.json
│   │       │   ├── headings-portals.json
│   │       │   ├── headings-prefer-current-tab.json
│   │       │   ├── headings-prefetch.json
│   │       │   ├── headings-prerendering-revamped.json
│   │       │   ├── headings-presentation-api.json
│   │       │   ├── headings-private-aggregation-api.json
│   │       │   ├── headings-private-click-measurement.json
│   │       │   ├── headings-private-network-access.json
│   │       │   ├── headings-promises-guide.json
│   │       │   ├── headings-proximity.json
│   │       │   ├── headings-pub-manifest.json
│   │       │   ├── headings-push-api.json
│   │       │   ├── headings-quirks.json
│   │       │   ├── headings-raw-camera-access.json
│   │       │   ├── headings-rdf-canon.json
│   │       │   ├── headings-rdf12-concepts.json
│   │       │   ├── headings-rdf12-n-quads.json
│   │       │   ├── headings-rdf12-n-triples.json
│   │       │   ├── headings-rdf12-schema.json
│   │       │   ├── headings-rdf12-semantics.json
│   │       │   ├── headings-rdf12-trig.json
│   │       │   ├── headings-rdf12-turtle.json
│   │       │   ├── headings-rdf12-xml.json
│   │       │   ├── headings-real-world-meshing.json
│   │       │   ├── headings-referrer-policy.json
│   │       │   ├── headings-remote-playback.json
│   │       │   ├── headings-reporting-1.json
│   │       │   ├── headings-requestidlecallback.json
│   │       │   ├── headings-requeststorageaccessfor.json
│   │       │   ├── headings-resize-observer-1.json
│   │       │   ├── headings-resource-timing.json
│   │       │   ├── headings-responsive-image-client-hints.json
│   │       │   ├── headings-rfc6265.json
│   │       │   ├── headings-rfc6265bis.json
│   │       │   ├── headings-rfc6266.json
│   │       │   ├── headings-rfc7230.json
│   │       │   ├── headings-rfc7231.json
│   │       │   ├── headings-rfc7232.json
│   │       │   ├── headings-rfc7233.json
│   │       │   ├── headings-rfc7234.json
│   │       │   ├── headings-rfc7235.json
│   │       │   ├── headings-rfc7616.json
│   │       │   ├── headings-rfc7617.json
│   │       │   ├── headings-rfc7725.json
│   │       │   ├── headings-rfc7838.json
│   │       │   ├── headings-rfc8246.json
│   │       │   ├── headings-rfc8288.json
│   │       │   ├── headings-rfc8297.json
│   │       │   ├── headings-rfc8470.json
│   │       │   ├── headings-rfc8878.json
│   │       │   ├── headings-rfc8942.json
│   │       │   ├── headings-rfc9110.json
│   │       │   ├── headings-rfc9111.json
│   │       │   ├── headings-rfc9112.json
│   │       │   ├── headings-rfc9113.json
│   │       │   ├── headings-rfc9114.json
│   │       │   ├── headings-rfc9163.json
│   │       │   ├── headings-rfc9218.json
│   │       │   ├── headings-rfc9530.json
│   │       │   ├── headings-saa-non-cookie-storage.json
│   │       │   ├── headings-sanitizer-api.json
│   │       │   ├── headings-savedata.json
│   │       │   ├── headings-scheduling-apis.json
│   │       │   ├── headings-screen-capture.json
│   │       │   ├── headings-screen-orientation.json
│   │       │   ├── headings-screen-wake-lock.json
│   │       │   ├── headings-scroll-animations-1.json
│   │       │   ├── headings-scroll-to-text-fragment.json
│   │       │   ├── headings-secure-contexts.json
│   │       │   ├── headings-secure-payment-confirmation.json
│   │       │   ├── headings-selection-api.json
│   │       │   ├── headings-selectors-3.json
│   │       │   ├── headings-selectors-4.json
│   │       │   ├── headings-selectors-5.json
│   │       │   ├── headings-selectors-nonelement-1.json
│   │       │   ├── headings-serial.json
│   │       │   ├── headings-server-timing.json
│   │       │   ├── headings-service-workers.json
│   │       │   ├── headings-shape-detection-api.json
│   │       │   ├── headings-shared-storage.json
│   │       │   ├── headings-sms-one-time-codes.json
│   │       │   ├── headings-soft-navigations.json
│   │       │   ├── headings-sourcemap.json
│   │       │   ├── headings-sparql12-concepts.json
│   │       │   ├── headings-sparql12-entailment.json
│   │       │   ├── headings-sparql12-federated-query.json
│   │       │   ├── headings-sparql12-graph-store-protocol.json
│   │       │   ├── headings-sparql12-protocol.json
│   │       │   ├── headings-sparql12-query.json
│   │       │   ├── headings-sparql12-results-csv-tsv.json
│   │       │   ├── headings-sparql12-results-json.json
│   │       │   ├── headings-sparql12-results-xml.json
│   │       │   ├── headings-sparql12-service-description.json
│   │       │   ├── headings-sparql12-update.json
│   │       │   ├── headings-speculation-rules.json
│   │       │   ├── headings-speech-api.json
│   │       │   ├── headings-sri.json
│   │       │   ├── headings-storage-access.json
│   │       │   ├── headings-storage-buckets.json
│   │       │   ├── headings-storage.json
│   │       │   ├── headings-streams.json
│   │       │   ├── headings-svg-aam-1.0.json
│   │       │   ├── headings-svg-animations.json
│   │       │   ├── headings-svg-integration.json
│   │       │   ├── headings-svg-strokes.json
│   │       │   ├── headings-svg11.json
│   │       │   ├── headings-svg2.json
│   │       │   ├── headings-tc39-array-from-async.json
│   │       │   ├── headings-tc39-arraybuffer-base64.json
│   │       │   ├── headings-tc39-async-explicit-resource-management.json
│   │       │   ├── headings-tc39-canonical-tz.json
│   │       │   ├── headings-tc39-decorators.json
│   │       │   ├── headings-tc39-dynamic-code-brand-checks.json
│   │       │   ├── headings-tc39-explicit-resource-management.json
│   │       │   ├── headings-tc39-float16array.json
│   │       │   ├── headings-tc39-import-attributes.json
│   │       │   ├── headings-tc39-intl-duration-format.json
│   │       │   ├── headings-tc39-intl-locale-info.json
│   │       │   ├── headings-tc39-iterator-helpers.json
│   │       │   ├── headings-tc39-json-modules.json
│   │       │   ├── headings-tc39-json-parse-with-source.json
│   │       │   ├── headings-tc39-promise-try.json
│   │       │   ├── headings-tc39-regex-escaping.json
│   │       │   ├── headings-tc39-regexp-modifiers.json
│   │       │   ├── headings-tc39-set-methods.json
│   │       │   ├── headings-tc39-shadowrealm.json
│   │       │   ├── headings-tc39-source-phase-imports.json
│   │       │   ├── headings-tc39-temporal.json
│   │       │   ├── headings-test-methodology.json
│   │       │   ├── headings-testutils.json
│   │       │   ├── headings-text-detection-api.json
│   │       │   ├── headings-timing-entrytypes-registry.json
│   │       │   ├── headings-topics.json
│   │       │   ├── headings-touch-events.json
│   │       │   ├── headings-tracking-dnt.json
│   │       │   ├── headings-trust-token-api.json
│   │       │   ├── headings-trusted-types.json
│   │       │   ├── headings-turtledove.json
│   │       │   ├── headings-ua-client-hints.json
│   │       │   ├── headings-uievents-code.json
│   │       │   ├── headings-uievents-key.json
│   │       │   ├── headings-uievents.json
│   │       │   ├── headings-upgrade-insecure-requests.json
│   │       │   ├── headings-url.json
│   │       │   ├── headings-urlpattern.json
│   │       │   ├── headings-user-preference-media-features-headers.json
│   │       │   ├── headings-user-timing.json
│   │       │   ├── headings-vc-data-integrity.json
│   │       │   ├── headings-vc-data-model-2.0.json
│   │       │   ├── headings-vibration.json
│   │       │   ├── headings-video-rvfc.json
│   │       │   ├── headings-virtual-keyboard.json
│   │       │   ├── headings-w3c-patent-policy.json
│   │       │   ├── headings-w3c-process.json
│   │       │   ├── headings-wai-aria-1.2.json
│   │       │   ├── headings-wai-aria-1.3.json
│   │       │   ├── headings-wasm-core-2.json
│   │       │   ├── headings-wasm-js-api-2.json
│   │       │   ├── headings-wasm-web-api-2.json
│   │       │   ├── headings-web-animations-1.json
│   │       │   ├── headings-web-animations-2.json
│   │       │   ├── headings-web-app-launch.json
│   │       │   ├── headings-web-bluetooth-scanning.json
│   │       │   ├── headings-web-bluetooth.json
│   │       │   ├── headings-web-locks.json
│   │       │   ├── headings-web-nfc.json
│   │       │   ├── headings-web-otp.json
│   │       │   ├── headings-web-preferences-api.json
│   │       │   ├── headings-web-share-target.json
│   │       │   ├── headings-web-share.json
│   │       │   ├── headings-web-smart-card.json
│   │       │   ├── headings-webaudio.json
│   │       │   ├── headings-webauthn-3.json
│   │       │   ├── headings-webcodecs-aac-codec-registration.json
│   │       │   ├── headings-webcodecs-alaw-codec-registration.json
│   │       │   ├── headings-webcodecs-av1-codec-registration.json
│   │       │   ├── headings-webcodecs-avc-codec-registration.json
│   │       │   ├── headings-webcodecs-codec-registry.json
│   │       │   ├── headings-webcodecs-flac-codec-registration.json
│   │       │   ├── headings-webcodecs-hevc-codec-registration.json
│   │       │   ├── headings-webcodecs-mp3-codec-registration.json
│   │       │   ├── headings-webcodecs-opus-codec-registration.json
│   │       │   ├── headings-webcodecs-pcm-codec-registration.json
│   │       │   ├── headings-webcodecs-ulaw-codec-registration.json
│   │       │   ├── headings-webcodecs-video-frame-metadata-registry.json
│   │       │   ├── headings-webcodecs-vorbis-codec-registration.json
│   │       │   ├── headings-webcodecs-vp8-codec-registration.json
│   │       │   ├── headings-webcodecs-vp9-codec-registration.json
│   │       │   ├── headings-webcodecs.json
│   │       │   ├── headings-webcrypto-secure-curves.json
│   │       │   ├── headings-webcryptoapi.json
│   │       │   ├── headings-webdriver-bidi.json
│   │       │   ├── headings-webdriver2.json
│   │       │   ├── headings-webgl1.json
│   │       │   ├── headings-webgl2.json
│   │       │   ├── headings-webgpu.json
│   │       │   ├── headings-webhid.json
│   │       │   ├── headings-webidl.json
│   │       │   ├── headings-webmidi.json
│   │       │   ├── headings-webnn.json
│   │       │   ├── headings-webp.json
│   │       │   ├── headings-webpackage.json
│   │       │   ├── headings-webrtc-encoded-transform.json
│   │       │   ├── headings-webrtc-ice.json
│   │       │   ├── headings-webrtc-identity.json
│   │       │   ├── headings-webrtc-priority.json
│   │       │   ├── headings-webrtc-stats.json
│   │       │   ├── headings-webrtc-svc.json
│   │       │   ├── headings-webrtc.json
│   │       │   ├── headings-websockets.json
│   │       │   ├── headings-webtransport.json
│   │       │   ├── headings-webusb.json
│   │       │   ├── headings-webvtt1.json
│   │       │   ├── headings-webxr-ar-module-1.json
│   │       │   ├── headings-webxr-depth-sensing-1.json
│   │       │   ├── headings-webxr-dom-overlays-1.json
│   │       │   ├── headings-webxr-gamepads-module-1.json
│   │       │   ├── headings-webxr-hand-input-1.json
│   │       │   ├── headings-webxr-hit-test-1.json
│   │       │   ├── headings-webxr-lighting-estimation-1.json
│   │       │   ├── headings-webxr-meshing.json
│   │       │   ├── headings-webxr-plane-detection.json
│   │       │   ├── headings-webxr.json
│   │       │   ├── headings-webxrlayers-1.json
│   │       │   ├── headings-wgsl.json
│   │       │   ├── headings-window-controls-overlay.json
│   │       │   ├── headings-window-management.json
│   │       │   ├── headings-woff.json
│   │       │   ├── headings-woff2.json
│   │       │   └── headings-xhr.json
│   │       ├── languages.json
│   │       ├── link-defaults.infotree
│   │       ├── manifest.txt
│   │       ├── mdn/
│   │       │   ├── accelerometer.json
│   │       │   ├── ambient-light.json
│   │       │   ├── appmanifest.json
│   │       │   ├── aria.json
│   │       │   ├── audio-output.json
│   │       │   ├── autoplay.json
│   │       │   ├── background-fetch.json
│   │       │   ├── background-sync.json
│   │       │   ├── badging.json
│   │       │   ├── battery.json
│   │       │   ├── beacon.json
│   │       │   ├── clear-site-data.json
│   │       │   ├── clipboard-apis.json
│   │       │   ├── compat.json
│   │       │   ├── compositing.json
│   │       │   ├── compression.json
│   │       │   ├── console.json
│   │       │   ├── contact-api.json
│   │       │   ├── contact-picker.json
│   │       │   ├── content-index.json
│   │       │   ├── controls-list.json
│   │       │   ├── cookie-store.json
│   │       │   ├── crash-reporting.json
│   │       │   ├── credential-management.json
│   │       │   ├── csp-embedded-enforcement.json
│   │       │   ├── csp.json
│   │       │   ├── css-align.json
│   │       │   ├── css-animations-2.json
│   │       │   ├── css-animations.json
│   │       │   ├── css-backgrounds-4.json
│   │       │   ├── css-backgrounds.json
│   │       │   ├── css-box-4.json
│   │       │   ├── css-box.json
│   │       │   ├── css-break.json
│   │       │   ├── css-cascade-5.json
│   │       │   ├── css-cascade.json
│   │       │   ├── css-color-5.json
│   │       │   ├── css-color-6.json
│   │       │   ├── css-color-adjust.json
│   │       │   ├── css-color.json
│   │       │   ├── css-conditional-3.json
│   │       │   ├── css-conditional-4.json
│   │       │   ├── css-contain-3.json
│   │       │   ├── css-contain.json
│   │       │   ├── css-content.json
│   │       │   ├── css-counter-styles.json
│   │       │   ├── css-display.json
│   │       │   ├── css-easing.json
│   │       │   ├── css-env.json
│   │       │   ├── css-flexbox.json
│   │       │   ├── css-font-loading.json
│   │       │   ├── css-fonts-5.json
│   │       │   ├── css-fonts.json
│   │       │   ├── css-grid-3.json
│   │       │   ├── css-grid.json
│   │       │   ├── css-highlight-api.json
│   │       │   ├── css-images-4.json
│   │       │   ├── css-images.json
│   │       │   ├── css-inline.json
│   │       │   ├── css-lists.json
│   │       │   ├── css-logical.json
│   │       │   ├── css-masking.json
│   │       │   ├── css-mediaqueries.json
│   │       │   ├── css-multicol.json
│   │       │   ├── css-namespaces.json
│   │       │   ├── css-nesting.json
│   │       │   ├── css-overflow-4.json
│   │       │   ├── css-overflow.json
│   │       │   ├── css-overscroll.json
│   │       │   ├── css-page.json
│   │       │   ├── css-paint-api.json
│   │       │   ├── css-position-4.json
│   │       │   ├── css-position.json
│   │       │   ├── css-properties-values-api.json
│   │       │   ├── css-pseudo.json
│   │       │   ├── css-regions.json
│   │       │   ├── css-rhythm.json
│   │       │   ├── css-ruby.json
│   │       │   ├── css-scoping.json
│   │       │   ├── css-scroll-anchoring.json
│   │       │   ├── css-scroll-snap.json
│   │       │   ├── css-scrollbars.json
│   │       │   ├── css-shadow-parts.json
│   │       │   ├── css-shapes.json
│   │       │   ├── css-size-adjust.json
│   │       │   ├── css-sizing-3.json
│   │       │   ├── css-sizing-4.json
│   │       │   ├── css-text-4.json
│   │       │   ├── css-text-decor-4.json
│   │       │   ├── css-text-decor.json
│   │       │   ├── css-text.json
│   │       │   ├── css-transforms-2.json
│   │       │   ├── css-transforms.json
│   │       │   ├── css-transitions-2.json
│   │       │   ├── css-transitions.json
│   │       │   ├── css-typed-om.json
│   │       │   ├── css-ui.json
│   │       │   ├── css-values-5.json
│   │       │   ├── css-values.json
│   │       │   ├── css-variables.json
│   │       │   ├── css-view-transitions.json
│   │       │   ├── css-will-change.json
│   │       │   ├── css-writing-modes.json
│   │       │   ├── css2.json
│   │       │   ├── cssom-view.json
│   │       │   ├── cssom.json
│   │       │   ├── custom-state-pseudo-class.json
│   │       │   ├── deprecation-reporting.json
│   │       │   ├── dom-parsing.json
│   │       │   ├── dom.json
│   │       │   ├── draft-ietf-httpbis-rfc6265bis.json
│   │       │   ├── ecma-402.json
│   │       │   ├── ecmascript.json
│   │       │   ├── element-timing.json
│   │       │   ├── encoding.json
│   │       │   ├── encrypted-media.json
│   │       │   ├── entries-api.json
│   │       │   ├── event-timing.json
│   │       │   ├── eyedropper-api.json
│   │       │   ├── fedcm.json
│   │       │   ├── fetch-metadata.json
│   │       │   ├── fetch.json
│   │       │   ├── file-system-access.json
│   │       │   ├── file-system.json
│   │       │   ├── fileapi.json
│   │       │   ├── filter-effects-2.json
│   │       │   ├── filter-effects.json
│   │       │   ├── fullscreen.json
│   │       │   ├── gamepad-extensions.json
│   │       │   ├── gamepad.json
│   │       │   ├── generic-sensor.json
│   │       │   ├── geolocation-api.json
│   │       │   ├── geometry.json
│   │       │   ├── gpc.json
│   │       │   ├── gyroscope.json
│   │       │   ├── hr-time.json
│   │       │   ├── html-media-capture.json
│   │       │   ├── html.json
│   │       │   ├── idle-detection.json
│   │       │   ├── image-capture.json
│   │       │   ├── indexeddb.json
│   │       │   ├── input-device-capabilities.json
│   │       │   ├── input-events.json
│   │       │   ├── intersection-observer.json
│   │       │   ├── intervention-reporting.json
│   │       │   ├── keyboard-lock.json
│   │       │   ├── keyboard-map.json
│   │       │   ├── largest-contentful-paint.json
│   │       │   ├── layout-instability.json
│   │       │   ├── local-font-access.json
│   │       │   ├── longtasks.json
│   │       │   ├── magnetometer.json
│   │       │   ├── manifest-app-info.json
│   │       │   ├── manifest-incubations.json
│   │       │   ├── mathml.json
│   │       │   ├── media-capabilities.json
│   │       │   ├── media-playback-quality.json
│   │       │   ├── media-source.json
│   │       │   ├── mediacapture-fromelement.json
│   │       │   ├── mediacapture-screen-share.json
│   │       │   ├── mediacapture-streams.json
│   │       │   ├── mediacapture-transform.json
│   │       │   ├── mediaqueries-5.json
│   │       │   ├── mediasession.json
│   │       │   ├── mediastream-recording.json
│   │       │   ├── motion.json
│   │       │   ├── navigation-timing.json
│   │       │   ├── netinfo.json
│   │       │   ├── network-error-logging.json
│   │       │   ├── notifications.json
│   │       │   ├── numberformat.json
│   │       │   ├── orientation-event.json
│   │       │   ├── orientation-sensor.json
│   │       │   ├── page-lifecycle.json
│   │       │   ├── paint-timing.json
│   │       │   ├── payment-handler.json
│   │       │   ├── payment-request.json
│   │       │   ├── performance-measure-memory.json
│   │       │   ├── performance-timeline.json
│   │       │   ├── periodic-background-sync.json
│   │       │   ├── permissions-policy.json
│   │       │   ├── permissions.json
│   │       │   ├── picture-in-picture.json
│   │       │   ├── pluralrules.json
│   │       │   ├── pointerevents.json
│   │       │   ├── pointerlock.json
│   │       │   ├── portals.json
│   │       │   ├── presentation-api.json
│   │       │   ├── priority-hints.json
│   │       │   ├── proposal-array-from-async.json
│   │       │   ├── proposal-array-grouping.json
│   │       │   ├── proposal-atomics-wait-async.json
│   │       │   ├── proposal-intl-duration-format
│   │       │   ├── proposal-intl-enumeration.json
│   │       │   ├── proposal-intl-locale-info.json
│   │       │   ├── proposal-is-usv-string.json
│   │       │   ├── proposal-regexp-legacy-features.json
│   │       │   ├── proposal-resizablearraybuffer.json
│   │       │   ├── push-api.json
│   │       │   ├── referrer-policy.json
│   │       │   ├── remote-playback.json
│   │       │   ├── reporting.json
│   │       │   ├── requestidlecallback.json
│   │       │   ├── resize-observer.json
│   │       │   ├── resource-timing.json
│   │       │   ├── rfc2397.json
│   │       │   ├── rfc6265.json
│   │       │   ├── rfc6266.json
│   │       │   ├── rfc6454.json
│   │       │   ├── rfc6797.json
│   │       │   ├── rfc7239.json
│   │       │   ├── rfc7578.json
│   │       │   ├── rfc7838.json
│   │       │   ├── rfc8246.json
│   │       │   ├── rfc8288.json
│   │       │   ├── rfc8942.json
│   │       │   ├── rfc9110.json
│   │       │   ├── rfc9111.json
│   │       │   ├── rfc9112.json
│   │       │   ├── rfc9113.json
│   │       │   ├── sanitizer.json
│   │       │   ├── savedata.json
│   │       │   ├── scheduling-apis.json
│   │       │   ├── screen-orientation.json
│   │       │   ├── screen-wake-lock.json
│   │       │   ├── scroll-animations.json
│   │       │   ├── scroll-to-text-fragment.json
│   │       │   ├── selection-api.json
│   │       │   ├── selectors.json
│   │       │   ├── serial.json
│   │       │   ├── server-timing.json
│   │       │   ├── service-workers.json
│   │       │   ├── shape-detection-api.json
│   │       │   ├── sourcemaps.json
│   │       │   ├── speech-api.json
│   │       │   ├── storage-access.json
│   │       │   ├── storage.json
│   │       │   ├── streams.json
│   │       │   ├── subresource-integrity.json
│   │       │   ├── svg-animations.json
│   │       │   ├── svg.json
│   │       │   ├── touch-events.json
│   │       │   ├── trusted-types.json
│   │       │   ├── ua-client-hints.json
│   │       │   ├── uievents.json
│   │       │   ├── upgrade-insecure-requests.json
│   │       │   ├── url.json
│   │       │   ├── urlpattern.json
│   │       │   ├── user-preference-media-features-headers.json
│   │       │   ├── user-timing.json
│   │       │   ├── vibration.json
│   │       │   ├── wasm-exception-handling.json
│   │       │   ├── wasm-js-api.json
│   │       │   ├── wasm-web-embedding.json
│   │       │   ├── web-animations-2.json
│   │       │   ├── web-animations.json
│   │       │   ├── web-app-launch.json
│   │       │   ├── web-bluetooth.json
│   │       │   ├── web-locks.json
│   │       │   ├── web-nfc.json
│   │       │   ├── web-otp.json
│   │       │   ├── web-share-target.json
│   │       │   ├── web-share.json
│   │       │   ├── webaudio.json
│   │       │   ├── webauthn.json
│   │       │   ├── webcodecs.json
│   │       │   ├── webcrypto.json
│   │       │   ├── webdriver.json
│   │       │   ├── webgl-1.json
│   │       │   ├── webgl-2.json
│   │       │   ├── webgpu.json
│   │       │   ├── webhid.json
│   │       │   ├── webidl.json
│   │       │   ├── webmidi.json
│   │       │   ├── webrtc-extensions.json
│   │       │   ├── webrtc-identity.json
│   │       │   ├── webrtc-priority.json
│   │       │   ├── webrtc-stats.json
│   │       │   ├── webrtc.json
│   │       │   ├── websockets.json
│   │       │   ├── webtransport.json
│   │       │   ├── webusb.json
│   │       │   ├── webvtt.json
│   │       │   ├── webxr-anchors.json
│   │       │   ├── webxr-ar.json
│   │       │   ├── webxr-depth-sensing.json
│   │       │   ├── webxr-dom-overlays.json
│   │       │   ├── webxr-gamepads.json
│   │       │   ├── webxr-hand-input.json
│   │       │   ├── webxr-hit-test.json
│   │       │   ├── webxr-layers.json
│   │       │   ├── webxr-lighting-estimation.json
│   │       │   ├── webxr.json
│   │       │   ├── window-controls-overlay.json
│   │       │   ├── woff.json
│   │       │   ├── woff2.json
│   │       │   └── xhr.json
│   │       ├── mdn.json
│   │       ├── methods.json
│   │       ├── specs.json
│   │       ├── test-suites.json
│   │       ├── version.txt
│   │       └── wpt-tests.txt
│   ├── stringEnum/
│   │   ├── __init__.py
│   │   └── stringenum.py
│   ├── stylescript/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── autolinks.css
│   │   ├── cddl-highlighting.css
│   │   ├── colors.css
│   │   ├── counters.css
│   │   ├── dom-helper.js
│   │   ├── domintro.css
│   │   ├── expires.js
│   │   ├── hidedel.css
│   │   ├── idl-highlighting.css
│   │   ├── issues.css
│   │   ├── link-titles.js
│   │   ├── manager.py
│   │   ├── md-lists.css
│   │   ├── position-annos.js
│   │   ├── railroad.css
│   │   ├── selflinks.css
│   │   ├── var-click-highlighting.css
│   │   └── var-click-highlighting.js
│   ├── t.py
│   ├── template/
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── minimal.bs
│   │   ├── spec.bs
│   │   ├── test.bs
│   │   └── wpt.html
│   ├── test.py
│   ├── translate/
│   │   ├── __init__.py
│   │   ├── messages.po
│   │   └── translate.py
│   ├── unsortedJunk.py
│   ├── update/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── manifest.py
│   │   ├── mode.py
│   │   ├── updateBackRefs.py
│   │   ├── updateBiblio.py
│   │   ├── updateBoilerplates.py
│   │   ├── updateCanIUse.py
│   │   ├── updateCrossRefs.py
│   │   ├── updateLanguages.py
│   │   ├── updateLinkDefaults.py
│   │   ├── updateMdn.py
│   │   └── updateWpt.py
│   └── wpt/
│       ├── __init__.py
│       ├── wpt.css
│       ├── wpt.js
│       └── wptElement.py
├── bikeshed.py
├── docs/
│   ├── CONTRIBUTING.md
│   ├── index.bs
│   └── quick-start.md
├── emacs/
│   └── bikeshed.el
├── lint
├── mypy.ini
├── package.json
├── playwright.config.js
├── pyproject.toml
├── release.py
├── requirements-dev.txt
├── requirements.txt
├── setup.py
└── tests/
    ├── README.md
    ├── abstract001.bs
    ├── abstract001.console.txt
    ├── abstract001.html
    ├── adjacent-boilerplate/
    │   ├── adjacent-boilerplate.bs
    │   ├── adjacent-boilerplate.console.txt
    │   ├── adjacent-boilerplate.html
    │   ├── anchors.bsdata
    │   ├── defaults.include
    │   ├── link-defaults.infotree
    │   └── status-LS.include
    ├── advisement001.bs
    ├── advisement001.console.txt
    ├── advisement001.html
    ├── algorithm001.bs
    ├── algorithm001.console.txt
    ├── algorithm001.html
    ├── basic001.bs
    ├── basic001.console.txt
    ├── basic001.html
    ├── biblio001.bs
    ├── biblio001.console.txt
    ├── biblio001.html
    ├── biblio002.bs
    ├── biblio002.console.txt
    ├── biblio002.html
    ├── biblio003.bs
    ├── biblio003.console.txt
    ├── biblio003.html
    ├── biblio004.bs
    ├── biblio004.console.txt
    ├── biblio004.html
    ├── biblio005.bs
    ├── biblio005.console.txt
    ├── biblio005.html
    ├── biblio006.bs
    ├── biblio006.console.txt
    ├── biblio006.html
    ├── biblio007.bs
    ├── biblio007.console.txt
    ├── biblio007.html
    ├── boilerplate-substitution001.bs
    ├── boilerplate-substitution001.console.txt
    ├── boilerplate-substitution001.html
    ├── caniuse001.bs
    ├── caniuse001.console.txt
    ├── caniuse001.html
    ├── caniuse001_pwtest.js
    ├── cddl001.bs
    ├── cddl001.console.txt
    ├── cddl001.html
    ├── cddl002.bs
    ├── cddl002.console.txt
    ├── cddl002.html
    ├── cddl003.bs
    ├── cddl003.console.txt
    ├── cddl003.html
    ├── cddl004.bs
    ├── cddl004.console.txt
    ├── cddl004.html
    ├── cddl005.bs
    ├── cddl005.console.txt
    ├── cddl005.html
    ├── comments001.bs
    ├── comments001.console.txt
    ├── comments001.html
    ├── conditional001.bs
    ├── conditional001.console.txt
    ├── conditional001.html
    ├── conditional002.bs
    ├── conditional002.console.txt
    ├── conditional002.html
    ├── conditional003.bs
    ├── conditional003.console.txt
    ├── conditional003.html
    ├── css-production-range001.bs
    ├── css-production-range001.console.txt
    ├── css-production-range001.html
    ├── datablocks001.bs
    ├── datablocks001.console.txt
    ├── datablocks001.html
    ├── dfn-inference001.bs
    ├── dfn-inference001.console.txt
    ├── dfn-inference001.html
    ├── dfn-inference002.bs
    ├── dfn-inference002.console.txt
    ├── dfn-inference002.html
    ├── dict-type.bs
    ├── dict-type.console.txt
    ├── dict-type.html
    ├── elementdef001.bs
    ├── elementdef001.console.txt
    ├── elementdef001.html
    ├── elementdef001_pwtest.js
    ├── escapes001.bs
    ├── escapes001.console.txt
    ├── escapes001.html
    ├── figure001.bs
    ├── figure001.console.txt
    ├── figure001.html
    ├── fingerprint001.bs
    ├── fingerprint001.console.txt
    ├── fingerprint001.html
    ├── fingerprint002.bs
    ├── fingerprint002.console.txt
    ├── fingerprint002.html
    ├── fingerprint003.bs
    ├── fingerprint003.console.txt
    ├── fingerprint003.html
    ├── fingerprint004.bs
    ├── fingerprint004.console.txt
    ├── fingerprint004.html
    ├── fingerprint005.bs
    ├── fingerprint005.console.txt
    ├── fingerprint005.html
    ├── fingerprint006.bs
    ├── fingerprint006.console.txt
    ├── fingerprint006.html
    ├── force-crossorigin001.bs
    ├── force-crossorigin001.console.txt
    ├── force-crossorigin001.html
    ├── github/
    │   ├── WICG/
    │   │   ├── WebApiDevice/
    │   │   │   └── managed_config/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── aom/
    │   │   │   └── spec/
    │   │   │       ├── custom-element-semantics.bs
    │   │   │       ├── custom-element-semantics.console.txt
    │   │   │       ├── custom-element-semantics.html
    │   │   │       ├── input-events.bs
    │   │   │       ├── input-events.console.txt
    │   │   │       └── input-events.html
    │   │   ├── app-history/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── background-fetch/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── background-sync/
    │   │   │   └── spec/
    │   │   │       ├── PeriodicBackgroundSync-index.bs
    │   │   │       ├── PeriodicBackgroundSync-index.console.txt
    │   │   │       ├── PeriodicBackgroundSync-index.html
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── client-hints-infrastructure/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── compression/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── construct-stylesheets/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── contact-api/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── container-queries/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── content-index/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── conversion-measurement-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── cookie-store/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── cq-usecases/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── crash-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── css-parser-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── custom-state-pseudo-class/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── datacue/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── deprecation-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── document-policy/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── element-timing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── encrypted-media-encryption-scheme/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── entries-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── event-timing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── file-system-access/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── floc/
    │   │   │   ├── floc.bs
    │   │   │   ├── floc.console.txt
    │   │   │   └── floc.html
    │   │   ├── get-installed-related-apps/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── hdcp-detection/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── idle-detection/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── import-maps/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── intervention-reporting/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── keyboard-lock/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── keyboard-map/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── kv-storage/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── largest-contentful-paint/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── layout-instability/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── local-font-access/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── page-lifecycle/
    │   │   │   ├── spec.bs
    │   │   │   ├── spec.console.txt
    │   │   │   └── spec.html
    │   │   ├── periodic-background-sync/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions-request/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions-revoke/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── portals/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── priority-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── responsive-image-client-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── sanitizer-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── scheduling-apis/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── scroll-to-text-fragment/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── shape-detection-api/
    │   │   │   ├── index-zh-cn.bs
    │   │   │   ├── index-zh-cn.console.txt
    │   │   │   ├── index-zh-cn.html
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   ├── text.bs
    │   │   │   ├── text.console.txt
    │   │   │   └── text.html
    │   │   ├── sms-one-time-codes/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── speech-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── storage-buckets/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── ua-client-hints/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── video-rvfc/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── web-locks/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── web-otp/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webpackage/
    │   │   │   ├── loading.bs
    │   │   │   ├── loading.console.txt
    │   │   │   └── loading.html
    │   │   └── webusb/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       ├── index.html
    │   │       └── test/
    │   │           ├── index.bs
    │   │           ├── index.console.txt
    │   │           └── index.html
    │   ├── WebAudio/
    │   │   ├── web-audio-api/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── web-audio-api-v2/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── WebBluetoothCG/
    │   │   └── web-bluetooth/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       ├── index.html
    │   │       ├── scanning.bs
    │   │       ├── scanning.console.txt
    │   │       ├── scanning.html
    │   │       ├── tests.bs
    │   │       ├── tests.console.txt
    │   │       ├── tests.html
    │   │       ├── use-cases.bs
    │   │       ├── use-cases.console.txt
    │   │       └── use-cases.html
    │   ├── heycam/
    │   │   └── webidl/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── immersive-web/
    │   │   ├── WebXR-WebGPU-Binding/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── anchors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── depth-sensing/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── detached-elements/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── dom-overlays/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── hit-test/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── layers/
    │   │   │   ├── webxrlayers-1.bs
    │   │   │   ├── webxrlayers-1.console.txt
    │   │   │   └── webxrlayers-1.html
    │   │   ├── lighting-estimation/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── real-world-geometry/
    │   │   │   ├── plane-detection.bs
    │   │   │   ├── plane-detection.console.txt
    │   │   │   ├── plane-detection.html
    │   │   │   ├── webxrmeshing-1.bs
    │   │   │   ├── webxrmeshing-1.console.txt
    │   │   │   └── webxrmeshing-1.html
    │   │   ├── webvr/
    │   │   │   └── spec/
    │   │   │       └── 1.1/
    │   │   │           ├── index.bs
    │   │   │           ├── index.console.txt
    │   │   │           └── index.html
    │   │   ├── webxr/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-ar-module/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-gamepads-module/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webxr-hand-input/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── webxr-test-api/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── jfbastien/
    │   │   └── papers/
    │   │       └── source/
    │   │           ├── D1501R0.bs
    │   │           ├── D1501R0.console.txt
    │   │           ├── D1501R0.html
    │   │           ├── D2151r0.bs
    │   │           ├── D2151r0.console.txt
    │   │           ├── D2151r0.html
    │   │           ├── Math.signbit.bs
    │   │           ├── Math.signbit.console.txt
    │   │           ├── Math.signbit.html
    │   │           ├── N2218.bs
    │   │           ├── N2218.console.txt
    │   │           ├── N2218.html
    │   │           ├── N4455.bs
    │   │           ├── N4455.console.txt
    │   │           ├── N4455.html
    │   │           ├── P0323R10.bs
    │   │           ├── P0323R10.console.txt
    │   │           ├── P0323R10.html
    │   │           ├── P0323R8.bs
    │   │           ├── P0323R8.console.txt
    │   │           ├── P0323R8.html
    │   │           ├── P0323R9.bs
    │   │           ├── P0323R9.console.txt
    │   │           ├── P0323R9.html
    │   │           ├── P0323r4.bs
    │   │           ├── P0323r4.console.txt
    │   │           ├── P0323r4.html
    │   │           ├── P0323r5.bs
    │   │           ├── P0323r5.console.txt
    │   │           ├── P0323r5.html
    │   │           ├── P0323r6.bs
    │   │           ├── P0323r6.console.txt
    │   │           ├── P0323r6.html
    │   │           ├── P0418r1.bs
    │   │           ├── P0418r1.console.txt
    │   │           ├── P0418r1.html
    │   │           ├── P0418r2.bs
    │   │           ├── P0418r2.console.txt
    │   │           ├── P0418r2.html
    │   │           ├── P0476r0.bs
    │   │           ├── P0476r0.console.txt
    │   │           ├── P0476r0.html
    │   │           ├── P0476r1.bs
    │   │           ├── P0476r1.console.txt
    │   │           ├── P0476r1.html
    │   │           ├── P0476r2.bs
    │   │           ├── P0476r2.console.txt
    │   │           ├── P0476r2.html
    │   │           ├── P0502r0.bs
    │   │           ├── P0502r0.console.txt
    │   │           ├── P0502r0.html
    │   │           ├── P0528r0.bs
    │   │           ├── P0528r0.console.txt
    │   │           ├── P0528r0.html
    │   │           ├── P0528r1.bs
    │   │           ├── P0528r1.console.txt
    │   │           ├── P0528r1.html
    │   │           ├── P0528r2.bs
    │   │           ├── P0528r2.console.txt
    │   │           ├── P0528r2.html
    │   │           ├── P0690r0.bs
    │   │           ├── P0690r0.console.txt
    │   │           ├── P0690r0.html
    │   │           ├── P0690r1.bs
    │   │           ├── P0690r1.console.txt
    │   │           ├── P0690r1.html
    │   │           ├── P0750r0.bs
    │   │           ├── P0750r0.console.txt
    │   │           ├── P0750r0.html
    │   │           ├── P0750r1.bs
    │   │           ├── P0750r1.console.txt
    │   │           ├── P0750r1.html
    │   │           ├── P0907R4.bs
    │   │           ├── P0907R4.console.txt
    │   │           ├── P0907R4.html
    │   │           ├── P0907r0.bs
    │   │           ├── P0907r0.console.txt
    │   │           ├── P0907r0.html
    │   │           ├── P0907r1.bs
    │   │           ├── P0907r1.console.txt
    │   │           ├── P0907r1.html
    │   │           ├── P0907r2.bs
    │   │           ├── P0907r2.console.txt
    │   │           ├── P0907r2.html
    │   │           ├── P0908r0.bs
    │   │           ├── P0908r0.console.txt
    │   │           ├── P0908r0.html
    │   │           ├── P0995r0.bs
    │   │           ├── P0995r0.console.txt
    │   │           ├── P0995r0.html
    │   │           ├── P1018r5.bs
    │   │           ├── P1018r5.console.txt
    │   │           ├── P1018r5.html
    │   │           ├── P1018r6.bs
    │   │           ├── P1018r6.console.txt
    │   │           ├── P1018r6.html
    │   │           ├── P1018r7.bs
    │   │           ├── P1018r7.console.txt
    │   │           ├── P1018r7.html
    │   │           ├── P1018r8.bs
    │   │           ├── P1018r8.console.txt
    │   │           ├── P1018r8.html
    │   │           ├── P1018r9.bs
    │   │           ├── P1018r9.console.txt
    │   │           ├── P1018r9.html
    │   │           ├── P1152R0.bs
    │   │           ├── P1152R0.console.txt
    │   │           ├── P1152R0.html
    │   │           ├── P1152R1.bs
    │   │           ├── P1152R1.console.txt
    │   │           ├── P1152R1.html
    │   │           ├── P1152R2.bs
    │   │           ├── P1152R2.console.txt
    │   │           ├── P1152R2.html
    │   │           ├── P1152R3.bs
    │   │           ├── P1152R3.console.txt
    │   │           ├── P1152R3.html
    │   │           ├── P1152R4.bs
    │   │           ├── P1152R4.console.txt
    │   │           ├── P1152R4.html
    │   │           ├── P1205R0.bs
    │   │           ├── P1205R0.console.txt
    │   │           ├── P1205R0.html
    │   │           ├── P1225R0.bs
    │   │           ├── P1225R0.console.txt
    │   │           ├── P1225R0.html
    │   │           ├── P1482r0.bs
    │   │           ├── P1482r0.console.txt
    │   │           ├── P1482r0.html
    │   │           ├── P1831R0.bs
    │   │           ├── P1831R0.console.txt
    │   │           ├── P1831R0.html
    │   │           ├── P1831R1.bs
    │   │           ├── P1831R1.console.txt
    │   │           ├── P1831R1.html
    │   │           ├── P1860R0.bs
    │   │           ├── P1860R0.console.txt
    │   │           ├── P1860R0.html
    │   │           ├── P2186R0.bs
    │   │           ├── P2186R0.console.txt
    │   │           ├── P2186R0.html
    │   │           ├── P2186R1.bs
    │   │           ├── P2186R1.console.txt
    │   │           ├── P2186R1.html
    │   │           ├── P2186R2.bs
    │   │           ├── P2186R2.console.txt
    │   │           ├── P2186R2.html
    │   │           ├── bikeshed.bs
    │   │           ├── bikeshed.console.txt
    │   │           ├── bikeshed.html
    │   │           ├── p0323r7.bs
    │   │           ├── p0323r7.console.txt
    │   │           ├── p0323r7.html
    │   │           ├── p0528r3.bs
    │   │           ├── p0528r3.console.txt
    │   │           ├── p0528r3.html
    │   │           ├── p0907r3.bs
    │   │           ├── p0907r3.console.txt
    │   │           ├── p0907r3.html
    │   │           ├── p0995r1.bs
    │   │           ├── p0995r1.console.txt
    │   │           ├── p0995r1.html
    │   │           ├── p1102r0.bs
    │   │           ├── p1102r0.console.txt
    │   │           ├── p1102r0.html
    │   │           ├── p1119r0.bs
    │   │           ├── p1119r0.console.txt
    │   │           └── p1119r0.html
    │   ├── privacycg/
    │   │   ├── is-logged-in/
    │   │   │   ├── is-logged-in.bs
    │   │   │   ├── is-logged-in.console.txt
    │   │   │   └── is-logged-in.html
    │   │   ├── private-click-measurement/
    │   │   │   ├── private-click-measurement.bs
    │   │   │   ├── private-click-measurement.console.txt
    │   │   │   └── private-click-measurement.html
    │   │   └── storage-access/
    │   │       ├── storage-access.bs
    │   │       ├── storage-access.console.txt
    │   │       └── storage-access.html
    │   ├── w3c/
    │   │   ├── FileAPI/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── IndexedDB/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── IntersectionObserver/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── PFE/
    │   │   │   ├── Overview.bs
    │   │   │   ├── Overview.console.txt
    │   │   │   └── Overview.html
    │   │   ├── ServiceWorker/
    │   │   │   ├── docs/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   ├── index.html
    │   │   │   │   └── v1/
    │   │   │   │       ├── index.bs
    │   │   │   │       ├── index.console.txt
    │   │   │   │       └── index.html
    │   │   │   └── publish/
    │   │   │       ├── service_worker/
    │   │   │       │   └── WD-service-workers-20160830/
    │   │   │       │       ├── index.bs
    │   │   │       │       ├── index.console.txt
    │   │   │       │       └── index.html
    │   │   │       └── service_worker_1/
    │   │   │           └── WD-service-workers-1-20161011/
    │   │   │               ├── index.bs
    │   │   │               ├── index.console.txt
    │   │   │               └── index.html
    │   │   ├── accelerometer/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── ambient-light/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── clipboard-apis/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── css-houdini-drafts/
    │   │   │   ├── box-tree-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animation-worklet-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-layout-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-paint-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-parser-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-properties-values-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-typed-om/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-typed-om-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── font-metrics-api/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── worklets/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── csswg-drafts/
    │   │   │   ├── css-2015/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2017/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2018/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-2020/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-align-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-animations-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-backgrounds-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-backgrounds-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-box-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   ├── Overview.html
    │   │   │   │   ├── block-layout.bs
    │   │   │   │   ├── block-layout.console.txt
    │   │   │   │   └── block-layout.html
    │   │   │   ├── css-box-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-break-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-break-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-cascade-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-adjust-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-color-hdr/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-conditional-values-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-contain-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-content-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-counter-styles-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-device-adapt-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-display-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-easing-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-egg-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-env-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-exclusions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-extensions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-flexbox-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-font-loading-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-fonts-3/
    │   │   │   │   ├── Overview-wip.bs
    │   │   │   │   ├── Overview-wip.console.txt
    │   │   │   │   └── Overview-wip.html
    │   │   │   ├── css-fonts-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-fonts-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-forms-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-gcpm-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-gcpm-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-grid-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-highlight-api-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-images-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-images-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-inline-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-line-grid-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-lists-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-logical-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-mobile/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-module-bikeshed/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-multicol-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-multicol-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-namespaces-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-nav-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-nesting-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overflow-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overflow-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-overscroll-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-page-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-page-floats-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-position-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-print/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-pseudo-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-regions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-rhythm-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-round-display-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ruby-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scoping-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scroll-anchoring-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scroll-snap-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-scrollbars-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shadow-parts-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shapes-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-shapes-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-size-adjust-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-sizing-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-sizing-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-speech-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-syntax-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-tables-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-decor-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-text-decor-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transforms-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transforms-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transitions-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-transitions-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ui-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-ui-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-values-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-values-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-variables-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-will-change-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-writing-modes-3/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-writing-modes-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── cssom-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── cssom-view-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── indexes/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── mediaqueries-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── mediaqueries-5/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── resize-observer-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── scroll-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── selectors-4/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── selectors-nonelement-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   ├── Overview.html
    │   │   │   │   └── Overview_pwtest.js
    │   │   │   ├── web-animations-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── web-animations-2/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── device-memory/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── deviceorientation/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── dpub-pagination/
    │   │   │   ├── Overview.bs
    │   │   │   ├── Overview.console.txt
    │   │   │   └── Overview.html
    │   │   ├── fxtf-drafts/
    │   │   │   ├── compositing-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── compositing-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── css-masking-1/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── fill-stroke/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── filter-effects-2/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── geometry/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   ├── matrix/
    │   │   │   │   ├── Overview.bs
    │   │   │   │   ├── Overview.console.txt
    │   │   │   │   └── Overview.html
    │   │   │   └── motion-1/
    │   │   │       ├── Overview.bs
    │   │   │       ├── Overview.console.txt
    │   │   │       └── Overview.html
    │   │   ├── geolocation-sensor/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── gyroscope/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── longtasks/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── magnetometer/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── media-capabilities/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediacapture-image/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediacapture-record/
    │   │   │   ├── MediaRecorder.bs
    │   │   │   ├── MediaRecorder.console.txt
    │   │   │   └── MediaRecorder.html
    │   │   ├── mediacapture-transform/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── mediasession/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── motion-sensors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── releases/
    │   │   │       ├── NOTE/
    │   │   │       │   ├── NOTE.bs
    │   │   │       │   ├── NOTE.console.txt
    │   │   │       │   └── NOTE.html
    │   │   │       └── NOTE2/
    │   │   │           ├── index.bs
    │   │   │           ├── index.console.txt
    │   │   │           └── index.html
    │   │   ├── openscreenprotocol/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── orientation-sensor/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── releases/
    │   │   │       ├── FPWD.bs
    │   │   │       ├── FPWD.console.txt
    │   │   │       └── FPWD.html
    │   │   ├── paint-timing/
    │   │   │   ├── painttiming.bs
    │   │   │   ├── painttiming.console.txt
    │   │   │   └── painttiming.html
    │   │   ├── payment-method-manifest/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── permissions/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── picture-in-picture/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── proximity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── reporting/
    │   │   │   ├── network-reporting.bs
    │   │   │   ├── network-reporting.console.txt
    │   │   │   └── network-reporting.html
    │   │   ├── sensors/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   ├── usecases.bs
    │   │   │   ├── usecases.console.txt
    │   │   │   └── usecases.html
    │   │   ├── svgwg/
    │   │   │   └── specs/
    │   │   │       ├── color/
    │   │   │       │   ├── Overview.bs
    │   │   │       │   ├── Overview.console.txt
    │   │   │       │   └── Overview.html
    │   │   │       ├── marker/
    │   │   │       │   ├── Overview.bs
    │   │   │       │   ├── Overview.console.txt
    │   │   │       │   └── Overview.html
    │   │   │       ├── svg-native/
    │   │   │       │   ├── index.bs
    │   │   │       │   ├── index.console.txt
    │   │   │       │   └── index.html
    │   │   │       └── transform/
    │   │   │           ├── Overview.bs
    │   │   │           ├── Overview.console.txt
    │   │   │           └── Overview.html
    │   │   ├── w3process/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── wcag-act/
    │   │   │   ├── NOTE-act-rules-common-aspects.bs
    │   │   │   ├── NOTE-act-rules-common-aspects.console.txt
    │   │   │   ├── NOTE-act-rules-common-aspects.html
    │   │   │   ├── act-fr-reqs.bs
    │   │   │   ├── act-fr-reqs.console.txt
    │   │   │   ├── act-fr-reqs.html
    │   │   │   ├── act-rules-format.bs
    │   │   │   ├── act-rules-format.console.txt
    │   │   │   └── act-rules-format.html
    │   │   ├── webappsec-change-password-url/
    │   │   │   ├── change-password-url.bs
    │   │   │   ├── change-password-url.console.txt
    │   │   │   ├── change-password-url.html
    │   │   │   ├── response-code-reliability.bs
    │   │   │   ├── response-code-reliability.console.txt
    │   │   │   └── response-code-reliability.html
    │   │   ├── webappsec-credential-management/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-csp/
    │   │   │   ├── 2/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── api/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── cookies/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── document/
    │   │   │   │   ├── index.bs
    │   │   │   │   ├── index.console.txt
    │   │   │   │   └── index.html
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   ├── index.html
    │   │   │   └── pinning/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── webappsec-fetch-metadata/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-mixed-content/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-permissions-policy/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-post-spectre-webdev/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-suborigins/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-subresource-integrity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-trusted-types/
    │   │   │   └── spec/
    │   │   │       ├── index.bs
    │   │   │       ├── index.console.txt
    │   │   │       └── index.html
    │   │   ├── webappsec-uisecurity/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webappsec-upgrade-insecure-requests/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webauthn/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webdriver-bidi/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webrtc-encoded-transform/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webrtc-priority/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── webtransport/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── webvtt/
    │   │       ├── index.bs
    │   │       ├── index.console.txt
    │   │       └── index.html
    │   ├── w3ctag/
    │   │   ├── client-certificates/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── design-principles/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── evergreen-web/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── promises-guide/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   ├── security-questionnaire/
    │   │   │   ├── index.bs
    │   │   │   ├── index.console.txt
    │   │   │   └── index.html
    │   │   └── url/
    │   │       ├── url.bs
    │   │       ├── url.console.txt
    │   │       └── url.html
    │   └── whatwg/
    │       ├── compat/
    │       │   ├── compatibility.bs
    │       │   ├── compatibility.console.txt
    │       │   └── compatibility.html
    │       ├── console/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── dom/
    │       │   ├── dom.bs
    │       │   ├── dom.console.txt
    │       │   └── dom.html
    │       ├── encoding/
    │       │   ├── encoding.bs
    │       │   ├── encoding.console.txt
    │       │   └── encoding.html
    │       ├── fetch/
    │       │   ├── fetch.bs
    │       │   ├── fetch.console.txt
    │       │   └── fetch.html
    │       ├── fullscreen/
    │       │   ├── fullscreen.bs
    │       │   ├── fullscreen.console.txt
    │       │   └── fullscreen.html
    │       ├── infra/
    │       │   ├── infra.bs
    │       │   ├── infra.console.txt
    │       │   └── infra.html
    │       ├── loader/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── mimesniff/
    │       │   ├── mimesniff.bs
    │       │   ├── mimesniff.console.txt
    │       │   └── mimesniff.html
    │       ├── notifications/
    │       │   ├── notifications.bs
    │       │   ├── notifications.console.txt
    │       │   └── notifications.html
    │       ├── quirks/
    │       │   ├── quirks.bs
    │       │   ├── quirks.console.txt
    │       │   ├── quirks.html
    │       │   └── quirks_pwtest.js
    │       ├── storage/
    │       │   ├── storage.bs
    │       │   ├── storage.console.txt
    │       │   └── storage.html
    │       ├── streams/
    │       │   ├── index.bs
    │       │   ├── index.console.txt
    │       │   └── index.html
    │       ├── url/
    │       │   ├── url.bs
    │       │   ├── url.console.txt
    │       │   └── url.html
    │       └── xhr/
    │           ├── xhr.bs
    │           ├── xhr.console.txt
    │           └── xhr.html
    ├── highlight001.bs
    ├── highlight001.console.txt
    ├── highlight001.html
    ├── idl001.bs
    ├── idl001.console.txt
    ├── idl001.html
    ├── idl002.bs
    ├── idl002.console.txt
    ├── idl002.html
    ├── idl003.bs
    ├── idl003.console.txt
    ├── idl003.html
    ├── idl004.bs
    ├── idl004.console.txt
    ├── idl004.html
    ├── idl005.bs
    ├── idl005.console.txt
    ├── idl005.html
    ├── idl006.bs
    ├── idl006.console.txt
    ├── idl006.html
    ├── idl007.bs
    ├── idl007.console.txt
    ├── idl007.html
    ├── idl008.bs
    ├── idl008.console.txt
    ├── idl008.html
    ├── idl009.bs
    ├── idl009.console.txt
    ├── idl009.html
    ├── idl010.bs
    ├── idl010.console.txt
    ├── idl010.html
    ├── img-sizing/
    │   ├── image-size001.bs
    │   ├── image-size001.console.txt
    │   └── image-size001.html
    ├── include001.bs
    ├── include001.console.txt
    ├── include001.html
    ├── include001.txt
    ├── include002-1.txt
    ├── include002-2.txt
    ├── include002-3.txt
    ├── include002.bs
    ├── include002.console.txt
    ├── include002.html
    ├── include003.bs
    ├── include003.console.txt
    ├── include003.html
    ├── include003.txt
    ├── include004-files/
    │   ├── include004-2.bs
    │   ├── include004-2.html
    │   ├── include004-files/
    │   │   ├── include004-2.bs
    │   │   ├── include004-2.html
    │   │   ├── include004.bs
    │   │   └── include004.html
    │   ├── include004.bs
    │   └── include004.html
    ├── include004.bs
    ├── include004.console.txt
    ├── include004.html
    ├── include005.bs
    ├── include005.console.txt
    ├── include005.html
    ├── include006.bs
    ├── include006.console.txt
    ├── include006.html
    ├── include006.txt
    ├── index001.bs
    ├── index001.console.txt
    ├── index001.html
    ├── index002.bs
    ├── index002.console.txt
    ├── index002.html
    ├── index003.bs
    ├── index003.console.txt
    ├── index003.html
    ├── lexer001.bs
    ├── lexer001.console.txt
    ├── lexer001.html
    ├── line-count-001.bs
    ├── line-count-001.console.txt
    ├── line-count-001.html
    ├── link-shorthands001.bs
    ├── link-shorthands001.console.txt
    ├── link-shorthands001.html
    ├── link-shorthands002.bs
    ├── link-shorthands002.console.txt
    ├── link-shorthands002.html
    ├── link-shorthands003.bs
    ├── link-shorthands003.console.txt
    ├── link-shorthands003.html
    ├── link-shorthands004.bs
    ├── link-shorthands004.console.txt
    ├── link-shorthands004.html
    ├── links001.bs
    ├── links001.console.txt
    ├── links001.html
    ├── links001_pwtest.js
    ├── links002.bs
    ├── links002.console.txt
    ├── links002.html
    ├── links003.bs
    ├── links003.console.txt
    ├── links003.html
    ├── links004.bs
    ├── links004.console.txt
    ├── links004.html
    ├── links005.bs
    ├── links005.console.txt
    ├── links005.html
    ├── links006.bs
    ├── links006.console.txt
    ├── links006.html
    ├── links007.bs
    ├── links007.console.txt
    ├── links007.html
    ├── links008.bs
    ├── links008.console.txt
    ├── links008.html
    ├── links009.bs
    ├── links009.console.txt
    ├── links009.html
    ├── links010.bs
    ├── links010.console.txt
    ├── links010.html
    ├── links011.bs
    ├── links011.console.txt
    ├── links011.html
    ├── lint001.bs
    ├── lint001.console.txt
    ├── lint001.html
    ├── lint002.bs
    ├── lint002.console.txt
    ├── lint002.html
    ├── macros001.bs
    ├── macros001.console.txt
    ├── macros001.html
    ├── macros002.bs
    ├── macros002.console.txt
    ├── macros002.html
    ├── markdown001.bs
    ├── markdown001.console.txt
    ├── markdown001.html
    ├── markdown002.bs
    ├── markdown002.console.txt
    ├── markdown002.html
    ├── markdown003.bs
    ├── markdown003.console.txt
    ├── markdown003.html
    ├── markdown004.bs
    ├── markdown004.console.txt
    ├── markdown004.html
    ├── markdown005.bs
    ├── markdown005.console.txt
    ├── markdown005.html
    ├── markdown006.bs
    ├── markdown006.console.txt
    ├── markdown006.html
    ├── markdown007.bs
    ├── markdown007.console.txt
    ├── markdown007.html
    ├── markdown008.bs
    ├── markdown008.console.txt
    ├── markdown008.html
    ├── markdown009.bs
    ├── markdown009.console.txt
    ├── markdown009.html
    ├── markdown010.bs
    ├── markdown010.console.txt
    ├── markdown010.html
    ├── markdown011.bs
    ├── markdown011.console.txt
    ├── markdown011.html
    ├── markdown012.bs
    ├── markdown012.console.txt
    ├── markdown012.html
    ├── markdown013.bs
    ├── markdown013.console.txt
    ├── markdown013.html
    ├── markdown014.bs
    ├── markdown014.console.txt
    ├── markdown014.html
    ├── merge-metadata001.bs
    ├── merge-metadata001.console.txt
    ├── merge-metadata001.html
    ├── metadata-expires001.bs
    ├── metadata-expires001.console.txt
    ├── metadata-expires001.html
    ├── metadata-expires002.bs
    ├── metadata-expires002.console.txt
    ├── metadata-expires002.html
    ├── metadata-expires003.bs
    ├── metadata-expires003.console.txt
    ├── metadata-expires003.html
    ├── metadata-expires004.bs
    ├── metadata-expires004.console.txt
    ├── metadata-expires004.html
    ├── metadata-expires005.bs
    ├── metadata-expires005.console.txt
    ├── metadata-expires005.html
    ├── metadata-expires006.bs
    ├── metadata-expires006.console.txt
    ├── metadata-expires006.html
    ├── metadata-order001.bs
    ├── metadata-order001.console.txt
    ├── metadata-order001.html
    ├── metadata001.bs
    ├── metadata001.console.txt
    ├── metadata001.html
    ├── metadata002.bs
    ├── metadata002.console.txt
    ├── metadata002.html
    ├── metadata003.bs
    ├── metadata003.console.txt
    ├── metadata003.html
    ├── metadata004.bs
    ├── metadata004.console.txt
    ├── metadata004.html
    ├── metadata005.bs
    ├── metadata005.console.txt
    ├── metadata005.html
    ├── metadata006.bs
    ├── metadata006.console.txt
    ├── metadata006.html
    ├── metadata007.bs
    ├── metadata007.console.txt
    ├── metadata007.html
    ├── metadata008.bs
    ├── metadata008.console.txt
    ├── metadata008.html
    ├── metadata009.bs
    ├── metadata009.console.txt
    ├── metadata009.html
    ├── metadata010.bs
    ├── metadata010.console.txt
    ├── metadata010.html
    ├── metadata011.bs
    ├── metadata011.console.txt
    ├── metadata011.html
    ├── metadata012.bs
    ├── metadata012.console.txt
    ├── metadata012.html
    ├── metadata013.bs
    ├── metadata013.console.txt
    ├── metadata013.html
    ├── metadata014.bs
    ├── metadata014.console.txt
    ├── metadata014.html
    ├── metadata015.bs
    ├── metadata015.console.txt
    ├── metadata015.html
    ├── metadata016.bs
    ├── metadata016.console.txt
    ├── metadata016.html
    ├── metadata017.bs
    ├── metadata017.console.txt
    ├── metadata017.html
    ├── metadata018.bs
    ├── metadata018.console.txt
    ├── metadata018.html
    ├── notes-examples001.bs
    ├── notes-examples001.console.txt
    ├── notes-examples001.html
    ├── notes-issues001.bs
    ├── notes-issues001.console.txt
    ├── notes-issues001.html
    ├── parsing-links001.bs
    ├── parsing-links001.console.txt
    ├── parsing-links001.html
    ├── parsing001.bs
    ├── parsing001.console.txt
    ├── parsing001.html
    ├── pre001.bs
    ├── pre001.console.txt
    ├── pre001.html
    ├── pre002.bs
    ├── pre002.console.txt
    ├── pre002.html
    ├── pre003.bs
    ├── pre003.console.txt
    ├── pre003.html
    ├── pre004.bs
    ├── pre004.console.txt
    ├── pre004.html
    ├── previous-versions-001.bs
    ├── previous-versions-001.console.txt
    ├── previous-versions-001.html
    ├── previous-versions-002.bs
    ├── previous-versions-002.console.txt
    ├── previous-versions-002.html
    ├── previous-versions-003.bs
    ├── previous-versions-003.console.txt
    ├── previous-versions-003.html
    ├── previous-versions-004.bs
    ├── previous-versions-004.console.txt
    ├── previous-versions-004.html
    ├── previous-versions-005.bs
    ├── previous-versions-005.console.txt
    ├── previous-versions-005.html
    ├── previous-versions-006.bs
    ├── previous-versions-006.console.txt
    ├── previous-versions-006.html
    ├── previous-versions-007.bs
    ├── previous-versions-007.console.txt
    ├── previous-versions-007.html
    ├── section-links001.bs
    ├── section-links001.console.txt
    ├── section-links001.html
    ├── section-links002.bs
    ├── section-links002.console.txt
    ├── section-links002.html
    ├── section-links003.bs
    ├── section-links003.console.txt
    ├── section-links003.html
    ├── tar-file001.console.txt
    ├── tar-file001.html
    ├── template.bs
    ├── template.console.txt
    ├── template.html
    ├── var001.bs
    ├── var001.console.txt
    ├── var001.html
    ├── var002.bs
    ├── var002.console.txt
    └── var002.html
Download .txt
SYMBOL INDEX (1397 symbols across 96 files)

FILE: .github/workflows/update-tests/update.py
  function getData (line 20) | def getData():
  function reposFromOrg (line 64) | def reposFromOrg(org, skipRepos=None):
  function filesFromRepo (line 81) | def filesFromRepo(repo, skipFiles=None):
  function processFile (line 107) | def processFile(file):
  function main (line 117) | def main():

FILE: bikeshed/InputSource.py
  class InputContent (line 21) | class InputContent:
    method lines (line 26) | def lines(self) -> list[line.Line]:
    method content (line 58) | def content(self) -> str:
  function inputFromName (line 62) | def inputFromName(sourceName: str, **kwargs: t.Any) -> InputSource:
  class InputSource (line 72) | class InputSource:
    method __str__ (line 81) | def __str__(self) -> str:
    method __repr__ (line 84) | def __repr__(self) -> str:
    method __hash__ (line 87) | def __hash__(self) -> int:
    method __eq__ (line 90) | def __eq__(self, other: object) -> bool:
    method read (line 94) | def read(self) -> InputContent:
    method hasDirectory (line 97) | def hasDirectory(self) -> bool:
    method directory (line 101) | def directory(self) -> str:
    method relative (line 106) | def relative(self, _: t.Any) -> InputSource | None:
    method mtime (line 116) | def mtime(self) -> float | None:
    method cheaplyExists (line 120) | def cheaplyExists(self, _: t.Any) -> bool | None:
    method __getattr__ (line 127) | def __getattr__(self, name: str) -> str:
  class StdinInputSource (line 136) | class StdinInputSource(InputSource):
    method __init__ (line 137) | def __init__(self, sourceName: str, **kwargs: t.Any) -> None:  # pylin...
    method __str__ (line 143) | def __str__(self) -> str:
    method read (line 146) | def read(self) -> InputContent:
  class UrlInputSource (line 150) | class UrlInputSource(InputSource):
    method __init__ (line 151) | def __init__(self, sourceName: str, **kwargs: t.Any) -> None:  # pylin...
    method __str__ (line 156) | def __str__(self) -> str:
    method _fetch (line 164) | def _fetch(self) -> requests.Response:
    method read (line 174) | def read(self) -> InputContent:
    method relative (line 183) | def relative(self, *relativePathSegs: str) -> UrlInputSource:
  class FileInputSource (line 187) | class FileInputSource(InputSource):
    method __init__ (line 188) | def __init__(self, sourceName: str, *, chroot: bool, chrootPath: str |...
    method __str__ (line 199) | def __str__(self) -> str:
    method read (line 202) | def read(self) -> InputContent:
    method hasDirectory (line 209) | def hasDirectory(self) -> bool:
    method directory (line 212) | def directory(self) -> str:
    method relative (line 215) | def relative(self, *relativePathSegs: str) -> FileInputSource:
    method cheaplyExists (line 222) | def cheaplyExists(self, relativePath: str) -> bool:
    method mtime (line 225) | def mtime(self) -> float | None:
  class TarInputSource (line 233) | class TarInputSource(InputSource):
    method __init__ (line 234) | def __init__(self, sourceName: str, *, tarMemberName: str = "index.bs"...
    method __str__ (line 240) | def __str__(self) -> str:
    method read (line 243) | def read(self) -> InputContent:
    method hasDirectory (line 264) | def hasDirectory(self) -> bool:
    method directory (line 267) | def directory(self) -> str:
    method relative (line 272) | def relative(self, *relativePathSegs: str) -> TarInputSource:
    method cheaplyExists (line 278) | def cheaplyExists(self, relativePath: str) -> bool | None:
    method mtime (line 284) | def mtime(self) -> float | None:
    method _openTarFile (line 291) | def _openTarFile(self) -> tarfile.TarFile:

FILE: bikeshed/Spec.py
  class Spec (line 52) | class Spec:
    method __init__ (line 53) | def __init__(
    method initializeState (line 91) | def initializeState(self) -> bool:
    method initMetadata (line 139) | def initMetadata(self, inputContent: InputSource.InputContent) -> None:
    method earlyParse (line 191) | def earlyParse(self, inputContent: InputSource.InputContent) -> list[l...
    method checkValidity (line 200) | def checkValidity(self) -> bool:
    method recordDependencies (line 203) | def recordDependencies(self, *inputSources: InputSource.InputSource) -...
    method preprocess (line 206) | def preprocess(self) -> Spec:
    method assembleDocument (line 212) | def assembleDocument(self) -> Spec:
    method processDocument (line 253) | def processDocument(self) -> Spec:
    method serialize (line 358) | def serialize(self) -> str | None:
    method fixMissingOutputFilename (line 367) | def fixMissingOutputFilename(self, outputFilename: str | None) -> str:
    method finish (line 382) | def finish(self, outputFilename: str | None = None, newline: str | Non...
    method printResultMessage (line 399) | def printResultMessage(self) -> None:
    method watch (line 416) | def watch(self, outputFilename: str | None, port: int | None = None, l...
    method printTargets (line 481) | def printTargets(self) -> None:
    method isOpaqueElement (line 493) | def isOpaqueElement(self, el: t.ElementT) -> bool:
  function printDone (line 503) | def printDone() -> None:
  function findImplicitInputFile (line 518) | def findImplicitInputFile() -> str | None:
  function catchArgparseBug (line 545) | def catchArgparseBug(string: str | None) -> bool:
  function fetchLanguages (line 563) | def fetchLanguages(dataFile: retrieve.DataFileRequester) -> dict[str, la...
  function fetchDoctypes (line 570) | def fetchDoctypes(dataFile: retrieve.DataFileRequester) -> doctypes.Doct...
  function addDomintroStyles (line 574) | def addDomintroStyles(doc: Spec) -> None:
  function checkForMixedIndents (line 583) | def checkForMixedIndents(lines: t.Sequence[l.Line], info: metadata.Inden...
  function FIXMEreplaceMarkdownBlockquotes (line 605) | def FIXMEreplaceMarkdownBlockquotes(text: str) -> str:

FILE: bikeshed/__init__.py
  function verify_python_version (line 11) | def verify_python_version() -> None:

FILE: bikeshed/biblio.py
  class BiblioEntry (line 13) | class BiblioEntry(metaclass=abc.ABCMeta):
    method url (line 24) | def url(self) -> str:
    method toHTML (line 38) | def toHTML(self) -> t.ElementT: ...
    method valid (line 41) | def valid(self) -> bool: ...
    method strip (line 43) | def strip(self) -> BiblioEntry:
  class NormalBiblioEntry (line 57) | class NormalBiblioEntry(BiblioEntry):
    method toHTML (line 64) | def toHTML(self) -> t.ElementT:
    method valid (line 106) | def valid(self) -> bool:
    method strip (line 109) | def strip(self) -> NormalBiblioEntry:
  class SpecBiblioEntry (line 122) | class SpecBiblioEntry(BiblioEntry):
    method __init__ (line 128) | def __init__(self, spec: dict[str, str], preferredStatus: str | None =...
    method valid (line 138) | def valid(self) -> bool:
    method toHTML (line 141) | def toHTML(self) -> t.ElementT:
  class StringBiblioEntry (line 150) | class StringBiblioEntry(BiblioEntry):
    method __init__ (line 159) | def __init__(self, linkText: str, data: str, order: int = 0) -> None:
    method valid (line 173) | def valid(self) -> bool:
    method toHTML (line 176) | def toHTML(self) -> t.ElementT:
  class AliasBiblioEntry (line 180) | class AliasBiblioEntry(BiblioEntry):
    method __init__ (line 188) | def __init__(self, linkText: str, aliasOf: str, order: int = 0) -> None:
    method valid (line 192) | def valid(self) -> bool:
    method toHTML (line 195) | def toHTML(self) -> t.ElementT:
  function processSpecrefBiblioFile (line 199) | def processSpecrefBiblioFile(text: str, storage: t.BiblioStorageT, order...
  function loadBiblioDataFile (line 288) | def loadBiblioDataFile(lines: t.Iterator[str], storage: t.BiblioStorageT...
  function levenshtein (line 339) | def levenshtein(a: str, b: str) -> int:
  function findCloseBiblios (line 360) | def findCloseBiblios(biblioKeys: t.Sequence[str], target: str, n: int = ...
  function dedupBiblioReferences (line 390) | def dedupBiblioReferences(doc: t.SpecT) -> None:

FILE: bikeshed/boilerplate.py
  function boilerplateFromHtml (line 21) | def boilerplateFromHtml(doc: t.SpecT, htmlString: str, context: str) -> ...
  function loadBoilerplate (line 32) | def loadBoilerplate(doc: t.SpecT, filename: str, bpname: str | None = No...
  function addBikeshedVersion (line 40) | def addBikeshedVersion(doc: t.SpecT) -> None:
  function addCanonicalURL (line 74) | def addCanonicalURL(doc: t.SpecT) -> None:
  function addFavicon (line 80) | def addFavicon(doc: t.SpecT) -> None:
  function addSpecVersion (line 86) | def addSpecVersion(doc: t.SpecT) -> None:
  function addHeaderFooter (line 124) | def addHeaderFooter(doc: t.SpecT) -> None:
  function fillWith (line 137) | def fillWith(tag: str, newElements: t.Sequence[t.NodeT], doc: t.SpecT) -...
  function getFillContainer (line 142) | def getFillContainer(tag: str, doc: t.SpecT, default: bool = False) -> t...
  function addLogo (line 171) | def addLogo(doc: t.SpecT) -> None:
  function addCopyright (line 175) | def addCopyright(doc: t.SpecT) -> None:
  function addAbstract (line 179) | def addAbstract(doc: t.SpecT) -> None:
  function addStatusSection (line 188) | def addStatusSection(doc: t.SpecT) -> None:
  function addExpiryNotice (line 192) | def addExpiryNotice(doc: t.SpecT) -> None:
  function addObsoletionNotice (line 204) | def addObsoletionNotice(doc: t.SpecT) -> None:
  function addAtRisk (line 209) | def addAtRisk(doc: t.SpecT) -> None:
  function addStyles (line 238) | def addStyles(doc: t.SpecT) -> None:
  function addCustomBoilerplate (line 244) | def addCustomBoilerplate(doc: t.SpecT) -> None:
  function removeUnwantedBoilerplate (line 252) | def removeUnwantedBoilerplate(doc: t.SpecT) -> None:
  function w3cStylesheetInUse (line 259) | def w3cStylesheetInUse(doc: t.SpecT) -> bool:
  function addBikeshedBoilerplate (line 263) | def addBikeshedBoilerplate(doc: t.SpecT) -> None:
  function addIndexSection (line 278) | def addIndexSection(doc: t.SpecT) -> None:
  function addIndexOfLocallyDefinedTerms (line 296) | def addIndexOfLocallyDefinedTerms(doc: t.SpecT, container: t.ElementT) -...
  function disambiguator (line 339) | def disambiguator(ref: r.RefWrapper, types: set[str] | None, specs: list...
  function addExplicitIndexes (line 350) | def addExplicitIndexes(doc: t.SpecT) -> None:
  class IndexTerm (line 471) | class IndexTerm:
  function htmlFromIndexTerms (line 477) | def htmlFromIndexTerms(entries: t.Mapping[str, list[IndexTerm]]) -> t.El...
  function addIndexOfExternallyDefinedTerms (line 518) | def addIndexOfExternallyDefinedTerms(doc: t.SpecT, container: t.ElementT...
  function addPropertyIndex (line 580) | def addPropertyIndex(doc: t.SpecT) -> None:
  function addIDLSection (line 736) | def addIDLSection(doc: t.SpecT) -> None:
  function addCDDLSection (line 764) | def addCDDLSection(doc: t.SpecT) -> None:
  function addTOCSection (line 821) | def addTOCSection(doc: t.SpecT) -> None:
  function addSpecMetadataSection (line 911) | def addSpecMetadataSection(doc: t.SpecT) -> None:
  function createMdEntry (line 1112) | def createMdEntry(key: str, dirtyVals: t.Sequence[MetadataValueT], doc: ...
  function htmlFromMd (line 1152) | def htmlFromMd(md: MetadataT, otherMd: MetadataT, doc: t.SpecT) -> t.Ele...
  function addReferencesSection (line 1186) | def addReferencesSection(doc: t.SpecT) -> None:
  function addIssuesSection (line 1246) | def addIssuesSection(doc: t.SpecT) -> None:
  function formatBiblioTerm (line 1279) | def formatBiblioTerm(linkText: str) -> str:
  function addDarkmodeIndicators (line 1290) | def addDarkmodeIndicators(doc: t.SpecT) -> None:

FILE: bikeshed/caniuse/caniuse.py
  function addCanIUsePanels (line 13) | def addCanIUsePanels(doc: t.SpecT) -> list[t.ElementT]:
  function canIUsePanelFor (line 59) | def canIUsePanelFor(id: str, feature: CIUFeature, update: str) -> t.Elem...
  function browserCompatSpan (line 85) | def browserCompatSpan(support: CIUSupport) -> t.ElementT:
  function validateCanIUseURLs (line 97) | def validateCanIUseURLs(doc: t.SpecT, canIUseData: CIUData, elements: li...
  class CIUData (line 132) | class CIUData:
    method __init__ (line 133) | def __init__(self, dataFile: t.DataFileRequester) -> None:
    method hasFeature (line 144) | def hasFeature(self, featureName: str) -> bool:
    method getFeature (line 147) | def getFeature(self, featureName: str) -> CIUFeature | None:
  class CIUFeature (line 164) | class CIUFeature:
    method fromJSON (line 170) | def fromJSON(cls, data: CIUData, j: t.JSONObject) -> t.Self:
  class CIUSupport (line 182) | class CIUSupport:
    method fromJSON (line 189) | def fromJSON(cls, data: CIUData, browserName: str, unparsed: str) -> t...

FILE: bikeshed/cddl.py
  class CDDLTerm (line 13) | class CDDLTerm:
  class CDDLMarker (line 19) | class CDDLMarker(cddlparser.ast.Marker):
    method __init__ (line 33) | def __init__(self) -> None:
    method _recordDefinition (line 38) | def _recordDefinition(self, type: str, name: str, dfnFor: str | None =...
    method serializeValue (line 58) | def serializeValue(self, prefix: str, value: str, suffix: str, node: c...
    method serializeName (line 104) | def serializeName(self, name: str, node: cddlparser.ast.CDDLNode) -> str:
    method _getFor (line 180) | def _getFor(self, node: cddlparser.ast.CDDLNode) -> str | None:
  function markupCDDL (line 205) | def markupCDDL(doc: t.SpecT) -> None:
  function markupCDDLBlock (line 223) | def markupCDDLBlock(pre: t.ElementT, doc: t.SpecT) -> set[t.ElementT]:
  function combineCDDLLinkingTexts (line 289) | def combineCDDLLinkingTexts(t1: str | None, t2: str | None) -> str:

FILE: bikeshed/cli.py
  function main (line 12) | def main() -> None:
  function handleUpdate (line 526) | def handleUpdate(options: argparse.Namespace) -> None:
  function handleSpec (line 542) | def handleSpec(options: argparse.Namespace, extras: list[str]) -> None:
  function handleEchidna (line 567) | def handleEchidna(options: argparse.Namespace, extras: list[str]) -> None:
  function handleWatch (line 595) | def handleWatch(options: argparse.Namespace, extras: list[str]) -> None:
  function handleServe (line 609) | def handleServe(options: argparse.Namespace, extras: list[str]) -> None:
  function handleDebug (line 625) | def handleDebug(options: argparse.Namespace, extras: list[str]) -> None:
  function handleRefs (line 663) | def handleRefs(options: argparse.Namespace, extras: list[str]) -> None:
  function handleIssuesList (line 699) | def handleIssuesList(options: argparse.Namespace) -> None:
  function handleSource (line 710) | def handleSource(options: argparse.Namespace) -> None:
  function handleOutline (line 722) | def handleOutline(options: argparse.Namespace) -> None:
  function handleTest (line 734) | def handleTest(options: argparse.Namespace, extras: list[str]) -> None:
  function handleProfile (line 747) | def handleProfile(options: argparse.Namespace) -> None:
  function handleTemplate (line 760) | def handleTemplate(options: argparse.Namespace) -> None:
  function handleWpt (line 772) | def handleWpt(options: argparse.Namespace) -> None:

FILE: bikeshed/conditional.py
  function processConditionals (line 29) | def processConditionals(doc: t.SpecT, container: t.ElementT | None = Non...
  function evalConditions (line 61) | def evalConditions(doc: t.SpecT, el: t.ElementT, conditionString: str) -...
  class Condition (line 83) | class Condition:
  function parseConditions (line 88) | def parseConditions(s: str, el: t.ElementT | None = None) -> t.Generator...

FILE: bikeshed/config/BoolSet.py
  class BoolSet (line 8) | class BoolSet(collections.abc.MutableMapping[str, bool]):
    method __init__ (line 17) | def __init__(self, values: t.Any = None, default: bool = False) -> None:
    method __missing__ (line 27) | def __missing__(self, key: t.Any) -> bool:
    method __contains__ (line 30) | def __contains__(self, key: t.Any) -> bool:
    method __getitem__ (line 36) | def __getitem__(self, key: t.Any) -> bool:
    method __setitem__ (line 39) | def __setitem__(self, key: t.Any, val: bool) -> None:
    method __delitem__ (line 42) | def __delitem__(self, key: t.Any) -> None:
    method __iter__ (line 45) | def __iter__(self) -> t.Iterator[t.Any]:
    method __len__ (line 48) | def __len__(self) -> int:
    method __repr__ (line 51) | def __repr__(self) -> str:
    method hasExplicit (line 60) | def hasExplicit(self, key: t.Any) -> bool:
    method update (line 64) | def update(self, __other: t.SupportsKeysAndGetItem[t.Any, t.Any], **kw...
    method update (line 67) | def update(self, __other: t.Iterable[tuple[t.Any, t.Any]], **kwargs: b...
    method update (line 70) | def update(self, **kwargs: bool) -> None: ...
    method update (line 72) | def update(self, __other: t.Any = None, **kwargs: bool) -> None:

FILE: bikeshed/config/dfnTypes.py
  function adjustKey (line 143) | def adjustKey(text: str, type: str) -> tuple[str, str]:
  function linkTypeIn (line 198) | def linkTypeIn(startTypes: str | t.AbstractSet[str], targetTypes: str | ...

FILE: bikeshed/config/main.py
  function englishFromList (line 10) | def englishFromList(items: t.Iterable[str], conjunction: str = "or") -> ...
  function intersperse (line 21) | def intersperse[IterT, DelimT](
  function flatIntersperse (line 33) | def flatIntersperse[IterT, DelimT](
  function processTextNodes (line 45) | def processTextNodes(
  function reSubObject (line 64) | def reSubObject(
  function reSubObject (line 72) | def reSubObject[SubT](
  function reSubObject (line 79) | def reSubObject[SubT](
  function simplifyText (line 103) | def simplifyText(text: str) -> str:
  function splitForValues (line 117) | def splitForValues(forValues: str) -> list[str]: ...
  function splitForValues (line 121) | def splitForValues(forValues: None) -> None: ...
  function splitForValues (line 124) | def splitForValues(forValues: str | None) -> list[str] | None:
  function groupFromKey (line 136) | def groupFromKey(key: str, length: int = 2) -> str:
  function scriptPath (line 157) | def scriptPath(*pathSegs: str) -> str:
  function docPath (line 163) | def docPath(doc: t.SpecT, *pathSegs: str) -> str | None:
  function chrootPath (line 170) | def chrootPath(rootPath: str, path: str) -> str:
  function doEvery (line 182) | def doEvery(s: float, action: t.Callable[[], t.Any], lastTime: float | N...
  function safeIndex (line 204) | def safeIndex[ValT](coll: t.Sequence[ValT], needle: ValT) -> int | None:...
  function safeIndex (line 208) | def safeIndex[ValT, DefaultT](coll: t.Sequence[ValT], needle: ValT, defa...
  function safeIndex (line 211) | def safeIndex[ValT, DefaultT](

FILE: bikeshed/datablocks.py
  class TransformFuncT (line 14) | class TransformFuncT(t.Protocol):
    method __call__ (line 15) | def __call__(
  function transformDataBlocks (line 23) | def transformDataBlocks(doc: t.SpecT, tree: t.SpecT | t.ElementT) -> None:
  function transformPre (line 61) | def transformPre(data: str, el: t.ElementT, doc: t.SpecT) -> t.ElementT ...
  function transformOpaque (line 83) | def transformOpaque(data: str, el: t.ElementT, doc: t.SpecT) -> t.Elemen...
  function transformRaw (line 93) | def transformRaw(data: str, el: t.ElementT, doc: t.SpecT) -> t.ElementT ...
  function transformSimpleDef (line 100) | def transformSimpleDef(data: str, el: t.ElementT, doc: t.SpecT) -> t.Ele...
  function transformPropdef (line 114) | def transformPropdef(data: str, el: t.ElementT, doc: t.SpecT) -> t.Eleme...
  function blessList (line 203) | def blessList(items: list[str]) -> list[t.SafeHtmlStr]:
  function transformDescdef (line 207) | def transformDescdef(data: str, el: t.ElementT, doc: t.SpecT) -> t.Eleme...
  function transformElementdef (line 249) | def transformElementdef(data: str, el: t.ElementT, doc: t.SpecT) -> t.El...
  function transformArgumentdef (line 319) | def transformArgumentdef(data: str, el: t.ElementT, doc: t.SpecT) -> t.E...
  function parseDefBlock (line 376) | def parseDefBlock(
  function wrapCommaList (line 450) | def wrapCommaList(text: str, tagName: str, type: str) -> list[t.NodeT]:
  function canonicalizeAttrs (line 462) | def canonicalizeAttrs(
  function transformRailroad (line 500) | def transformRailroad(data: str, el: t.ElementT, doc: t.SpecT) -> t.Elem...
  function transformBiblio (line 518) | def transformBiblio(data: str, el: t.ElementT | None, doc: t.SpecT) -> t...
  function transformAnchors (line 527) | def transformAnchors(data: str, el: t.ElementT | None, doc: t.SpecT) -> ...
  function processAnchors (line 534) | def processAnchors(anchors: InfoTreeT, doc: t.SpecT, lineNum: int | None...
  function transformLinkDefaults (line 632) | def transformLinkDefaults(data: str, el: t.ElementT | None, doc: t.SpecT...
  function processLinkDefaults (line 639) | def processLinkDefaults(lds: InfoTreeT, doc: t.SpecT, lineNum: int | Non...
  function transformIgnoredSpecs (line 670) | def transformIgnoredSpecs(data: str, el: t.ElementT | None, doc: t.SpecT...
  function processIgnoredSpecs (line 677) | def processIgnoredSpecs(specs: InfoTreeT, doc: t.SpecT, lineNum: int | N...
  function transformInfo (line 700) | def transformInfo(data: str, el: t.ElementT | None, doc: t.SpecT) -> t.E...
  function processInfo (line 710) | def processInfo(infos: InfoTreeT, doc: t.SpecT, lineNum: int | None = No...
  function transformInclude (line 733) | def transformInclude(data: str, el: t.ElementT, doc: t.SpecT) -> t.Eleme...
  function transformIncludeCode (line 768) | def transformIncludeCode(data: str, el: t.ElementT, doc: t.SpecT) -> t.E...
  function transformIncludeRaw (line 830) | def transformIncludeRaw(data: str, el: t.ElementT, doc: t.SpecT) -> t.El...
  function parseInfoTree (line 850) | def parseInfoTree(lines: list[str], indent: int = 4, lineNum: int | None...
  function removeCommentLines (line 939) | def removeCommentLines(lines: list[str]) -> list[str]:
  function removeBlankLines (line 947) | def removeBlankLines(lines: list[str]) -> list[str]:
  function removeIndent (line 957) | def removeIndent(lines: list[str], tabSize: int) -> list[str]:

FILE: bikeshed/dfnpanels/dfn-panel.js
  function genAllDfnPanels (line 15) | function genAllDfnPanels() {
  function genDfnPanel (line 28) | function genDfnPanel(dfn, { dfnID, url, dfnText, refSections, external }) {
  function hideAllDfnPanels (line 80) | function hideAllDfnPanels() {
  function showDfnPanel (line 85) | function showDfnPanel(dfn) {
  function positionDfnPanel (line 105) | function positionDfnPanel(dfnPanel) {
  function pinDfnPanel (line 121) | function pinDfnPanel(dfnPanel) {
  function hideDfnPanel (line 129) | function hideDfnPanel({dfn, dfnPanel}) {
  function toggleDfnPanel (line 139) | function toggleDfnPanel(dfn) {
  function insertDfnPopupAction (line 147) | function insertDfnPopupAction(dfn) {
  function refocusOnTarget (line 167) | function refocusOnTarget(event) {
  function getBounds (line 178) | function getBounds(el, relativeTo=document.body) {
  function scrollToTargetAndHighlight (line 191) | function scrollToTargetAndHighlight(event) {
  function needsFor (line 207) | function needsFor(type) {
  function refusesFor (line 235) | function refusesFor(type) {
  function linkFormatterFromType (line 252) | function linkFormatterFromType(type) {
  function genLinkingSyntaxes (line 305) | function genLinkingSyntaxes(dfn) {

FILE: bikeshed/dfnpanels/dfnpanels.py
  function addDfnPanels (line 10) | def addDfnPanels(doc: t.SpecT, dfns: list[t.ElementT]) -> None:
  function addExternalDfnPanel (line 59) | def addExternalDfnPanel(termEl: t.ElementT, ref: t.RefWrapper, doc: t.Sp...

FILE: bikeshed/dfns/attributeInfo.py
  function annotateDfns (line 10) | def annotateDfns(doc: t.SpecT) -> None:
  function addAttributeInfoSpans (line 15) | def addAttributeInfoSpans(doc: t.SpecT) -> None:
  function fillAttributeInfoSpans (line 46) | def fillAttributeInfoSpans(doc: t.SpecT) -> None:
  class TargetInfo (line 60) | class TargetInfo:
  function getTargetInfo (line 67) | def getTargetInfo(doc: t.SpecT, el: t.ElementT) -> TargetInfo | None:
  function htmlFromInfo (line 109) | def htmlFromInfo(info: TargetInfo) -> list[t.NodeT]:

FILE: bikeshed/doctypes/manager.py
  class Doctype (line 12) | class Doctype:
    method __str__ (line 17) | def __str__(self) -> str:
  class DoctypeManager (line 22) | class DoctypeManager:
    method fromKdlStr (line 27) | def fromKdlStr(data: str) -> DoctypeManager:
    method getStatuses (line 41) | def getStatuses(self, name: str) -> list[Status]:
    method getStatus (line 50) | def getStatus(self, orgName: str | None, statusName: str, allowGeneric...
    method getGroups (line 66) | def getGroups(self, orgName: str | None, groupName: str) -> list[Group]:
    method getGroup (line 76) | def getGroup(self, orgName: str | None, groupName: str) -> Group | None:
    method getOrg (line 84) | def getOrg(self, orgName: str) -> Org | None:
    method getDoctype (line 87) | def getDoctype(self, orgName: str | None, groupName: str | None, statu...
  class Org (line 93) | class Org:
    method fromKdlNode (line 99) | def fromKdlNode(node: kdl.Node) -> Org:
    method __bool__ (line 110) | def __bool__(self) -> bool:
  class Group (line 118) | class Group:
    method fullName (line 125) | def fullName(self) -> str:
    method fromKdlNode (line 132) | def fromKdlNode(node: kdl.Node, org: Org) -> Group:
    method __bool__ (line 144) | def __bool__(self) -> bool:
  class Status (line 152) | class Status:
    method fullName (line 159) | def fullName(self) -> str:
    method looselyMatch (line 165) | def looselyMatch(self, rawStatus: str) -> bool:
    method fromKdlNode (line 174) | def fromKdlNode(node: kdl.Node, org: Org | None = None) -> Status:
    method __bool__ (line 186) | def __bool__(self) -> bool:

FILE: bikeshed/doctypes/utils.py
  function canonicalize (line 10) | def canonicalize(
  function splitOrg (line 159) | def splitOrg(st: str | None) -> tuple[str | None, str | None]:
  function reconcileOrgs (line 170) | def reconcileOrgs(fromRaw: str | None, fromStatus: str | None, fromGroup...
  function validateW3CStatus (line 203) | def validateW3CStatus(status: Status) -> None:

FILE: bikeshed/extensions.py
  function load (line 6) | def load(doc: t.SpecT) -> None:

FILE: bikeshed/fingerprinting.py
  function addTrackingVector (line 8) | def addTrackingVector(doc: t.SpecT) -> None:
  function trackingVectorImage (line 62) | def trackingVectorImage(

FILE: bikeshed/fonts/fonts.py
  class Font (line 25) | class Font:
    method __init__ (line 29) | def __init__(self, glyphs: Glyphs, md: FontMetadata) -> None:
    method fromPath (line 37) | def fromPath(fontfilepath: str | Path) -> Font:
    method fromKdl (line 47) | def fromKdl(kdlText: str) -> Font:
    method write (line 64) | def write(self, text: str) -> list[str]:
  class Glyph (line 81) | class Glyph:
    method height (line 87) | def height(self) -> int:
    method fromKdl (line 91) | def fromKdl(node: kdl.Node) -> Glyph:
  class FontMetadata (line 135) | class FontMetadata:
  class PartialFontMetadata (line 140) | class PartialFontMetadata:
    method inferFromGlyphs (line 143) | def inferFromGlyphs(self, glyphs: Glyphs) -> FontMetadata:
  function normalizeCharacters (line 149) | def normalizeCharacters(glyphs: Glyphs, md: FontMetadata) -> Glyphs:
  function getMetadata (line 172) | def getMetadata(doc: kdl.Document) -> PartialFontMetadata:
  function inferHeight (line 180) | def inferHeight(glyphs: Glyphs) -> int:
  function main (line 186) | def main() -> None:

FILE: bikeshed/fonts/rewrite.py
  function replaceComments (line 14) | def replaceComments(font: Font, inputFilename: str | None = None, output...
  function getInputLines (line 41) | def getInputLines(inputFilename: str | None) -> tuple[list[str], str]:
  function writeOutputLines (line 67) | def writeOutputLines(outputFilename: str | None, inputFilename: str, lin...

FILE: bikeshed/func.py
  class Functor (line 6) | class Functor:
    method __init__ (line 9) | def __init__(self, val: t.Any) -> None:
    method extract (line 12) | def extract(self) -> t.Any:
    method map (line 15) | def map(self, fn: t.Any) -> t.Any:

FILE: bikeshed/h/dom.py
  function unescape (line 22) | def unescape(string: str) -> str:
  function findAll (line 26) | def findAll(sel: str, context: t.SpecT | t.ElementT) -> list[t.ElementT]:
  function find (line 38) | def find(sel: str, context: t.SpecT | t.ElementT) -> t.ElementT | None:
  function escapeCSSIdent (line 46) | def escapeCSSIdent(val: str) -> str:
  function escapeUrlFrag (line 72) | def escapeUrlFrag(val: str) -> str:
  function validUrlUnit (line 83) | def validUrlUnit(char: str) -> bool:
  function textContent (line 106) | def textContent(el: t.ElementT, exact: bool = False) -> str:
  function textContentIgnoringDecorative (line 118) | def textContentIgnoringDecorative(el: t.ElementT) -> str:
  function innerHTML (line 128) | def innerHTML(el: t.ElementT | None) -> str:
  function outerHTML (line 134) | def outerHTML(el: t.NodeT | None, literal: bool = False, with_tail: bool...
  function printNodeTree (line 144) | def printNodeTree(node: t.NodeT | str, maxDepth: int | None = None, dept...
  function linkTextsFromElement (line 188) | def linkTextsFromElement(el: t.ElementT) -> list[str]:
  class DuplicatedLinkText (line 218) | class DuplicatedLinkText(Exception):
    method __init__ (line 219) | def __init__(self, offendingText: str, allTexts: list[str], el: t.Elem...
    method __unicode__ (line 225) | def __unicode__(self) -> str:
  function firstLinkTextFromElement (line 229) | def firstLinkTextFromElement(el: t.ElementT) -> str | None:
  function serializeTag (line 237) | def serializeTag(el: t.ElementT, includeBs: bool = False, shortenAttrs: ...
  function tagName (line 255) | def tagName(el: t.ElementT | None) -> str | None:
  function foldWhitespace (line 263) | def foldWhitespace(text: str) -> str:
  function sortElements (line 267) | def sortElements(el: t.Iterable[t.ElementT]) -> list[t.ElementT]:
  function safeHtml (line 271) | def safeHtml(
  function safeBikeshedHtml (line 282) | def safeBikeshedHtml(
  function parseHTML (line 291) | def parseHTML(text: t.SafeHtmlStr) -> list[t.NodeT]:
  function parseElements (line 297) | def parseElements(text: t.SafeHtmlStr) -> list[t.ElementT]:
  function parseInto (line 303) | def parseInto(container: t.ElementT, text: t.SafeHtmlStr, allowEmpty: bo...
  function parseDocument (line 309) | def parseDocument(
  function escapeHTML (line 354) | def escapeHTML(text: str) -> str:
  function escapeAttr (line 359) | def escapeAttr(text: str) -> str:
  function clearContents (line 363) | def clearContents(el: t.ElementT) -> t.ElementT:
  function parentElement (line 369) | def parentElement(el: t.ElementT | None, depth: int = 1) -> t.ElementT |...
  function nextSiblingNode (line 377) | def nextSiblingNode(el: t.ElementT) -> t.ElementT | None:
  function nextSiblingElement (line 381) | def nextSiblingElement(el: t.ElementT) -> t.ElementT | None:
  function appendChild (line 391) | def appendChild(parent: t.ElementT, *els: t.NodeT, allowEmpty: t.Literal...
  function appendChild (line 395) | def appendChild(parent: t.ElementT, *els: t.NodeT, allowEmpty: bool) -> ...
  function appendChild (line 398) | def appendChild(parent: t.ElementT, *children: t.NodeT, allowEmpty: bool...
  function prependChild (line 429) | def prependChild(parent: t.ElementT, *children: t.NodeT) -> None:
  function insertBefore (line 445) | def insertBefore(target: t.ElementT, *els: t.NodeT) -> t.ElementT:
  function insertAfter (line 463) | def insertAfter(target: t.ElementT, *els: t.NodeT) -> t.ElementT:
  function removeNode (line 475) | def removeNode(node: t.ElementT) -> t.ElementT:
  function replaceNode (line 495) | def replaceNode(node: t.ElementT, *replacements: t.NodeT) -> t.NodeT | N...
  function transferAttributes (line 506) | def transferAttributes(source: t.ElementT, target: t.ElementT) -> t.Elem...
  function appendContents (line 512) | def appendContents(el: t.ElementT, container: t.ElementT | t.NodeListT) ...
  function replaceContents (line 520) | def replaceContents(el: t.ElementT, newElements: t.ElementT | t.NodeList...
  function replaceWithContents (line 525) | def replaceWithContents(el: t.ElementT) -> t.NodeT | None:
  function moveContents (line 529) | def moveContents(toEl: t.ElementT, fromEl: t.ElementT) -> None:
  function wrapContents (line 534) | def wrapContents(parentEl: t.ElementT, wrapperEl: t.ElementT) -> t.Eleme...
  function headingLevelOfElement (line 540) | def headingLevelOfElement(el: t.ElementT) -> str | None:
  function relevantHeadings (line 547) | def relevantHeadings(startEl: t.ElementT, levels: list[int] | None = Non...
  function sectionName (line 561) | def sectionName(doc: t.SpecT, el: t.ElementT) -> str | None:
  function collectLinksWithSectionNames (line 575) | def collectLinksWithSectionNames(
  function scopingElements (line 600) | def scopingElements(startEl: t.ElementT, tags: list[str]) -> t.Generator...
  function previousElements (line 617) | def previousElements(startEl: t.ElementT, tag: str | None = None, *tags:...
  function childElements (line 628) | def childElements(parentEl: t.ElementT, oddNodes: bool = False) -> t.Gen...
  function siblingElements (line 633) | def siblingElements(el: t.ElementT, preceding: bool = False) -> t.Iterab...
  function ancestorElements (line 637) | def ancestorElements(el: t.ElementT, self: bool = False) -> t.Generator[...
  function childNodes (line 643) | def childNodes(
  function nodeIter (line 705) | def nodeIter(el: t.ElementT, clear: bool = False, skipOddNodes: bool = T...
  function treeAttr (line 733) | def treeAttr(el: t.ElementT, attrName: str) -> str | None:
  function closestAttr (line 744) | def closestAttr(el: t.ElementT, *attrs: str) -> tuple[str, str] | tuple[...
  function closestAncestor (line 757) | def closestAncestor(el: t.ElementT, pred: ElementPredT) -> t.ElementT | ...
  function filterAncestors (line 765) | def filterAncestors(el: t.ElementT, pred: ElementPredT) -> t.Generator[t...
  function hasAncestor (line 772) | def hasAncestor(el: t.ElementT, pred: ElementPredT) -> bool:
  function removeAttr (line 776) | def removeAttr(el: t.ElementT, *attrNames: str) -> t.ElementT:
  function renameAttr (line 784) | def renameAttr(el: t.ElementT, oldAttr: str, newAttr: str) -> t.ElementT:
  function hasAnyAttr (line 794) | def hasAnyAttr(el: t.ElementT, *attrNames: str) -> bool:
  function hasAttr (line 799) | def hasAttr(el: t.ElementT, attrName: str) -> bool:
  function hasAttrs (line 803) | def hasAttrs(el: t.ElementT) -> bool:
  function addClass (line 807) | def addClass(doc: t.SpecT, el: t.ElementT, cls: str) -> t.ElementT:
  function hasClass (line 817) | def hasClass(doc: t.SpecT, el: t.ElementT, cls: str) -> bool:
  function removeClass (line 833) | def removeClass(el: t.ElementT, cls: str) -> t.ElementT:
  function isElement (line 845) | def isElement(node: t.Any) -> t.TypeIs[t.ElementT]:
  function isNode (line 850) | def isNode(node: t.Any) -> t.TypeIs[t.NodeT]:
  function isOddNode (line 854) | def isOddNode(node: t.Any) -> bool:
  function isNormative (line 863) | def isNormative(doc: t.SpecT, el: t.ElementT) -> bool:
  function isEmpty (line 893) | def isEmpty(el: t.ElementT) -> bool:
  function hasChildElements (line 898) | def hasChildElements(el: t.ElementT) -> bool:
  function hasOnlyChild (line 908) | def hasOnlyChild(el: t.ElementT, wsAllowed: bool = True) -> t.ElementT |...
  function isOnlyChild (line 926) | def isOnlyChild(el: t.ElementT, wsAllowed: bool = True) -> bool:
  function fixSurroundingTypography (line 933) | def fixSurroundingTypography(el: t.ElementT) -> t.ElementT:
  function unfixTypography (line 941) | def unfixTypography(text: str) -> str:
  function emptyText (line 949) | def emptyText(text: str | None, wsAllowed: bool = True) -> bool:
  function hashContents (line 960) | def hashContents(el: t.ElementT) -> str:
  function replaceMacrosTextly (line 968) | def replaceMacrosTextly(text: str, macros: t.Mapping[str, str], context:...
  function fixupIDs (line 998) | def fixupIDs(doc: t.SpecT, els: t.Iterable[t.ElementT]) -> None:
  function safeID (line 1003) | def safeID(doc: t.SpecT, id: str) -> str:
  function uniqueID (line 1012) | def uniqueID(*s: str) -> str:
  function addOldIDs (line 1018) | def addOldIDs(els: t.Iterable[t.ElementT]) -> None:
  function dedupIDs (line 1029) | def dedupIDs(doc: t.SpecT) -> None:
  function approximateLineNumber (line 1074) | def approximateLineNumber(el: t.ElementT, setIntermediate: bool = True) ...
  function parseLineNumber (line 1090) | def parseLineNumber(el: t.ElementT) -> int | None:
  function circledDigits (line 1105) | def circledDigits(num: int) -> str:
  function collectIds (line 1116) | def collectIds(el: t.ElementT, ids: dict[str, t.ElementT] | None = None)...
  function collectAutolinks (line 1127) | def collectAutolinks(el: t.ElementT, links: list[t.ElementT] | None = No...
  function collectSyntaxHighlightables (line 1139) | def collectSyntaxHighlightables(el: t.ElementT, els: list[t.ElementT] | ...
  function createElement (line 1149) | def createElement(
  class ElementCreatorFnT (line 1164) | class ElementCreatorFnT(t.Protocol):
    method __call__ (line 1165) | def __call__(
  class ElementCreationHelper (line 1172) | class ElementCreationHelper:
    method __getattr__ (line 1173) | def __getattr__(self, name: str) -> ElementCreatorFnT:

FILE: bikeshed/h/merge.py
  class Tag (line 16) | class Tag(metaclass=abc.ABCMeta):
  class TagStart (line 21) | class TagStart(Tag):
  class TagEnd (line 27) | class TagEnd(Tag):
  class TagStr (line 33) | class TagStr(Tag):
  function mergeTrees (line 41) | def mergeTrees(tree1: t.ElementT, tree2: t.ElementT) -> list[t.NodeT]:
  function digestTree (line 67) | def digestTree(root: t.ElementT, nested: bool = False) -> TagStream:
  function textLength (line 87) | def textLength(el: t.ElementT) -> int:
  function mergeStreams (line 97) | def mergeStreams(s1: TagStream, s2: TagStream) -> TagStream:

FILE: bikeshed/h/parser/main.py
  function nodesFromHtml (line 27) | def nodesFromHtml(
  function initialDocumentParse (line 42) | def initialDocumentParse(
  function strFromNodes (line 60) | def strFromNodes(nodes: t.Iterable[ParserNode], withIlcc: bool = False) ...
  function linesFromNodes (line 83) | def linesFromNodes(nodes: t.Iterable[ParserNode]) -> list[t.EarlyParsedH...
  function debugNodes (line 87) | def debugNodes(nodes: t.Iterable[ParserNode]) -> list[ParserNode]:
  function parseLines (line 95) | def parseLines(
  function parseText (line 120) | def parseText(
  function parseTitle (line 133) | def parseTitle(

FILE: bikeshed/h/parser/nodes.py
  function startTagStr (line 20) | def startTagStr(tagName: str, attrs: t.SafeAttrDict) -> str:
  function sortAttrs (line 34) | def sortAttrs(attrs: t.SafeAttrDict) -> t.Iterator[tuple[str, str]]:
  function startTagStrFromNode (line 45) | def startTagStrFromNode(node: StartTag | SelfClosedTag) -> str:
  class ParserNode (line 56) | class ParserNode(metaclass=ABCMeta):
    method height (line 64) | def height(self) -> int:
    method __str__ (line 68) | def __str__(self) -> str:
  class Text (line 73) | class Text(ParserNode, metaclass=ABCMeta):
  class RawText (line 78) | class RawText(Text):
    method __str__ (line 81) | def __str__(self) -> str:
    method fromStream (line 85) | def fromStream(cls, s: Stream, start: int, end: int, text: str | None ...
    method fromSafeText (line 96) | def fromSafeText(cls, node: SafeText) -> t.Self:
    method curlifyApostrophes (line 106) | def curlifyApostrophes(self, lastNode: ParserNode | None) -> RawText:
    method needsLCCs (line 118) | def needsLCCs(self) -> bool:
  class SafeText (line 127) | class SafeText(Text):
    method __str__ (line 130) | def __str__(self) -> str:
    method fromStream (line 134) | def fromStream(cls, s: Stream, start: int, end: int, text: str | None ...
  class Doctype (line 146) | class Doctype(ParserNode):
    method __str__ (line 149) | def __str__(self) -> str:
    method fromStream (line 153) | def fromStream(cls, s: Stream, start: int, end: int, data: str) -> t.S...
  class StartTag (line 165) | class StartTag(ParserNode):
    method fromStream (line 172) | def fromStream(
    method __str__ (line 192) | def __str__(self) -> str:
    method printEndTag (line 195) | def printEndTag(self) -> str:
    method finalize (line 198) | def finalize(self) -> StartTag:
    method clone (line 204) | def clone(self, **kwargs: t.Any) -> StartTag:
  class SelfClosedTag (line 209) | class SelfClosedTag(ParserNode):
    method fromStream (line 215) | def fromStream(
    method fromStartTag (line 236) | def fromStartTag(cls, tag: StartTag) -> t.Self:
    method __str__ (line 248) | def __str__(self) -> str:
    method finalize (line 273) | def finalize(self) -> SelfClosedTag:
    method clone (line 279) | def clone(self, **kwargs: t.Any) -> SelfClosedTag:
  class EndTag (line 284) | class EndTag(ParserNode):
    method fromStream (line 289) | def fromStream(cls, s: Stream, start: int, end: int, tag: str | StartT...
    method __str__ (line 303) | def __str__(self) -> str:
  class Comment (line 308) | class Comment(ParserNode):
    method fromStream (line 312) | def fromStream(cls, s: Stream, start: int, end: int, data: str) -> t.S...
    method __str__ (line 322) | def __str__(self) -> str:
  class RawElement (line 331) | class RawElement(ParserNode):
    method fromStream (line 337) | def fromStream(cls, s: Stream, start: int, end: int, startTag: StartTa...
    method __str__ (line 349) | def __str__(self) -> str:
  class SafeElement (line 358) | class SafeElement(ParserNode):
    method fromStream (line 364) | def fromStream(cls, s: Stream, start: int, end: int, startTag: StartTa...
    method __str__ (line 376) | def __str__(self) -> str:
  function escapeHTML (line 380) | def escapeHTML(text: str) -> str:
  function escapeAttr (line 385) | def escapeAttr(text: str) -> t.SafeAttrStr:
  function minimalEscapeAttr (line 389) | def minimalEscapeAttr(text: str) -> t.SafeAttrStr:
  function unescapeAttr (line 393) | def unescapeAttr(text: t.SafeAttrStr | t.EmptyLiteralStr) -> str:
  class TagStack (line 398) | class TagStack:
    method printOpenTags (line 404) | def printOpenTags(self) -> list[str]:
    method inOpaqueElement (line 407) | def inOpaqueElement(self) -> bool:
    method inTagContext (line 410) | def inTagContext(self, tagName: str, stopTags: list[str] | None = None...
    method getDeepestFromTag (line 424) | def getDeepestFromTag(self, tagName: str) -> TagStackEntry | None:
    method pushEntry (line 430) | def pushEntry(self, entry: TagStackEntry) -> None:
    method popEntry (line 436) | def popEntry(self) -> TagStackEntry:
    method undo (line 443) | def undo(self, startTag: StartTag) -> None:
    method update (line 453) | def update(self, node: ParserNode) -> None:
    method updateShorthandOpen (line 515) | def updateShorthandOpen(self, startTag: StartTag, sigils: tuple[str, s...
    method updateShorthandClose (line 518) | def updateShorthandClose(
    method cancelShorthandOpen (line 541) | def cancelShorthandOpen(self, startTag: StartTag, sigils: tuple[str, s...
    method autoCloseStart (line 553) | def autoCloseStart(self, tag: str, node: ParserNode) -> None:
    method autoCloseEnd (line 640) | def autoCloseEnd(self, tag: str, node: ParserNode) -> None:
    method virtualClose (line 718) | def virtualClose(
    method virtualCloseUntil (line 743) | def virtualCloseUntil(self, tags: list[str], node: ParserNode, realEnd...
    method virtualCloseShorthand (line 772) | def virtualCloseShorthand(self, s: Stream, i: int, startTag: StartTag)...
    method nearestHeading (line 786) | def nearestHeading(self) -> TagStackEntry | None:
    method verifyTagContext (line 792) | def verifyTagContext(self, node: StartTag) -> None:
  class TagStackEntry (line 822) | class TagStackEntry:
    method __post_init__ (line 827) | def __post_init__(self, opaqueTags: set[str]) -> None:
    method name (line 839) | def name(self) -> str:
  class TagStackShorthandEntry (line 844) | class TagStackShorthandEntry(TagStackEntry):
    method name (line 848) | def name(self) -> str:

FILE: bikeshed/h/parser/parser.py
  function nodesFromStream (line 64) | def nodesFromStream(s: Stream, start: int) -> t.Generator[ParserNode, No...
  function closeOpenElements (line 101) | def closeOpenElements(s: Stream, start: int | None, context: str | Start...
  function generateNodes (line 146) | def generateNodes(s: Stream, start: int) -> t.Generator[ParserNode, None...
  function debugNode (line 160) | def debugNode(node: ParserNode | list[ParserNode]) -> str:
  function generateResults (line 176) | def generateResults(
  function generateExperimentalNodes (line 194) | def generateExperimentalNodes(s: Stream, start: int, coll: list[ParserNo...
  function parseAnything (line 209) | def parseAnything(s: Stream, start: int, experimental: bool = False) -> ...
  function parseNode (line 239) | def parseNode(
  function parseLToEnd (line 489) | def parseLToEnd(s: Stream, start: int, lTag: StartTag) -> ResultT[Parser...
  function parseRepositoryLink (line 566) | def parseRepositoryLink(
  function parseRepositoryStart (line 616) | def parseRepositoryStart(s: Stream, start: int) -> ResultT[tuple[str, st...
  function parseDigits (line 629) | def parseDigits(s: Stream, start: int) -> ResultT[str]:
  function parseAngleStart (line 642) | def parseAngleStart(s: Stream, start: int) -> ResultT[ParserNode | list[...
  function isDatablock (line 773) | def isDatablock(tag: StartTag, loc: str) -> str | None:
  function isDatablockClass (line 791) | def isDatablockClass(text: str) -> bool:
  function smuggleDatablock (line 811) | def smuggleDatablock(el: RawElement | SafeElement, text: str, blockType:...
  function parseStartTag (line 837) | def parseStartTag(s: Stream, start: int) -> ResultT[StartTag | SelfClose...
  function parseTagName (line 913) | def parseTagName(s: Stream, start: int) -> ResultT[str]:
  function parseAttributeList (line 922) | def parseAttributeList(s: Stream, start: int) -> ResultT[dict[str, str]]:
  function parseAttribute (line 983) | def parseAttribute(s: Stream, start: int) -> ResultT[tuple[str, str]]:
  function parseQuotedAttrValue (line 1015) | def parseQuotedAttrValue(s: Stream, start: int) -> ResultT[str]:
  function parseUnquotedAttrValue (line 1043) | def parseUnquotedAttrValue(s: Stream, start: int) -> ResultT[str]:
  function printChAsCharRef (line 1072) | def printChAsCharRef(ch: str | SafeText) -> str:
  class CharRefContext (line 1087) | class CharRefContext(Enum):
  function parseCharRef (line 1093) | def parseCharRef(s: Stream, start: int, context: CharRefContext) -> Resu...
  function parseWhitespace (line 1198) | def parseWhitespace(s: Stream, start: int) -> ResultT[bool]:
  function parseEndTag (line 1208) | def parseEndTag(s: Stream, start: int) -> ResultT[EndTag]:
  function parseComment (line 1238) | def parseComment(s: Stream, start: int) -> ResultT[Comment]:
  function parseDoctype (line 1269) | def parseDoctype(s: Stream, start: int) -> ResultT[Doctype]:
  function parseScriptToEnd (line 1280) | def parseScriptToEnd(s: Stream, start: int) -> OkT[str]:
  function parseStyleToEnd (line 1298) | def parseStyleToEnd(s: Stream, start: int) -> OkT[str]:
  function parseXmpToEnd (line 1314) | def parseXmpToEnd(s: Stream, start: int) -> OkT[str]:
  function parseTitleToEnd (line 1330) | def parseTitleToEnd(s: Stream, start: int) -> ResultT[str]:
  function parseDatablockPreToEnd (line 1366) | def parseDatablockPreToEnd(s: Stream, start: int) -> ResultT[str]:
  function parseOpaqueToEnd (line 1395) | def parseOpaqueToEnd(s: Stream, dataStart: int, startTag: StartTag, star...
  function parseCSSProduction (line 1478) | def parseCSSProduction(s: Stream, start: int) -> ResultT[ParserNode | li...
  function parseRangeComponent (line 1617) | def parseRangeComponent(s: Stream, i: int, val: str) -> tuple[str | None...
  function parseCSSMaybe (line 1648) | def parseCSSMaybe(s: Stream, start: int) -> ResultT[list[ParserNode]]:
  function parseMaybeDecl (line 1667) | def parseMaybeDecl(s: Stream, textStart: int) -> ResultT[list[ParserNode]]:
  function parseMaybeValue (line 1727) | def parseMaybeValue(s: Stream, textStart: int) -> ResultT[list[ParserNod...
  function rawFromDoubleAngles (line 1846) | def rawFromDoubleAngles(text: str) -> str:
  function safeFromDoubleAngles (line 1855) | def safeFromDoubleAngles(text: str) -> str:
  function parseCSSPropdesc (line 1871) | def parseCSSPropdesc(s: Stream, start: int) -> ResultT[SafeText | list[P...
  function parseAutolinkDfn (line 1971) | def parseAutolinkDfn(s: Stream, start: int) -> ResultT[SafeText | list[P...
  function parseAutolinkAbstract (line 2024) | def parseAutolinkAbstract(s: Stream, start: int) -> ResultT[SafeText | l...
  function parseAutolinkHeader (line 2077) | def parseAutolinkHeader(s: Stream, start: int) -> ResultT[SafeText | lis...
  function parseAutolinkIdl (line 2137) | def parseAutolinkIdl(s: Stream, start: int) -> ResultT[ParserNode | list...
  function parseAutolinkCddl (line 2217) | def parseAutolinkCddl(s: Stream, start: int) -> ResultT[ParserNode | lis...
  function parseAutolinkElement (line 2282) | def parseAutolinkElement(s: Stream, start: int) -> ResultT[ParserNode | ...
  function parseShorthandVariable (line 2344) | def parseShorthandVariable(s: Stream, start: int) -> ResultT[ParserNode ...
  function parseAutolinkBiblioSection (line 2361) | def parseAutolinkBiblioSection(s: Stream, start: int) -> ResultT[ParserN...
  class LinkData (line 2405) | class LinkData:
  function parseLinkInfo (line 2411) | def parseLinkInfo(
  function parseLinkText (line 2473) | def parseLinkText(
  function parseBiblioInner (line 2515) | def parseBiblioInner(s: Stream, innerStart: int) -> ResultT[tuple[StartT...
  function parseSectionInner (line 2590) | def parseSectionInner(s: Stream, innerStart: int) -> ResultT[tuple[Start...
  function parseCodeSpan (line 2645) | def parseCodeSpan(s: Stream, start: int) -> ResultT[list[ParserNode]]:
  function parseFencedCodeBlock (line 2690) | def parseFencedCodeBlock(s: Stream, start: int) -> ResultT[SafeElement]:
  class MacroContext (line 2760) | class MacroContext(Enum):
  function parseMacro (line 2766) | def parseMacro(
  function parseMacroToNodes (line 2851) | def parseMacroToNodes(s: Stream, start: int) -> ResultT[ParserNode | lis...
  function parseMacroToAttrs (line 2855) | def parseMacroToAttrs(s: Stream, start: int) -> ResultT[dict[str, str]]:
  function parseMacroToText (line 2859) | def parseMacroToText(s: Stream, start: int) -> ResultT[str]:
  function replaceMacrosInText (line 2868) | def replaceMacrosInText(text: str, macros: dict[str, str], s: Stream, st...
  function isMetadataBlock (line 2921) | def isMetadataBlock(startTag: StartTag) -> bool:
  function parseMetadataBlockToEnd (line 2932) | def parseMetadataBlockToEnd(s: Stream, start: int, startTag: StartTag, i...
  function isMacroStart (line 2972) | def isMacroStart(s: Stream, start: int) -> bool:
  function parseMarkdownLink (line 2982) | def parseMarkdownLink(s: Stream, start: int) -> ResultT[ParserNode | lis...
  function parseMarkdownLinkDestTitle (line 3028) | def parseMarkdownLinkDestTitle(s: Stream, start: int) -> ResultT[tuple[s...
  function parseMarkdownLinkWhitespace (line 3087) | def parseMarkdownLinkWhitespace(s: Stream, start: int) -> ResultT[str]:
  function parseMarkdownLinkAngleDest (line 3104) | def parseMarkdownLinkAngleDest(s: Stream, start: int) -> ResultT[str]:
  function parseMarkdownLinkIdentDest (line 3151) | def parseMarkdownLinkIdentDest(s: Stream, start: int) -> ResultT[str]:
  function parseMarkdownLinkTitle (line 3205) | def parseMarkdownLinkTitle(s: Stream, start: int, startChar: str) -> Res...
  function parseMarkdownEscape (line 3259) | def parseMarkdownEscape(s: Stream, start: int) -> ResultT[str]:
  function isMarkdownEscape (line 3267) | def isMarkdownEscape(s: Stream, start: int) -> bool:
  function htmlifyMarkdownEscapes (line 3307) | def htmlifyMarkdownEscapes(val: str) -> str:
  function markdownEscapeReplacer (line 3311) | def markdownEscapeReplacer(match: t.Match) -> str:

FILE: bikeshed/h/parser/preds.py
  function isXMLishTagname (line 225) | def isXMLishTagname(tagname: str) -> bool:
  function isTagnameChar (line 229) | def isTagnameChar(ch: str) -> bool:
  function isAttrNameChar (line 256) | def isAttrNameChar(ch: str) -> bool:
  function isASCII (line 270) | def isASCII(ch: str) -> bool:
  function isASCIIAlphanum (line 277) | def isASCIIAlphanum(ch: str) -> bool:
  function isASCIIAlpha (line 281) | def isASCIIAlpha(ch: str) -> bool:
  function isASCIILowerAlpha (line 285) | def isASCIILowerAlpha(ch: str) -> bool:
  function isASCIIUpperAlpha (line 291) | def isASCIIUpperAlpha(ch: str) -> bool:
  function isDigit (line 297) | def isDigit(ch: str) -> bool:
  function isHexDigit (line 303) | def isHexDigit(ch: str) -> bool:
  function isWhitespace (line 309) | def isWhitespace(ch: str | int) -> bool:
  function isControl (line 319) | def isControl(ch: str | int) -> bool:
  function isNoncharacter (line 329) | def isNoncharacter(ch: str | int) -> bool:

FILE: bikeshed/h/parser/result.py
  function Ok (line 11) | def Ok[U](val: U, index: int) -> OkT[U]:
  function Err (line 15) | def Err(index: int) -> ErrT:
  function isOk (line 19) | def isOk[U](res: ResultT[U]) -> t.TypeIs[OkT[U]]:
  function isErr (line 23) | def isErr(res: ResultT[t.Any]) -> t.TypeIs[ErrT]:

FILE: bikeshed/h/parser/simpleparser.py
  function parseDocument (line 16) | def parseDocument(text: str) -> tuple[t.ElementT, t.ElementT, t.ElementT]:
  function parseFragment (line 21) | def parseFragment(text: str) -> t.ElementT:
  function parse (line 63) | def parse(s: SimpleStream, start: int) -> tuple[t.ElementT, t.ElementT, ...
  function parseDoctype (line 90) | def parseDoctype(s: SimpleStream, start: int) -> int:
  function parseStartTag (line 97) | def parseStartTag(s: SimpleStream, start: int) -> int:
  function parseEndTag (line 122) | def parseEndTag(s: SimpleStream, start: int) -> int:
  function parseAttributeList (line 132) | def parseAttributeList(s: SimpleStream, start: int) -> tuple[dict[str, s...
  function undoLineBreakSmuggling (line 148) | def undoLineBreakSmuggling(attrs: dict[str, str]) -> None:
  function parseAttribute (line 155) | def parseAttribute(s: SimpleStream, start: int) -> tuple[str, str, int]:
  function parseEscape (line 180) | def parseEscape(s: SimpleStream, start: int) -> tuple[str, int]:
  class SimpleStream (line 227) | class SimpleStream:
    method __init__ (line 237) | def __init__(self, text: str) -> None:
    method __getitem__ (line 249) | def __getitem__(self, key: int) -> str:
    method slice (line 254) | def slice(self, start: int, end: int) -> str:
    method eof (line 257) | def eof(self, i: int) -> bool:
    method finish (line 260) | def finish(self) -> tuple[t.ElementT, t.ElementT, t.ElementT]:
    method startTag (line 276) | def startTag(self, tagName: str, attrs: dict[str, str]) -> None:
    method endTag (line 304) | def endTag(self, tagName: str) -> None:
    method selfClosedTag (line 329) | def selfClosedTag(self, tagName: str, attrs: dict[str, str]) -> None:
    method characters (line 333) | def characters(self, chars: str) -> None:
    method pushEl (line 338) | def pushEl(self, tagName: str) -> None:
    method popEl (line 341) | def popEl(self) -> None:
    method startBody (line 344) | def startBody(self) -> None:
    method autoCloseAll (line 352) | def autoCloseAll(self) -> None:
    method autoCloseEnd (line 358) | def autoCloseEnd(self, tagName: str) -> None:
    method autoCloseStart (line 364) | def autoCloseStart(self, tagName: str) -> None:
    method virtualClose (line 440) | def virtualClose(self, tags: list[str] | set[str], scopes: list[str] |...
  function applyAttrs (line 459) | def applyAttrs(el: t.ElementT, attrList: list[dict[str, str]]) -> t.Elem...

FILE: bikeshed/h/parser/stream.py
  class ParseConfig (line 17) | class ParseConfig:
    method fromSpec (line 36) | def fromSpec(doc: t.SpecT, context: str | None = None) -> ParseConfig:
  class Stream (line 61) | class Stream:
    method __init__ (line 70) | def __init__(self, chars: str, config: ParseConfig, startLine: int = 1...
    method subStream (line 85) | def subStream(self, context: str, chars: str, startLine: int = 1) -> S...
    method __getitem__ (line 89) | def __getitem__(self, key: int) -> str:
    method slice (line 94) | def slice(self, start: int | None, stop: int | None) -> str:
    method eof (line 101) | def eof(self, index: int) -> bool:
    method __len__ (line 104) | def __len__(self) -> int:
    method context (line 108) | def context(self) -> str | None:
    method line (line 111) | def line(self, index: int) -> int:
    method col (line 116) | def col(self, index: int) -> int:
    method loc (line 123) | def loc(self, index: int) -> str:
    method skipTo (line 129) | def skipTo(self, start: int, text: str) -> ResultT[str]:
    method skipToSameLine (line 143) | def skipToSameLine(self, start: int, text: str) -> ResultT[str]:
    method matchRe (line 154) | def matchRe(self, start: int, pattern: t.Pattern) -> ResultT[t.Match]:
    method searchRe (line 161) | def searchRe(self, start: int, pattern: t.Pattern) -> ResultT[t.Match]:
    method skipToNextLine (line 168) | def skipToNextLine(self, start: int) -> OkT[str]:
    method precedingLinebreakIndex (line 174) | def precedingLinebreakIndex(self, start: int) -> int:
    method followingLinebreakIndex (line 179) | def followingLinebreakIndex(self, start: int) -> int:
    method currentLineStart (line 185) | def currentLineStart(self, start: int) -> int:
    method nextLineStart (line 193) | def nextLineStart(self, start: int) -> int:
    method precedingTextOnLine (line 202) | def precedingTextOnLine(self, start: int) -> str:
    method remainingTextOnLine (line 206) | def remainingTextOnLine(self, start: int) -> str:
    method observeResult (line 211) | def observeResult(self, res: ResultT[ParserNode | list[ParserNode]]) -...
    method observeNode (line 219) | def observeNode(self, node: ParserNode) -> None:
    method observeNodes (line 222) | def observeNodes(self, nodes: list[ParserNode]) -> None:
    method observeShorthandOpen (line 226) | def observeShorthandOpen(self, startTag: StartTag, sigils: tuple[str, ...
    method observeShorthandClose (line 229) | def observeShorthandClose(self, s: Stream, i: int, startTag: StartTag,...
    method cancelShorthandOpen (line 232) | def cancelShorthandOpen(self, startTag: StartTag, sigils: tuple[str, s...
    method inOpaqueElement (line 235) | def inOpaqueElement(self) -> bool:
    method inTagContext (line 238) | def inTagContext(self, tagName: str) -> bool:

FILE: bikeshed/h/serializer.py
  class Serializer (line 17) | class Serializer:
    method __init__ (line 95) | def __init__(self, opaqueElements: t.Iterable[str], blockElements: t.I...
    method serialize (line 99) | def serialize(self, root: t.ElementT) -> str:
    method unfuckName (line 108) | def unfuckName(self, n: str) -> str:
    method groupIntoBlocks (line 116) | def groupIntoBlocks(self, nodes: t.Iterable[t.NodeT]) -> Blocks:
    method startTag (line 130) | def startTag(self, tag: str, el: Nodes, write: WriterFn) -> None:
    method endTag (line 158) | def endTag(self, tag: str, write: WriterFn) -> None:
    method isElement (line 163) | def isElement(self, node: t.Any) -> t.TypeGuard[t.ElementT]:
    method isAnonBlock (line 166) | def isAnonBlock(self, block: t.Any) -> bool:
    method isVoidElement (line 169) | def isVoidElement(self, tag: str) -> bool:
    method isRawElement (line 172) | def isRawElement(self, tag: str, el: t.ElementT) -> bool:
    method isOpaqueElement (line 179) | def isOpaqueElement(self, tag: str) -> bool:
    method isInlineElement (line 186) | def isInlineElement(self, tag: str) -> bool:
    method isBlockElement (line 191) | def isBlockElement(self, tag: str) -> bool:
    method isWrapper (line 194) | def isWrapper(self, tag: str) -> bool:
    method needsEndTag (line 197) | def needsEndTag(self, el: t.ElementT, nextEl: Nodes | None = None) -> ...
    method justWS (line 208) | def justWS(self, block: Nodes) -> bool:
    method _writeVoidElement (line 213) | def _writeVoidElement(self, tag: str, el: t.ElementT, write: WriterFn,...
    method _writeRawElement (line 217) | def _writeRawElement(self, tag: str, el: t.ElementT, write: WriterFn, ...
    method _writeOpaqueElement (line 246) | def _writeOpaqueElement(self, tag: str, el: t.ElementT, write: WriterF...
    method _writeInlineElement (line 256) | def _writeInlineElement(self, tag: str, el: Nodes, write: WriterFn, in...
    method _blocksFromChildren (line 267) | def _blocksFromChildren(self, children: t.Iterable[t.NodeT]) -> Nodes:
    method _categorizeBlockChildren (line 270) | def _categorizeBlockChildren(self, el: Nodes) -> tuple[str, Nodes | No...
    method _writeBlockElement (line 295) | def _writeBlockElement(self, tag: str, el: t.ElementT, write: WriterFn...
    method _serializeEl (line 337) | def _serializeEl(
  function pairwise (line 371) | def pairwise(iterable: t.Iterable[PairwiseU]) -> itertools.zip_longest[t...

FILE: bikeshed/headings.py
  function processHeadings (line 7) | def processHeadings(doc: t.SpecT, scope: str = "doc") -> None:
  function resetHeadings (line 29) | def resetHeadings(headings: list[t.ElementT]) -> None:
  function addHeadingIds (line 36) | def addHeadingIds(doc: t.SpecT, headings: list[t.ElementT]) -> None:
  function checkPrivacySecurityHeadings (line 59) | def checkPrivacySecurityHeadings(doc: t.SpecT, headings: list[t.ElementT...
  function addHeadingAlgorithms (line 90) | def addHeadingAlgorithms(headings: list[t.ElementT]) -> None:
  function determineHeadingLevels (line 96) | def determineHeadingLevels(doc: t.SpecT, headings: list[t.ElementT]) -> ...
  function addHeadingBonuses (line 129) | def addHeadingBonuses(headings: list[t.ElementT]) -> None:

FILE: bikeshed/highlight/highlight.py
  function loadCSSLexer (line 18) | def loadCSSLexer() -> lexers.CSSLexer:
  class ColoredText (line 26) | class ColoredText:
  function addSyntaxHighlighting (line 32) | def addSyntaxHighlighting(doc: t.SpecT) -> None:
  function determineHighlightLang (line 56) | def determineHighlightLang(doc: t.SpecT, el: t.ElementT) -> str | t.Lite...
  class LineNumberOptions (line 84) | class LineNumberOptions:
  function determineLineNumbers (line 94) | def determineLineNumbers(doc: t.SpecT, el: t.ElementT) -> LineNumberOpti...
  function highlightEl (line 144) | def highlightEl(doc: t.SpecT, el: t.ElementT, lang: str) -> None:
  function readdWhitespacePrefix (line 157) | def readdWhitespacePrefix(rawText: str, coloredText: t.Deque[ColoredText...
  function highlightWithWebIDL (line 179) | def highlightWithWebIDL(text: str, el: t.ElementT) -> t.Deque[ColoredTex...
  function coloredTextFromWidlStack (line 235) | def coloredTextFromWidlStack(widlText: str) -> t.Deque[ColoredText]:
  function highlightWithPygments (line 280) | def highlightWithPygments(text: str, lang: str, el: t.ElementT) -> t.Deq...
  function mergeHighlighting (line 294) | def mergeHighlighting(el: t.ElementT, coloredText: t.Sequence[ColoredTex...
  function coloredTextFromRawTokens (line 343) | def coloredTextFromRawTokens(rawTokens: t.Sequence[tuple[str, str]]) -> ...
  function normalizeLanguageName (line 430) | def normalizeLanguageName(lang: str | None) -> str | None:
  function normalizeHighlightMarkers (line 441) | def normalizeHighlightMarkers(doc: t.SpecT) -> None:
  function lexerFromLang (line 449) | def lexerFromLang(lang: str) -> pygments.lexer.Lexer | None:
  function addLineWrappers (line 458) | def addLineWrappers(doc: t.SpecT, el: t.ElementT, options: LineNumberOpt...
  function splitNodesByLinebreaks (line 490) | def splitNodesByLinebreaks(nodes: t.NodeListT) -> t.Iterator[list[t.Node...
  function countInternalNewlines (line 515) | def countInternalNewlines(el: t.ElementT) -> int:
  function grouper (line 526) | def grouper[T](

FILE: bikeshed/idl.py
  class IDLUI (line 13) | class IDLUI:
    method fromEl (line 18) | def fromEl(el: t.ElementT) -> IDLUI:
    method formatLineNum (line 23) | def formatLineNum(self, localNum: int) -> str:
    method formatMessage (line 29) | def formatMessage(self, msg: str) -> m.MessageOptions:
    method warn (line 37) | def warn(self, msg: str) -> None:
    method note (line 40) | def note(self, msg: str) -> None:
  class IDLSilent (line 44) | class IDLSilent:
    method warn (line 45) | def warn(self, msg: str) -> None:
    method note (line 48) | def note(self, msg: str) -> None:
  class DebugMarker (line 56) | class DebugMarker(widlparser.protocols.Marker):
    method markup_construct (line 59) | def markup_construct(
    method markup_type (line 69) | def markup_type(self, text: str, construct: widlparser.Construct) -> M...
    method markup_primitive_type (line 75) | def markup_primitive_type(self, text: str, construct: widlparser.Const...
    method markup_buffer_type (line 81) | def markup_buffer_type(self, text: str, construct: widlparser.Construc...
    method markup_string_type (line 87) | def markup_string_type(self, text: str, construct: widlparser.Construc...
    method markup_object_type (line 93) | def markup_object_type(self, text: str, construct: widlparser.Construc...
    method markup_type_name (line 99) | def markup_type_name(
    method markup_name (line 109) | def markup_name(
    method markup_keyword (line 119) | def markup_keyword(
    method markup_enum_value (line 129) | def markup_enum_value(
    method encode (line 139) | def encode(self, text: str) -> str:
  class IDLMarker (line 143) | class IDLMarker(widlparser.protocols.Marker):
    method markup_construct (line 144) | def markup_construct(
    method markup_type (line 153) | def markup_type(
    method markup_primitive_type (line 164) | def markup_primitive_type(
    method markup_string_type (line 171) | def markup_string_type(
    method markup_buffer_type (line 178) | def markup_buffer_type(
    method markup_object_type (line 185) | def markup_object_type(
    method markup_type_name (line 192) | def markup_type_name(self, text: str, construct: widlparser.Construct)...
    method markup_keyword (line 238) | def markup_keyword(self, text: str, construct: widlparser.Construct) -...
    method markup_name (line 285) | def markup_name(
    method markup_enum_value (line 368) | def markup_enum_value(self, text: str, construct: widlparser.Construct...
    method encode (line 377) | def encode(self, text: str) -> str:
    method methodLinkingTexts (line 380) | def methodLinkingTexts(self, method: widlparser.OperationRest) -> list...
  function markupIDL (line 414) | def markupIDL(doc: t.SpecT) -> None:
  function getContentStartingLineNum (line 452) | def getContentStartingLineNum(el: t.ElementT) -> int | None:
  function markupIDLBlock (line 473) | def markupIDLBlock(pre: t.ElementT, doc: t.SpecT) -> set[t.ElementT]:
  function combineIdlLinkingTexts (line 539) | def combineIdlLinkingTexts(t1: str | None, t2: str | None) -> str:
  function normalizeIdlWhitespace (line 548) | def normalizeIdlWhitespace(text: str) -> str:
  function getParser (line 556) | def getParser() -> widlparser.parser.Parser:
  function nodesFromType (line 560) | def nodesFromType(prod: widlparser.productions.Production) -> t.ElementT:
  function _nodesFromProduction (line 564) | def _nodesFromProduction(prod: widlparser.productions.Production | widlp...
  function startTag (line 728) | def startTag(tagName: str, attrs: dict[str, str] | None = None) -> str:
  function endTag (line 737) | def endTag(tagName: str) -> str:

FILE: bikeshed/includes.py
  function processInclusions (line 11) | def processInclusions(doc: t.SpecT) -> None:
  function handleBikeshedInclude (line 30) | def handleBikeshedInclude(el: t.ElementT, doc: t.SpecT) -> None:
  function handleCodeInclude (line 102) | def handleCodeInclude(el: t.ElementT, doc: t.SpecT) -> None:
  function handleRawInclude (line 150) | def handleRawInclude(el: t.ElementT, doc: t.SpecT) -> None:
  function parseRangeString (line 185) | def parseRangeString(rangeStr: str) -> list[RangeItem]:
  function parseSingleRange (line 190) | def parseSingleRange(item: str) -> RangeItem | None:

FILE: bikeshed/inlineTags/__init__.py
  function processTags (line 9) | def processTags(doc: t.SpecT) -> None:

FILE: bikeshed/issuelist.py
  class HeaderInfo (line 28) | class HeaderInfo:
  function printIssueList (line 38) | def printIssueList(infilename: str | None = None, outfilename: str | Non...
  function findIssuesFile (line 87) | def findIssuesFile() -> str | None:
  function extractHeaderInfo (line 113) | def extractHeaderInfo(lines: t.Sequence[str], infilename: str) -> Header...
  function printHelpMessage (line 190) | def printHelpMessage() -> None:
  function printHeader (line 221) | def printHeader(outfile: t.TextIO, hi: HeaderInfo) -> None:
  function attr (line 262) | def attr(text: str) -> str:
  function html (line 266) | def html(text: str) -> str:
  function printIssues (line 270) | def printIssues(outfile: t.TextIO, lines: list[str]) -> None:
  function printScript (line 315) | def printScript(outfile: t.TextIO) -> None:

FILE: bikeshed/language.py
  class Language (line 7) | class Language:

FILE: bikeshed/lexers.py
  class CSSLexer (line 7) | class CSSLexer(RegexLexer):

FILE: bikeshed/line.py
  class Line (line 9) | class Line:
    method __unicode__ (line 13) | def __unicode__(self) -> str:
  function rectify (line 17) | def rectify(lines: list[str] | list[Line]) -> list[Line]:

FILE: bikeshed/lint/accidental2119.py
  function accidental2119 (line 9) | def accidental2119(doc: t.SpecT) -> None:

FILE: bikeshed/lint/brokenLinks.py
  function brokenLinks (line 12) | def brokenLinks(doc: t.SpecT) -> None:

FILE: bikeshed/lint/exampleIDs.py
  function exampleIDs (line 7) | def exampleIDs(doc: t.SpecT) -> None:

FILE: bikeshed/lint/missingExposed.py
  function missingExposed (line 9) | def missingExposed(doc: t.SpecT) -> None:

FILE: bikeshed/lint/requiredIDs.py
  function requiredIDs (line 7) | def requiredIDs(doc: t.SpecT) -> None:

FILE: bikeshed/lint/unusedInternalDfns.py
  function unusedInternalDfns (line 8) | def unusedInternalDfns(doc: t.SpecT) -> None:

FILE: bikeshed/markdown/markdown.py
  class MarkdownConfig (line 13) | class MarkdownConfig:
    method fromSpec (line 19) | def fromSpec(doc: t.SpecT) -> MarkdownConfig:
  class TokenT (line 29) | class TokenT(t.TypedDict, total=False):
  class HeadingTokenT (line 35) | class HeadingTokenT(TokenT, total=False):
  class NumberedTokenT (line 39) | class NumberedTokenT(TokenT):
  class RawTokenT (line 42) | class RawTokenT(t.TypedDict, total=False):
  function parse (line 53) | def parse(
  function parse (line 59) | def parse(
  function parse (line 65) | def parse(
  function tokenizeLines (line 81) | def tokenizeLines(lines: list[l.Line], config: MarkdownConfig) -> list[T...
  function prefixCount (line 231) | def prefixCount(text: str, numSpacesForIndentation: int) -> int:
  function stripPrefix (line 246) | def stripPrefix(token: TokenT, numSpacesForIndentation: int, len: int) -...
  function lineEndsRawBlock (line 273) | def lineEndsRawBlock(line: l.Line, rawToken: RawTokenT) -> bool:
  function stripCommonWsPrefix (line 277) | def stripCommonWsPrefix(tokens: list[TokenT]) -> list[TokenT]:
  function commonPrefix (line 294) | def commonPrefix(line1: str | None, line2: str | None) -> str | None:
  function getWsPrefix (line 310) | def getWsPrefix(line: str) -> str | None:
  function parseTokens (line 320) | def parseTokens(tokens: list[TokenT], config: MarkdownConfig) -> list[l....
  function lineFromStream (line 377) | def lineFromStream(stream: TokenStream, text: str) -> l.Line:
  function startTag (line 385) | def startTag(tagName: str, lineNumber: int, attrs: dict[str, str] | None...
  function endTag (line 394) | def endTag(tagName: str) -> str:
  function parseSingleLineHeading (line 404) | def parseSingleLineHeading(stream: TokenStream) -> list[l.Line]:
  function parseMultiLineHeading (line 416) | def parseMultiLineHeading(stream: TokenStream) -> list[l.Line]:
  function parseHorizontalRule (line 441) | def parseHorizontalRule(stream: TokenStream) -> list[l.Line]:
  function parseParagraph (line 447) | def parseParagraph(stream: TokenStream) -> list[l.Line]:
  function parseBulleted (line 485) | def parseBulleted(stream: TokenStream) -> list[l.Line]:
  function parseNumbered (line 536) | def parseNumbered(stream: TokenStream, start: int = 1) -> list[l.Line]:
  function parseDl (line 590) | def parseDl(stream: TokenStream) -> list[l.Line]:
  function parseBlockquote (line 649) | def parseBlockquote(stream: TokenStream) -> list[l.Line]:
  class TokenStream (line 664) | class TokenStream:
    method __init__ (line 665) | def __init__(
    method __len__ (line 686) | def __len__(self) -> int:
    method ended (line 689) | def ended(self) -> bool:
    method nth (line 692) | def nth(self, i: int) -> TokenT:
    method prev (line 700) | def prev(self, i: int = 1) -> TokenT:
    method curr (line 703) | def curr(self) -> TokenT:
    method next (line 706) | def next(self, i: int = 1) -> TokenT:
    method advance (line 709) | def advance(self, i: int = 1) -> TokenT:
    method __getattr__ (line 715) | def __getattr__(self, name: str) -> t.Any:

FILE: bikeshed/mdn/mdnspeclinks.py
  class MdnFeatureT (line 12) | class MdnFeatureT(t.TypedDict, total=False):
  function addMdnPanels (line 25) | def addMdnPanels(doc: t.SpecT) -> list[t.ElementT]:
  function createAnno (line 56) | def createAnno(className: str, mdnButton: t.ElementT, featureDivs: list[...
  function panelsFromData (line 60) | def panelsFromData(doc: t.SpecT, data: MdnDataT) -> list[t.ElementT]:
  function addSupportRow (line 163) | def addSupportRow(
  function mdnPanelFor (line 242) | def mdnPanelFor(
  function browserCompatSpan (line 289) | def browserCompatSpan(

FILE: bikeshed/messages.py
  class MessageOptions (line 39) | class MessageOptions:
    method die (line 44) | def die(self) -> None:
    method linkerror (line 47) | def linkerror(self) -> None:
    method lint (line 50) | def lint(self) -> None:
    method warn (line 53) | def warn(self) -> None:
  class MessagesState (line 58) | class MessagesState:
    method __post_init__ (line 74) | def __post_init__(self) -> None:
    method record (line 78) | def record(self, category: str, message: str | tuple[str, str]) -> None:
    method replace (line 82) | def replace(self, **kwargs: t.Any) -> MessagesState:
    method shouldDie (line 85) | def shouldDie(self, category: str, timing: str = "early") -> bool:
    method shouldPrint (line 94) | def shouldPrint(self, category: str) -> bool:
    method categoryName (line 104) | def categoryName(categoryNum: int) -> str:
  function wrappedOutput (line 114) | def wrappedOutput() -> bool:
  function p (line 118) | def p(msg: str | tuple[str, str]) -> None:
  function getLineNum (line 141) | def getLineNum(lineNum: str | int | t.ElementT | None = None, el: t.Elem...
  function getApproxLineNumber (line 159) | def getApproxLineNumber(el: t.ElementT) -> str | None:
  function printOpener (line 175) | def printOpener() -> None:
  function printCloser (line 184) | def printCloser() -> None:
  function die (line 205) | def die(msg: str, el: t.ElementT | None = None, lineNum: str | int | Non...
  function linkerror (line 216) | def linkerror(msg: str, el: t.ElementT | None = None, lineNum: str | int...
  function lint (line 233) | def lint(msg: str, el: t.ElementT | None = None, lineNum: str | int | No...
  function warn (line 250) | def warn(msg: str, el: t.ElementT | None = None, lineNum: str | int | No...
  function say (line 261) | def say(msg: str) -> None:
  function success (line 266) | def success(msg: str) -> None:
  function failure (line 274) | def failure(msg: str) -> None:
  function retroactivelyCheckErrorLevel (line 282) | def retroactivelyCheckErrorLevel(level: str | None = None, timing: str =...
  function printColor (line 291) | def printColor(text: str, color: str = "white", *styles: str) -> str:
  function formatMessage (line 330) | def formatMessage(type: str, text: str, lineNum: str | None = None) -> s...
  function errorAndExit (line 386) | def errorAndExit() -> None:
  function withMessageState (line 392) | def withMessageState(
  function messagesSilent (line 414) | def messagesSilent() -> t.Generator[t.TextIO, None, None]:

FILE: bikeshed/metadata.py
  class DurationT (line 23) | class DurationT:
  class LinkCheckerTimeout (line 28) | class LinkCheckerTimeout:
  class MetadataManager (line 33) | class MetadataManager:
    method vshortname (line 35) | def vshortname(self) -> str | None:
    method displayVshortname (line 41) | def displayVshortname(self) -> str | None:
    method __init__ (line 46) | def __init__(self) -> None:
    method addData (line 168) | def addData(self, key: str, val: str, lineNum: str | int | None = None...
    method addParsedData (line 196) | def addParsedData(self, key: str, val: t.Any) -> MetadataManager:
    method computeImplicitMetadata (line 203) | def computeImplicitMetadata(self, doc: t.SpecT) -> None:
    method validate (line 233) | def validate(self, doc: t.SpecT) -> bool:
    method fillTextMacros (line 278) | def fillTextMacros(self, macros: t.DefaultDict[str, str], doc: t.SpecT...
  function parsedTextFromRawLines (line 435) | def parsedTextFromRawLines(lines: list[str], doc: t.SpecT, indent: int, ...
  class ParseFunc (line 446) | class ParseFunc(t.Protocol):
    method __call__ (line 447) | def __call__(self, key: str, val: str, lineNum: str | int | None) -> t...
  function parseDate (line 450) | def parseDate(key: str, val: str, lineNum: str | int | None) -> date | N...
  function parseDateOrDuration (line 460) | def parseDateOrDuration(key: str, val: str, lineNum: str | int | None) -...
  function canonicalizeExpiryDate (line 477) | def canonicalizeExpiryDate(base: date, expires: timedelta | datetime | d...
  function parseLevel (line 492) | def parseLevel(key: str, val: str, lineNum: str | int | None) -> str:
  function parseInteger (line 499) | def parseInteger(key: str, val: str, lineNum: str | int | None) -> int:
  function parseBoolean (line 503) | def parseBoolean(key: str, val: str, lineNum: str | int | None) -> bool ...
  function parseSoftBoolean (line 510) | def parseSoftBoolean(key: str, val: str, lineNum: str | int | None) -> b...
  function boolish (line 520) | def boolish(val: str) -> bool | None:
  function parseWarning (line 528) | def parseWarning(key: str, val: str, lineNum: str | int | None) -> tuple...
  function parseEditor (line 561) | def parseEditor(key: str, val: str, lineNum: None | str | int) -> list[d...
  function parseCommaSeparated (line 640) | def parseCommaSeparated(key: str, val: str, lineNum: str | int | None) -...
  function parseIdList (line 644) | def parseIdList(key: str, val: str, lineNum: str | int | None) -> list[s...
  function parseLinkDefaults (line 648) | def parseLinkDefaults(key: str, val: str, lineNum: str | int | None) -> ...
  function parseBoilerplate (line 675) | def parseBoilerplate(key: str, val: str, lineNum: str | int | None) -> c...
  function parseBiblioDisplay (line 700) | def parseBiblioDisplay(key: str, val: str, lineNum: str | int | None) ->...
  function parseRefStatus (line 708) | def parseRefStatus(key: str, val: str, lineNum: str | int | None) -> str:
  function parseComplainAbout (line 719) | def parseComplainAbout(key: str, val: str, lineNum: str | int | None) ->...
  function parseExternalInfotrees (line 727) | def parseExternalInfotrees(key: str, val: str, lineNum: str | int | None...
  function parseBoolishList (line 737) | def parseBoolishList(
  function parseLinkedText (line 773) | def parseLinkedText(key: str, val: str, lineNum: str | int | None) -> li...
  function parseMarkupShorthands (line 783) | def parseMarkupShorthands(key: str, val: str, lineNum: str | int | None)...
  function parseInlineGithubIssues (line 835) | def parseInlineGithubIssues(key: str, val: str, lineNum: str | int | Non...
  function parseTextMacro (line 848) | def parseTextMacro(key: str, val: str, lineNum: str | int | None) -> lis...
  function parseWorkStatus (line 862) | def parseWorkStatus(key: str, val: str, lineNum: str | int | None) -> st...
  function parseRepository (line 883) | def parseRepository(key: str, val: str, lineNum: str | int | None) -> re...
  function parseTranslateIDs (line 906) | def parseTranslateIDs(key: str, val: str, lineNum: str | int | None) -> ...
  function parseTranslation (line 918) | def parseTranslation(key: str, val: str, lineNum: str | int | None) -> l...
  function parseAudience (line 951) | def parseAudience(key: str, val: str, lineNum: str | int | None) -> list...
  function parseEditorTerm (line 994) | def parseEditorTerm(key: str, val: str, lineNum: str | int | None) -> di...
  function parseMaxToCDepth (line 1005) | def parseMaxToCDepth(key: str, val: str, lineNum: str | int | None) -> i...
  function parseMetadataOrder (line 1025) | def parseMetadataOrder(key: str, val: str, lineNum: str | int | None) ->...
  function parseWptDisplay (line 1030) | def parseWptDisplay(key: str, val: str, lineNum: str | int | None) -> str:
  function parsePreviousVersion (line 1041) | def parsePreviousVersion(key: str, val: str, lineNum: str | int | None) ...
  function parseInlineTagCommand (line 1050) | def parseInlineTagCommand(key: str, val: str, lineNum: str | int | None)...
  function parseDieOn (line 1056) | def parseDieOn(key: str, val: str, lineNum: str | int | None) -> str:
  function parseDieWhen (line 1068) | def parseDieWhen(key: str, val: str, lineNum: str | int | None) -> str:
  function parseIgnoreMdnFailure (line 1080) | def parseIgnoreMdnFailure(key: str, val: str, lineNum: str | int | None)...
  function parseLinkCheckerTimeout (line 1086) | def parseLinkCheckerTimeout(key: str, val: str, lineNum: str | int | Non...
  function parse (line 1100) | def parse(lines: t.Sequence[Line]) -> tuple[list[Line], MetadataManager]:
  class IndentInfo (line 1168) | class IndentInfo:
    method tooShort (line 1175) | def tooShort(self) -> bool:
  function inferIndent (line 1179) | def inferIndent(lines: t.Sequence[Line]) -> IndentInfo:
  function spaceIndentFromLine (line 1229) | def spaceIndentFromLine(line: str) -> int:
  function fromCommandLine (line 1240) | def fromCommandLine(overrides: list[str]) -> MetadataManager:
  function fromJson (line 1259) | def fromJson(data: str, source: str) -> MetadataManager:
  function getSpecRepository (line 1284) | def getSpecRepository(doc: t.SpecT) -> repository.Repository | None:
  function parseDoc (line 1314) | def parseDoc(doc: t.SpecT) -> None:
  function join (line 1339) | def join(*sources: MetadataManager | None) -> MetadataManager:
  class Metadata (line 1357) | class Metadata:
  function joinValue (line 1370) | def joinValue(a: JoinA, b: JoinB) -> JoinB:
  function joinList (line 1374) | def joinList(a: t.Sequence[JoinA], b: t.Sequence[JoinB]) -> t.Sequence[J...
  function joinDict (line 1378) | def joinDict(a: t.Mapping[str, JoinA], b: t.Mapping[str, JoinB]) -> dict...
  function joinBoolSet (line 1385) | def joinBoolSet(a: config.BoolSet, b: config.BoolSet) -> config.BoolSet:
  function joinDdList (line 1392) | def joinDdList(
  function parseLiteral (line 1402) | def parseLiteral(key: str, val: str, lineNum: str | int | None) -> str:
  function parseLiteralOrNone (line 1406) | def parseLiteralOrNone(key: str, val: str, lineNum: str | int | None) ->...
  function parseLiteralCaseless (line 1412) | def parseLiteralCaseless(key: str, val: str, lineNum: str | int | None) ...
  function parseLiteralList (line 1416) | def parseLiteralList(key: str, val: str, lineNum: str | int | None) -> l...

FILE: bikeshed/outline.py
  class OutlineEntry (line 10) | class OutlineEntry:
  function printOutline (line 17) | def printOutline(doc: t.Spec) -> str:
  function generateOutline (line 35) | def generateOutline(doc: t.Spec) -> list[OutlineEntry]:
  function collectHeadings (line 54) | def collectHeadings(

FILE: bikeshed/printjson.py
  function printjson (line 7) | def printjson(x: t.Any, indent: str | int = 2, level: int = 0) -> str:
  function getjson (line 27) | def getjson(x: t.Any) -> t.Any:
  function printjsonobject (line 34) | def printjsonobject(x: t.Any, indent: str, level: int) -> str:
  function printjsonobjectarray (line 50) | def printjsonobjectarray(x: list[dict[str, t.Any]], indent: str, level: ...
  function printjsonsimplearray (line 61) | def printjsonsimplearray(x: list[t.Any], indent: str, level: int) -> str...
  function printjsonprimitive (line 72) | def printjsonprimitive(x: t.Any) -> str:

FILE: bikeshed/publish.py
  function publishEchidna (line 16) | def publishEchidna(
  function prepareTar (line 62) | def prepareTar(doc: t.SpecT, additionalDirectories: list[str] | None = N...

FILE: bikeshed/pyg.py
  class PrismStyle (line 24) | class PrismStyle(style.Style):

FILE: bikeshed/railroaddiagrams.py
  function escapeAttr (line 43) | def escapeAttr(val: Union[str, float]) -> str:
  function escapeHtml (line 49) | def escapeHtml(val: str) -> str:
  function determineGaps (line 53) | def determineGaps(outer: float, inner: float) -> Tuple[float, float]:
  function doubleenumerate (line 63) | def doubleenumerate(seq: Seq[T]) -> Generator[Tuple[int, int, T], None, ...
  function addDebug (line 69) | def addDebug(el: DiagramItem) -> None:
  class DiagramItem (line 75) | class DiagramItem:
    method __init__ (line 76) | def __init__(self, name: str, attrs: Opt[AttrsT] = None, text: Opt[Nod...
    method format (line 95) | def format(self, x: float, y: float, width: float) -> DiagramItem:
    method addTo (line 98) | def addTo(self, parent: DiagramItem) -> DiagramItem:
    method writeSvg (line 102) | def writeSvg(self, write: WriterF) -> None:
    method walk (line 116) | def walk(self, cb: WalkerF) -> None:
  class DiagramMultiContainer (line 120) | class DiagramMultiContainer(DiagramItem):
    method __init__ (line 121) | def __init__(
    method format (line 131) | def format(self, x: float, y: float, width: float) -> DiagramItem:
    method walk (line 134) | def walk(self, cb: WalkerF) -> None:
  class Path (line 140) | class Path:
    method __init__ (line 141) | def __init__(self, x: float, y: float) -> None:
    method m (line 146) | def m(self, x: float, y: float) -> Path:
    method l (line 150) | def l(self, x: float, y: float) -> Path:
    method h (line 154) | def h(self, val: float) -> Path:
    method right (line 158) | def right(self, val: float) -> Path:
    method left (line 161) | def left(self, val: float) -> Path:
    method v (line 164) | def v(self, val: float) -> Path:
    method down (line 168) | def down(self, val: float) -> Path:
    method up (line 171) | def up(self, val: float) -> Path:
    method arc_8 (line 174) | def arc_8(self, start: str, dir: str) -> Path:
    method arc (line 220) | def arc(self, sweep: str) -> Path:
    method addTo (line 231) | def addTo(self, parent: DiagramItem) -> Path:
    method writeSvg (line 235) | def writeSvg(self, write: WriterF) -> None:
    method format (line 241) | def format(self) -> Path:
    method __repr__ (line 245) | def __repr__(self) -> str:
  function wrapString (line 249) | def wrapString(value: Node) -> DiagramItem:
  class Style (line 285) | class Style:
    method __init__ (line 286) | def __init__(self, css: str) -> None:
    method __repr__ (line 289) | def __repr__(self) -> str:
    method addTo (line 292) | def addTo(self, parent: DiagramItem) -> Style:
    method format (line 296) | def format(self) -> Style:
    method writeSvg (line 299) | def writeSvg(self, write: WriterF) -> None:
  class Diagram (line 304) | class Diagram(DiagramMultiContainer):
    method __init__ (line 305) | def __init__(self, *items: Node, **kwargs: str) -> None:
    method __repr__ (line 337) | def __repr__(self) -> str:
    method format (line 344) | def format(
    method writeSvg (line 382) | def writeSvg(self, write: WriterF) -> None:
    method writeStandalone (line 387) | def writeStandalone(self, write: WriterF, css: str | None = None) -> N...
  class Sequence (line 401) | class Sequence(DiagramMultiContainer):
    method __init__ (line 402) | def __init__(self, *items: Node) -> None:
    method __repr__ (line 420) | def __repr__(self) -> str:
    method format (line 424) | def format(self, x: float, y: float, width: float) -> Sequence:
  class Stack (line 442) | class Stack(DiagramMultiContainer):
    method __init__ (line 443) | def __init__(self, *items: Node) -> None:
    method __repr__ (line 462) | def __repr__(self) -> str:
    method format (line 466) | def format(self, x: float, y: float, width: float) -> Stack:
  class OptionalSequence (line 502) | class OptionalSequence(DiagramMultiContainer):
    method __new__ (line 503) | def __new__(cls, *items: Node) -> Any:
    method __init__ (line 509) | def __init__(self, *items: Node) -> None:
    method __repr__ (line 535) | def __repr__(self) -> str:
    method format (line 539) | def format(self, x: float, y: float, width: float) -> OptionalSequence:
  class AlternatingSequence (line 615) | class AlternatingSequence(DiagramMultiContainer):
    method __new__ (line 616) | def __new__(cls, *items: Node) -> AlternatingSequence:
    method __init__ (line 623) | def __init__(self, *items: Node) -> None:
    method __repr__ (line 650) | def __repr__(self) -> str:
    method format (line 654) | def format(self, x: float, y: float, width: float) -> AlternatingSeque...
  class Choice (line 711) | class Choice(DiagramMultiContainer):
    method __init__ (line 712) | def __init__(self, default: int, *items: Node) -> None:
    method __repr__ (line 737) | def __repr__(self) -> str:
    method format (line 741) | def format(self, x: float, y: float, width: float) -> Choice:
  class MultipleChoice (line 787) | class MultipleChoice(DiagramMultiContainer):
    method __init__ (line 788) | def __init__(self, default: int, type: str, *items: Node) -> None:
    method __repr__ (line 817) | def __repr__(self) -> str:
    method format (line 821) | def format(self, x: float, y: float, width: float) -> MultipleChoice:
  class HorizontalChoice (line 908) | class HorizontalChoice(DiagramMultiContainer):
    method __new__ (line 909) | def __new__(cls, *items: Node) -> Any:
    method __init__ (line 915) | def __init__(self, *items: Node) -> None:
    method format (line 952) | def format(self, x: float, y: float, width: float) -> HorizontalChoice:
  function Optional (line 1025) | def Optional(item: Node, skip: bool = False) -> Choice:
  class OneOrMore (line 1029) | class OneOrMore(DiagramItem):
    method __init__ (line 1030) | def __init__(self, item: Node, repeat: Opt[Node] = None) -> None:
    method format (line 1042) | def format(self, x: float, y: float, width: float) -> OneOrMore:
    method walk (line 1065) | def walk(self, cb: WalkerF) -> None:
    method __repr__ (line 1070) | def __repr__(self) -> str:
  function ZeroOrMore (line 1074) | def ZeroOrMore(item: Node, repeat: Opt[Node] = None, skip: bool = False)...
  class Group (line 1079) | class Group(DiagramItem):
    method __init__ (line 1080) | def __init__(self, item: Node, label: Opt[Node] = None) -> None:
    method format (line 1105) | def format(self, x: float, y: float, width: float) -> Group:
    method walk (line 1134) | def walk(self, cb: WalkerF) -> None:
  class Start (line 1141) | class Start(DiagramItem):
    method __init__ (line 1142) | def __init__(self, type: str = "simple", label: Opt[str] = None) -> None:
    method format (line 1154) | def format(self, x: float, y: float, width: float) -> Start:
    method __repr__ (line 1168) | def __repr__(self) -> str:
  class End (line 1172) | class End(DiagramItem):
    method __init__ (line 1173) | def __init__(self, type: str = "simple") -> None:
    method format (line 1181) | def format(self, x: float, y: float, width: float) -> End:
    method __repr__ (line 1188) | def __repr__(self) -> str:
  class Terminal (line 1192) | class Terminal(DiagramItem):
    method __init__ (line 1193) | def __init__(self, text: str, href: Opt[str] = None, title: Opt[str] =...
    method __repr__ (line 1205) | def __repr__(self) -> str:
    method format (line 1208) | def format(self, x: float, y: float, width: float) -> Terminal:
  class NonTerminal (line 1237) | class NonTerminal(DiagramItem):
    method __init__ (line 1238) | def __init__(self, text: str, href: Opt[str] = None, title: Opt[str] =...
    method __repr__ (line 1250) | def __repr__(self) -> str:
    method format (line 1253) | def format(self, x: float, y: float, width: float) -> NonTerminal:
  class Comment (line 1280) | class Comment(DiagramItem):
    method __init__ (line 1281) | def __init__(self, text: str, href: Opt[str] = None, title: Opt[str] =...
    method __repr__ (line 1293) | def __repr__(self) -> str:
    method format (line 1296) | def format(self, x: float, y: float, width: float) -> Comment:
  class Skip (line 1318) | class Skip(DiagramItem):
    method __init__ (line 1319) | def __init__(self) -> None:
    method format (line 1326) | def format(self, x: float, y: float, width: float) -> Skip:
    method __repr__ (line 1330) | def __repr__(self) -> str:

FILE: bikeshed/railroadparser.py
  function parse (line 11) | def parse(string: str) -> rr.Diagram | None:
  class RRCommand (line 103) | class RRCommand:
  function _createDiagram (line 111) | def _createDiagram(command: RRCommand) -> rr.DiagramItem | None:

FILE: bikeshed/refs/external.py
  class ExternalRefsManager (line 9) | class ExternalRefsManager:
    method addRef (line 12) | def addRef(self, specName: str, ref: t.RefWrapper, for_: str | None) -...
    method hasRefs (line 17) | def hasRefs(self) -> bool:
    method addBiblio (line 20) | def addBiblio(self, specName: str, biblio: t.BiblioEntry) -> None:
    method sorted (line 25) | def sorted(self) -> t.Iterable[tuple[str, ExternalRefsSpec]]:
  class ExternalRefsSpec (line 33) | class ExternalRefsSpec:
    method addRef (line 37) | def addRef(self, ref: t.RefWrapper, for_: str | None) -> None:
    method sorted (line 42) | def sorted(self) -> t.Iterable[tuple[str, ExternalRefsGroup]]:
  class ExternalRefsGroup (line 47) | class ExternalRefsGroup:
    method __len__ (line 50) | def __len__(self) -> int:
    method single (line 53) | def single(self) -> t.RefWrapper:
    method sorted (line 60) | def sorted(self) -> t.Generator[tuple[str | None, t.RefWrapper], None,...

FILE: bikeshed/refs/headingdata.py
  class SpecHeadings (line 23) | class SpecHeadings:
    method __init__ (line 24) | def __init__(self, spec: str, data: dict[str, list[str] | dict[str, di...
    method get (line 28) | def get(self, id: str, status: str, el: t.ElementT | None = None) -> d...

FILE: bikeshed/refs/manager.py
  class ReferenceManager (line 20) | class ReferenceManager:
    method __init__ (line 43) | def __init__(
    method initializeRefs (line 107) | def initializeRefs(self, datablocks: t.ModuleType, doc: t.SpecT | None...
    method fetchHeadings (line 184) | def fetchHeadings(self, spec: str) -> headingdata.SpecHeadings:
    method fetchHeading (line 197) | def fetchHeading(
    method initializeBiblio (line 209) | def initializeBiblio(self, doc: t.SpecT) -> None:
    method setSpecData (line 242) | def setSpecData(self, doc: t.SpecT) -> None:
    method removeSameSpecRefs (line 262) | def removeSameSpecRefs(self) -> None:
    method addLocalDfns (line 271) | def addLocalDfns(self, doc: t.SpecT, dfns: t.Iterable[t.ElementT]) -> ...
    method filterObsoletes (line 356) | def filterObsoletes(self, refs: list[RefWrapper]) -> list[RefWrapper]:
    method queryAllRefs (line 365) | def queryAllRefs(self, **kwargs: t.Any) -> list[RefWrapper]:
    method getRef (line 374) | def getRef(
    method getBiblioRef (line 669) | def getBiblioRef(
    method bibliosFromKey (line 771) | def bibliosFromKey(self, key: str) -> list[biblio.BiblioEntry]:
    method _bestCandidateBiblio (line 785) | def _bestCandidateBiblio(self, candidates: list[biblio.BiblioEntry]) -...
    method getLatestBiblioRef (line 788) | def getLatestBiblioRef(self, key: str) -> biblio.BiblioEntry | None:
    method vNamesFromSpecNames (line 811) | def vNamesFromSpecNames(self, specName: str) -> list[str]:
  function simplifyPossibleRefs (line 826) | def simplifyPossibleRefs(refs: list[RefWrapper], alwaysShowFor: bool = F...
  class SimplifiedRef (line 857) | class SimplifiedRef:
  function refToText (line 865) | def refToText(ref: SimplifiedRef) -> str:
  function reportMultiplePossibleRefs (line 872) | def reportMultiplePossibleRefs(
  function reportAmbiguousForlessLink (line 911) | def reportAmbiguousForlessLink(
  function errorFromFailureCategory (line 927) | def errorFromFailureCategory(

FILE: bikeshed/refs/ref-hints.js
  function mkRefHint (line 1) | function mkRefHint(link, ref) {
  function hideAllRefHints (line 64) | function hideAllRefHints() {
  function hideRefHint (line 68) | function hideRefHint(refHint) {
  function showRefHint (line 77) | function showRefHint(link) {
  function setupRefHintEventListeners (line 96) | function setupRefHintEventListeners(link, refHint) {
  function positionRefHint (line 136) | function positionRefHint(refHint) {
  function getBounds (line 154) | function getBounds(el, relativeTo=document.body) {
  function showRefHintListener (line 167) | function showRefHintListener(e) {
  function hideAllHintsListener (line 182) | function hideAllHintsListener(e) {

FILE: bikeshed/refs/source.py
  class RefSource (line 16) | class RefSource:
    method __init__ (line 31) | def __init__(
    method fetchRefs (line 61) | def fetchRefs(self, key: str) -> list[t.RefWrapper]:
    method fetchAllRefs (line 80) | def fetchAllRefs(self) -> list[tuple[str, list[t.RefWrapper]]]:
    method queryRefs (line 100) | def queryRefs(
    method allRefsIterator (line 176) | def allRefsIterator(self) -> t.Generator[t.RefWrapper, None, None]:
    method textRefsIterator (line 181) | def textRefsIterator(self, texts: list[str]) -> t.Generator[t.RefWrapp...
    method forRefsIterator (line 186) | def forRefsIterator(self, targetFors: str | list[str]) -> t.Generator[...
    method _queryRefs (line 194) | def _queryRefs(
    method addMethodVariants (line 338) | def addMethodVariants(self, methodSig: str, forVals: t.Iterable[str], ...
  function filterByFor (line 356) | def filterByFor(refs: t.Sequence[t.RefWrapper], linkFor: str | list[str]...
  function matchFor (line 360) | def matchFor(forVals: list[str], forTest: str | list[str]) -> bool:
  function filterByStatus (line 370) | def filterByStatus(source: RefSource, refs: t.Sequence[t.RefWrapper], st...
  function decodeAnchors (line 396) | def decodeAnchors(linesIter: t.Iterator[str]) -> defaultdict[str, list[t...
  function getArgfulMethodVariants (line 424) | def getArgfulMethodVariants(maybeMethodSig: str, refs: RefSource) -> lis...
  class MethodVariants (line 431) | class MethodVariants:
  class MethodVariant (line 437) | class MethodVariant:

FILE: bikeshed/refs/utils.py
  function filterObsoletes (line 9) | def filterObsoletes(
  function filterOldVersions (line 36) | def filterOldVersions(refs: list[t.RefWrapper], status: str | None = Non...
  function linkTextVariations (line 62) | def linkTextVariations(str: str, linkType: str | None) -> t.Generator[st...
  function stripLineBreaks (line 196) | def stripLineBreaks(obj: U) -> U:
  class LinkFailure (line 206) | class LinkFailure(Enum):

FILE: bikeshed/refs/wrapper.py
  class RefDataT (line 8) | class RefDataT(t.TypedDict, total=False):
  class RefWrapper (line 23) | class RefWrapper:
    method type (line 33) | def type(self) -> str:
    method spec (line 37) | def spec(self) -> str:
    method shortname (line 43) | def shortname(self) -> str:
    method level (line 49) | def level(self) -> str:
    method status (line 55) | def status(self) -> str:
    method url (line 61) | def url(self) -> str:
    method export (line 67) | def export(self) -> bool:
    method normative (line 71) | def normative(self) -> bool:
    method for_ (line 75) | def for_(self) -> list[str]:
    method el (line 79) | def el(self) -> t.ElementT | None:
    method uniquifier (line 83) | def uniquifier(self) -> str | None:
    method refKey (line 86) | def refKey(self) -> str:
    method __eq__ (line 89) | def __eq__(self, other: t.Any) -> bool:
    method __hash__ (line 94) | def __hash__(self) -> int:
    method __json__ (line 97) | def __json__(self) -> dict[str, bool | str | list[str]]:

FILE: bikeshed/repository.py
  class Repository (line 8) | class Repository(metaclass=abc.ABCMeta):
  class UnknownRepository (line 18) | class UnknownRepository(Repository):
    method formatIssueUrl (line 19) | def formatIssueUrl(self) -> str:  # pylint: disable=unused-argument
  class GithubRepository (line 25) | class GithubRepository(Repository):
    method __init__ (line 26) | def __init__(self, ns: str, user: str, repo: str) -> None:
    method formatIssueUrl (line 40) | def formatIssueUrl(self, id: str | None = None) -> str:
    method __str__ (line 45) | def __str__(self) -> str:

FILE: bikeshed/result/main.py
  function isOk (line 8) | def isOk[ValT](x: t.Any) -> t.TypeIs[Ok[ValT]]:
  function isErr (line 12) | def isErr[ErrT](x: t.Any) -> t.TypeIs[Err[ErrT]]:

FILE: bikeshed/retrieve.py
  class DataFileRequester (line 15) | class DataFileRequester:
    method __init__ (line 16) | def __init__(self, fileType: str | None = None, fallback: DataFileRequ...
    method path (line 24) | def path(self, *segs: str, fileType: str | None = None) -> str:
    method fetch (line 28) | def fetch(self, *segs: str, str: t.Literal[True], okayToFail: bool = F...
    method fetch (line 31) | def fetch(
    method fetch (line 40) | def fetch(self, *segs: str, okayToFail: bool = False, fileType: str | ...
    method fetch (line 42) | def fetch(
    method walkFiles (line 70) | def walkFiles(self, *segs: str, fileType: str | None = None) -> t.Gene...
    method _buildPath (line 74) | def _buildPath(self, segs: t.Sequence[str], fileType: str | None = Non...
    method _fail (line 83) | def _fail(self, location: str, str: t.Literal[True], okayToFail: bool)...
    method _fail (line 86) | def _fail(self, location: str, str: t.Literal[False], okayToFail: bool...
    method _fail (line 89) | def _fail(self, location: str, str: bool, okayToFail: bool) -> str | t...
    method _fail (line 91) | def _fail(self, location: str, str: bool, okayToFail: bool) -> str | t...
  function retrieveBoilerplateFile (line 104) | def retrieveBoilerplateFile(

FILE: bikeshed/shorthands/__init__.py
  function run (line 7) | def run(doc: t.SpecT) -> None:

FILE: bikeshed/shorthands/oldShorthands.py
  function transformMarkdownIB (line 8) | def transformMarkdownIB(doc: t.SpecT) -> None:
  function transformProductionGrammars (line 47) | def transformProductionGrammars(doc: t.SpecT) -> None:
  function strongReplacer (line 123) | def strongReplacer(match: t.Match) -> t.NodeT:
  function emReplacer (line 141) | def emReplacer(match: t.Match) -> t.NodeT:
  function escapedReplacer (line 149) | def escapedReplacer(match: t.Match) -> t.NodeT:  # pylint: disable=unuse...
  function addLineNumber (line 164) | def addLineNumber(el: t.ElementT) -> None:

FILE: bikeshed/stringEnum/stringenum.py
  class StringEnum (line 6) | class StringEnum:
    method __init__ (line 15) | def __init__(self, *vals: str) -> None:
    method __iter__ (line 21) | def __iter__(self) -> t.Iterator[str]:
    method __len__ (line 24) | def __len__(self) -> int:
    method __contains__ (line 27) | def __contains__(self, val: str) -> bool:
    method __getitem__ (line 30) | def __getitem__(self, val: str) -> str:
    method __getattr__ (line 33) | def __getattr__(self, name: str) -> str:

FILE: bikeshed/stylescript/dom-helper.js
  function query (line 1) | function query(sel) { return document.querySelector(sel); }
  function queryAll (line 3) | function queryAll(sel) { return [...document.querySelectorAll(sel)]; }
  function iter (line 5) | function iter(obj) {
  function mk (line 12) | function mk(tagname, attrs, ...children) {
  function append (line 164) | function append(el, ...children) {
  function insertAfter (line 172) | function insertAfter(el, ...children) {
  function clearContents (line 179) | function clearContents(el) {
  function parseHTML (line 184) | function parseHTML(markup) {

FILE: bikeshed/stylescript/link-titles.js
  function setTypeTitles (line 1) | function setTypeTitles() {

FILE: bikeshed/stylescript/manager.py
  class JCManager (line 14) | class JCManager:
    method getStyles (line 18) | def getStyles(self, allowList: t.BoolSet) -> list[Style]:
    method getScripts (line 31) | def getScripts(self, allowList: t.BoolSet) -> list[Library | Script]:
    method _addCSS (line 49) | def _addCSS(self, name: str, moduleName: str = "stylescript") -> Style:
    method _addJS (line 54) | def _addJS(self, name: str, moduleName: str = "stylescript") -> Script:
    method addColors (line 59) | def addColors(self) -> None:
    method addMdLists (line 62) | def addMdLists(self) -> None:
    method addAutolinks (line 65) | def addAutolinks(self) -> None:
    method addSelflinks (line 68) | def addSelflinks(self) -> None:
    method addCounters (line 71) | def addCounters(self) -> None:
    method addIssues (line 74) | def addIssues(self) -> None:
    method addMdn (line 77) | def addMdn(self) -> None:
    method addCiu (line 82) | def addCiu(self) -> None:
    method addDomintro (line 87) | def addDomintro(self) -> None:
    method addSyntaxHighlighting (line 90) | def addSyntaxHighlighting(self) -> None:
    method addLineNumbers (line 93) | def addLineNumbers(self) -> None:
    method addLineHighlighting (line 96) | def addLineHighlighting(self) -> None:
    method addExpires (line 99) | def addExpires(self) -> None:
    method addHidedel (line 102) | def addHidedel(self) -> None:
    method addVarClickHighlighting (line 105) | def addVarClickHighlighting(self) -> None:
    method addRefHints (line 113) | def addRefHints(self) -> dict[str, t.Any]:
    method addLinkTitles (line 123) | def addLinkTitles(self) -> dict[str, t.Any]:
    method addCDDLHighlighting (line 129) | def addCDDLHighlighting(self) -> None:
    method addIDLHighlighting (line 132) | def addIDLHighlighting(self) -> None:
    method addRailroad (line 135) | def addRailroad(self) -> None:
    method addWptCSS (line 138) | def addWptCSS(self) -> None:
    method addWpt (line 141) | def addWpt(self, paths: list[str] | None) -> None:
    method addDfnPanels (line 152) | def addDfnPanels(self) -> dict[str, t.Any]:
  class JCResource (line 164) | class JCResource(metaclass=ABCMeta):
    method insertable (line 168) | def insertable(self, allowList: t.BoolSet) -> bool:
    method toElement (line 172) | def toElement(self) -> t.ElementT:
  class Script (line 177) | class Script(JCResource):
    method insertable (line 183) | def insertable(self, allowList: t.BoolSet) -> bool:
    method toElement (line 192) | def toElement(self) -> t.ElementT:
  class Library (line 212) | class Library(JCResource):
    method insertable (line 215) | def insertable(self, allowList: t.BoolSet) -> bool:
    method toElement (line 218) | def toElement(self) -> t.ElementT:
  class Style (line 225) | class Style(JCResource):
    method insertable (line 229) | def insertable(self, allowList: t.BoolSet) -> bool:
    method toElement (line 232) | def toElement(self, darkMode: bool = True) -> t.ElementT:
  function removeInlineDarkStyles (line 253) | def removeInlineDarkStyles(name: str, text: str) -> str:

FILE: bikeshed/stylescript/position-annos.js
  function repositionAnnoPanels (line 1) | function repositionAnnoPanels(){
  function hydratePanels (line 13) | function hydratePanels(panels) {
  function cmpTops (line 47) | function cmpTops(a,b) {

FILE: bikeshed/stylescript/var-click-highlighting.js
  constant COLOR_COUNT (line 11) | const COLOR_COUNT = 7;
  function highlightSameAlgoVars (line 19) | function highlightSameAlgoVars(v) {
  function findAlgoContainer (line 44) | function findAlgoContainer(el) {
  function nameFromVar (line 51) | function nameFromVar(el) {
  function colorCountsFromContainer (line 54) | function colorCountsFromContainer(container) {
  function leastUsedColor (line 63) | function leastUsedColor(colors) {
  function chooseHighlightColor (line 75) | function chooseHighlightColor(container, v) {

FILE: bikeshed/template/main.py
  function getTemplate (line 7) | def getTemplate(variant: str) -> str | None:

FILE: bikeshed/test.py
  class TestFilter (line 23) | class TestFilter:
    method fromOptions (line 29) | def fromOptions(options: argparse.Namespace) -> TestFilter:
  function testPaths (line 33) | def testPaths(filters: TestFilter) -> list[str]:
  function findTestFiles (line 38) | def findTestFiles(filters: TestFilter) -> t.Generator[str, None, None]:
  function allowedPath (line 48) | def allowedPath(filePath: str, filters: TestFilter) -> bool:
  function splitPath (line 74) | def splitPath(path: str) -> list[str]:
  function testNameForPath (line 83) | def testNameForPath(path: str) -> str:
  function sortTests (line 89) | def sortTests(tests: t.Iterable[str]) -> t.Iterable[str]:
  function run (line 93) | def run(
  function rebase (line 144) | def rebase(
  function processTest (line 167) | def processTest(
  function compare (line 186) | def compare(suspect: str, golden: str, path: str) -> bool:
  function addTestMetadata (line 201) | def addTestMetadata(doc: t.SpecT) -> None:
  function replaceExtension (line 213) | def replaceExtension(path: str, newExt: str) -> str:

FILE: bikeshed/translate/translate.py
  function _t (line 4) | def _t(input: str) -> str:

FILE: bikeshed/unsortedJunk.py
  function stripBOM (line 27) | def stripBOM(doc: t.SpecT) -> None:
  function fixManualDefTables (line 36) | def fixManualDefTables(doc: t.SpecT) -> None:
  function canonicalizeShortcuts (line 60) | def canonicalizeShortcuts(el: t.ElementT) -> None:
  function addImplicitAlgorithms (line 124) | def addImplicitAlgorithms(doc: t.SpecT) -> None:
  function checkVarHygiene (line 148) | def checkVarHygiene(doc: t.SpecT) -> None:
  function addVarClickHighlighting (line 208) | def addVarClickHighlighting(doc: t.SpecT) -> None:
  function fixIntraDocumentReferences (line 214) | def fixIntraDocumentReferences(doc: t.SpecT) -> None:
  function fixInterDocumentReferences (line 242) | def fixInterDocumentReferences(doc: t.SpecT) -> None:
  function fillInterDocumentReferenceFromShepherd (line 286) | def fillInterDocumentReferenceFromShepherd(doc: t.SpecT, el: t.ElementT,...
  function fillInterDocumentReferenceFromSpecref (line 309) | def fillInterDocumentReferenceFromSpecref(doc: t.SpecT, el: t.ElementT, ...
  function processDfns (line 333) | def processDfns(doc: t.SpecT) -> None:
  function determineDfnType (line 340) | def determineDfnType(doc: t.SpecT, dfn: t.ElementT, inferCSS: bool = Fal...
  function classifyDfns (line 407) | def classifyDfns(doc: t.SpecT, dfns: list[t.ElementT]) -> None:
  function determineLinkType (line 567) | def determineLinkType(el: t.ElementT) -> str:
  function determineLinkText (line 588) | def determineLinkText(el: t.ElementT) -> str:
  function classifyLink (line 606) | def classifyLink(el: t.ElementT) -> t.ElementT:
  function processBiblioLinks (line 628) | def processBiblioLinks(doc: t.SpecT) -> None:
  function verifyUsageOfAllLocalBiblios (line 700) | def verifyUsageOfAllLocalBiblios(doc: t.SpecT) -> None:
  function processAutolinks (line 721) | def processAutolinks(doc: t.SpecT) -> None:
  function registerBiblioUsage (line 839) | def registerBiblioUsage(doc: t.SpecT, ref: biblio.BiblioEntry, el: t.Ele...
  function decorateAutolink (line 857) | def decorateAutolink(doc: t.SpecT, el: t.ElementT, linkType: str, linkTe...
  function removeMultipleLinks (line 888) | def removeMultipleLinks(doc: t.SpecT) -> None:
  function processIssuesAndExamples (line 912) | def processIssuesAndExamples(doc: t.SpecT) -> None:
  function addSelfLinks (line 969) | def addSelfLinks(doc: t.SpecT) -> None:
  function cleanupHTML (line 1008) | def cleanupHTML(doc: t.SpecT) -> None:
  function finalHackyCleanup (line 1239) | def finalHackyCleanup(text: str) -> str:
  function hackyLineNumbers (line 1245) | def hackyLineNumbers(lines: list[Line]) -> list[Line]:
  function correctFrontMatter (line 1257) | def correctFrontMatter(doc: t.SpecT) -> None:
  function formatElementdefTables (line 1266) | def formatElementdefTables(doc: t.SpecT) -> None:
  function formatArgumentdefTables (line 1306) | def formatArgumentdefTables(doc: t.SpecT) -> None:
  function inlineRemoteIssues (line 1343) | def inlineRemoteIssues(doc: t.SpecT) -> None:
  function addNoteHeaders (line 1479) | def addNoteHeaders(doc: t.SpecT) -> None:
  function lineNumberFromBsLineNumber (line 1498) | def lineNumberFromBsLineNumber(value: str | None) -> int:
  function locateFillContainers (line 1514) | def locateFillContainers(doc: t.SpecT) -> t.FillContainersT:
  function forceCrossorigin (line 1521) | def forceCrossorigin(doc: t.SpecT) -> None:
  function addImageSize (line 1530) | def addImageSize(doc: t.SpecT) -> None:
  function processIDL (line 1614) | def processIDL(doc: t.SpecT) -> None:
  function processCDDL (line 1630) | def processCDDL(doc: t.SpecT) -> None:

FILE: bikeshed/update/main.py
  function update (line 25) | def update(
  function fixupDataFiles (line 78) | def fixupDataFiles(updateMode: UpdateMode = UpdateMode.NONE) -> None:
  function updateReadonlyDataFiles (line 129) | def updateReadonlyDataFiles() -> None:
  function cleanupFiles (line 146) | def cleanupFiles(root: str, touchedPaths: dict[str, set[str] | None], dr...
  function copyanything (line 190) | def copyanything(src: str, dst: str) -> None:
  function livePath (line 201) | def livePath(*segs: str) -> str:
  function readonlyPath (line 205) | def readonlyPath(*segs: str) -> str:
  function getDatafilePaths (line 209) | def getDatafilePaths(basePath: str) -> t.Generator[tuple[str, str], None...
  function probablyHaveInternet (line 216) | def probablyHaveInternet() -> bool:

FILE: bikeshed/update/manifest.py
  function dtNow (line 47) | def dtNow() -> datetime:
  function dtZero (line 51) | def dtZero() -> datetime:
  function createManifest (line 66) | def createManifest(path: str, dryRun: bool = False) -> Manifest:
  function updateByManifest (line 74) | def updateByManifest(path: str, dryRun: bool = False, updateMode: Update...
  function updateFiles (line 186) | async def updateFiles(localPrefix: str, newPaths: list[str]) -> tuple[li...
  function updateFile (line 213) | async def updateFile(localPrefix: str, filePath: str, session: t.Any) ->...
  function errorFromAsyncErr (line 229) | async def errorFromAsyncErr(res: Result[str, t.Awaitable[str]]) -> str |...
  function wrapError (line 239) | def wrapError(retry_state: t.Any) -> Err[t.Awaitable[str]]:
  function downloadFile (line 249) | async def downloadFile(path: str, session: t.Any) -> Result[str, t.Await...
  function saveFile (line 261) | async def saveFile(path: str, data: str) -> Result[str, t.Awaitable[str]]:
  function localizePath (line 270) | def localizePath(root: str, relPath: str) -> str:
  class Manifest (line 280) | class Manifest:
    method fromString (line 287) | def fromString(text: str) -> Manifest | None:
    method legacyFromString (line 297) | def legacyFromString(text: str) -> Manifest | None:
    method fromPath (line 328) | def fromPath(path: str) -> Manifest:
    method __str__ (line 341) | def __str__(self) -> str:
    method daysOld (line 359) | def daysOld(self) -> int:
    method save (line 362) | def save(self, path: str) -> None:
    method hasError (line 366) | def hasError(self) -> bool:
  function keyManifest (line 370) | def keyManifest(entry: tuple[str, t.Any]) -> tuple[int, int | str, str]:
  function hashFile (line 379) | def hashFile(fh: t.TextIO) -> str:
  function getDatafilePaths (line 383) | def getDatafilePaths(basePath: str) -> t.Generator[tuple[str, str], None...
  function printDt (line 394) | def printDt(dt: datetime) -> str:
  function formatDt (line 398) | def formatDt(dt: datetime) -> str:
  function parseDt (line 402) | def parseDt(s: str) -> datetime | None:
  function trystrptime (line 409) | def trystrptime(s: str, format: str) -> datetime | None:

FILE: bikeshed/update/mode.py
  class UpdateMode (line 4) | class UpdateMode(enum.Flag):

FILE: bikeshed/update/updateBackRefs.py
  function findTestFiles (line 10) | def findTestFiles() -> t.Generator[str, None, None]:
  function testNameForPath (line 17) | def testNameForPath(path: str) -> str:
  function update (line 23) | def update(path: str, dryRun: bool = False) -> set[str] | None:  # pylin...
  function processRefs (line 58) | def processRefs(refs: t.Any) -> t.Any:

FILE: bikeshed/update/updateBiblio.py
  function update (line 14) | def update(path: str, dryRun: bool = False) -> set[str] | None:
  function getSpecrefData (line 93) | def getSpecrefData() -> str:
  function getWG21Data (line 101) | def getWG21Data() -> str:
  function getCSSWGData (line 109) | def getCSSWGData() -> list[str]:
  function groupBiblios (line 120) | def groupBiblios(biblios: t.BiblioStorageT) -> tuple[dict[str, t.BiblioS...
  function writeBiblioFile (line 133) | def writeBiblioFile(fh: t.TextIO, biblios: t.BiblioStorageT) -> None:
  function collectNumberedNames (line 183) | def collectNumberedNames(names: t.Sequence[str]) -> defaultdict[str, lis...

FILE: bikeshed/update/updateBoilerplates.py
  function update (line 19) | def update(path: str, dryRun: bool = False) -> set[str] | None:
  function pathsFromManifest (line 47) | def pathsFromManifest(manifest: str) -> list[str]:
  function updateFiles (line 52) | async def updateFiles(localPrefix: str, newPaths: t.Sequence[str]) -> tu...
  function updateFile (line 79) | async def updateFile(localPrefix: str, filePath: str, session: t.Any) ->...
  function errorFromAsyncErr (line 95) | async def errorFromAsyncErr(res: Result[str, t.Awaitable[str]]) -> str |...
  function wrapError (line 105) | def wrapError(retry_state: t.Any) -> Err[t.Awaitable[str]]:
  function downloadFile (line 115) | async def downloadFile(path: str, session: t.Any) -> Result[str, t.Await...
  function saveFile (line 127) | async def saveFile(path: str, data: str) -> Result[str, t.Awaitable[str]]:
  function localizePath (line 136) | def localizePath(root: str, relPath: str) -> str:

FILE: bikeshed/update/updateCanIUse.py
  function update (line 12) | def update(path: str, dryRun: bool = False) -> set[str] | None:

FILE: bikeshed/update/updateCrossRefs.py
  class WebrefHeadingT (line 27) | class WebrefHeadingT(t.TypedDict, total=False):
  class HeadingT (line 35) | class HeadingT(t.TypedDict):
  class WebrefSpecT (line 70) | class WebrefSpecT(t.TypedDict, total=False):
  class SpecT (line 87) | class SpecT(t.TypedDict):
  function update (line 98) | def update(path: str, dryRun: bool = False) -> set[str] | None:
  function gatherWebrefData (line 153) | def gatherWebrefData(specs: SpecsT, anchors: AnchorsT, headings: AllHead...
  function specsFromWebref (line 203) | def specsFromWebref(status: t.Literal["current" | "snapshot"]) -> list[W...
  function anchorsFromWebref (line 218) | def anchorsFromWebref(status: t.Literal["current" | "snapshot"], urlSuff...
  function headingsFromWebref (line 227) | def headingsFromWebref(status: t.Literal["current" | "snapshot"], urlSuf...
  function dataFromWebref (line 237) | def dataFromWebref(url: str) -> t.JSONObject:
  function canonSpecFromWebref (line 252) | def canonSpecFromWebref(rawSpec: WebrefSpecT) -> SpecT:
  function addToAnchors (line 276) | def addToAnchors(
  function addToHeadings (line 309) | def addToHeadings(
  function cleanSpecHeadings (line 375) | def cleanSpecHeadings(headings: AllHeadingsT) -> None:
  function extractMethodData (line 392) | def extractMethodData(anchors: AnchorsT) -> MethodsT:
  function extractForsData (line 421) | def extractForsData(anchors: AnchorsT) -> ForsT:
  function writeAnchorsFile (line 438) | def writeAnchorsFile(anchors: AnchorsT, path: str) -> set[str]:

FILE: bikeshed/update/updateLanguages.py
  function update (line 10) | def update(path: str, dryRun: bool = False) -> set[str] | None:

FILE: bikeshed/update/updateLinkDefaults.py
  function update (line 10) | def update(path: str, dryRun: bool = False) -> set[str] | None:

FILE: bikeshed/update/updateMdn.py
  function update (line 12) | def update(path: str, dryRun: bool = False) -> set[str] | None:

FILE: bikeshed/update/updateWpt.py
  function update (line 11) | def update(path: str, dryRun: bool = False) -> set[str] | None:
  function collectPaths (line 63) | def collectPaths(pathListSoFar: list[str], pathTrie: PathTrie, pathPrefi...

FILE: bikeshed/wpt/wpt.js
  function formatWptResult (line 80) | function formatWptResult({name, version, passes, total}) {

FILE: bikeshed/wpt/wptElement.py
  function processWptElements (line 10) | def processWptElements(doc: t.SpecT) -> None:
  function createHTML (line 113) | def createHTML(
  function appendTestList (line 141) | def appendTestList(
  function testNamesFromEl (line 257) | def testNamesFromEl(el: t.ElementT, pathPrefix: str | None = None) -> li...
  function prefixPlusPath (line 270) | def prefixPlusPath(prefix: str | None, path: str) -> str:
  function prefixInPath (line 280) | def prefixInPath(prefix: str | None, path: str) -> bool:
  function normalizePathSegment (line 287) | def normalizePathSegment(pathSeg: str) -> str: ...
  function normalizePathSegment (line 291) | def normalizePathSegment(pathSeg: None) -> None: ...
  function normalizePathSegment (line 294) | def normalizePathSegment(pathSeg: str | None) -> str | None:
  function checkForOmittedTests (line 305) | def checkForOmittedTests(pathPrefix: str, testData: dict[str, str], seen...
  function loadTestData (line 321) | def loadTestData(doc: t.SpecT) -> dict[str, str]:
  function xor (line 329) | def xor(a: t.Any, b: t.Any) -> bool:
  function commonPathPrefixes (line 333) | def commonPathPrefixes(paths: t.Iterable[str]) -> list[str]:
  function guessTestSuiteUrl (line 352) | def guessTestSuiteUrl(paths: t.Iterable[str]) -> str:

FILE: release.py
  function createRelease (line 8) | def createRelease():
  function inBikeshedRoot (line 125) | def inBikeshedRoot():
  function parseSemver (line 137) | def parseSemver(s):
Copy disabled (too large) Download .json
Condensed preview — 4294 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (113,707K chars).
[
  {
    "path": ".gitattributes",
    "chars": 19,
    "preview": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 680,
    "preview": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/\"\n  open-pull-requests-limit: 99\n  schedule:\n    interval: \""
  },
  {
    "path": ".github/workflows/build-docs.yml",
    "chars": 1315,
    "preview": "name: Build Docs\non:\n  push:\n    branches:\n      - main\n    paths:\n      - docs/index.bs\n  workflow_dispatch: {}\n\n# Sets"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1552,
    "preview": "name: CI\n\non:\n  push:\n    branches-ignore:\n      - \"dependabot/**\"\n      - \"daily-test-sync\"\n    paths-ignore:\n      - \""
  },
  {
    "path": ".github/workflows/playwright.yml",
    "chars": 912,
    "preview": "# Consider moving this to run as part of ci.yml\n\nname: Playwright Tests\non:\n#  push:\n#    branches-ignore:\n#      - \"dep"
  },
  {
    "path": ".github/workflows/pylint-problem-matcher.json",
    "chars": 608,
    "preview": "{\n  \"problemMatcher\": [\n    {\n      \"severity\": \"error\",\n      \"pattern\": [\n        {\n          \"regexp\": \"^([^:]+):(\\\\d"
  },
  {
    "path": ".github/workflows/update-tests/README.md",
    "chars": 1597,
    "preview": "# Bikeshed tests auto-updater\n\nThese scripts collect *.bs files from GitHub repos and creates PRs to update\nBikeshed's t"
  },
  {
    "path": ".github/workflows/update-tests/requirements.txt",
    "chars": 16,
    "preview": "PyGithub==2.9.1\n"
  },
  {
    "path": ".github/workflows/update-tests/specs.data",
    "chars": 589,
    "preview": "# See README.md for how to add your own specs\n\n+org: w3c\n\t-repo: w3c/dom\n\t-repo: w3c/mnx\n\t-repo: w3c/uievents\n\t-file: w3"
  },
  {
    "path": ".github/workflows/update-tests/update.py",
    "chars": 4922,
    "preview": "import base64\nimport fnmatch\nimport os\nimport re\nimport time\nfrom datetime import datetime\n\nfrom github import Github\nfr"
  },
  {
    "path": ".github/workflows/update-tests.yml",
    "chars": 1026,
    "preview": "name: Daily test sync\non:\n  schedule:\n  - cron: '20 20 * * *'\n  workflow_dispatch: {}\njobs:\n  update:\n    runs-on: ubunt"
  },
  {
    "path": ".gitignore",
    "chars": 309,
    "preview": ".history\nsecrets.json\n*.egg-info\n.idea\n*.iml\n*.pyc\n.python-version\n/dist\n/build\n/bikeshed/spec-data/*\n!/bikeshed/spec-da"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 330,
    "preview": "{\n    \"files.associations\": {\n        \"*.include\": \"html\",\n        \"stylesheet.include\": \"css\",\n        \"defaults*.inclu"
  },
  {
    "path": "Bikeshed.tmLanguage",
    "chars": 7610,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4309,
    "preview": "Developing Bikeshed\n===================\n\nIf you want to contribute back to Bikeshed,\nfirst make a fork on GitHub,\nthen d"
  },
  {
    "path": "Dockerfile",
    "chars": 947,
    "preview": "FROM python:3.12-bullseye as base\n\n# Get the latest spec-data, then cache it so we don't have to redo this on every rebu"
  },
  {
    "path": "LICENSE",
    "chars": 7048,
    "preview": "Creative Commons Legal Code\n\nCC0 1.0 Universal\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n"
  },
  {
    "path": "MANIFEST.in",
    "chars": 180,
    "preview": "include README.md\ninclude requirements.txt\ninclude bikeshed/semver.txt\ninclude bikeshed/py.typed\nrecursive-include bikes"
  },
  {
    "path": "README.md",
    "chars": 5101,
    "preview": "Bikeshed, a spec preprocessor\n=============================\n\n<img src=\"https://raw.githubusercontent.com/speced/bikeshed"
  },
  {
    "path": "bikeshed/InputSource.py",
    "chars": 10843,
    "preview": "from __future__ import annotations\n\nimport datetime\nimport email.utils\nimport errno\nimport os\nimport sys\nimport tarfile\n"
  },
  {
    "path": "bikeshed/Spec.py",
    "chars": 24546,
    "preview": "# pylint: disable=attribute-defined-outside-init\nfrom __future__ import annotations\n\nimport glob\nimport json\nimport os\ni"
  },
  {
    "path": "bikeshed/__init__.py",
    "chars": 622,
    "preview": "# pylint: disable=wrong-import-position\n\nfrom __future__ import annotations\n\nimport os\nimport platform\nimport subprocess"
  },
  {
    "path": "bikeshed/__main__.py",
    "chars": 30,
    "preview": "from .cli import main\n\nmain()\n"
  },
  {
    "path": "bikeshed/biblio.py",
    "chars": 16526,
    "preview": "from __future__ import annotations\n\nimport abc\nimport dataclasses\nimport json\nfrom collections import defaultdict\n\nfrom "
  },
  {
    "path": "bikeshed/boilerplate/README.md",
    "chars": 344,
    "preview": "Boilerplate Files Have Moved\n============================\n\nIf you're here to modify or create a boilerplate file,\nthey'v"
  },
  {
    "path": "bikeshed/boilerplate.py",
    "chars": 49374,
    "preview": "from __future__ import annotations\n\nimport copy\nimport dataclasses\nimport os\nimport re\nimport subprocess\nfrom collection"
  },
  {
    "path": "bikeshed/caniuse/__init__.py",
    "chars": 47,
    "preview": "from .caniuse import CIUData, addCanIUsePanels\n"
  },
  {
    "path": "bikeshed/caniuse/caniuse-panel.css",
    "chars": 4772,
    "preview": "@media (max-width: 767px) {\n\t.caniuse-status {\n\t\topacity: .1;\n\t\ttransition: opacity .1s;\n\t}\n}\n:root {\n\t--caniuse-bg: #EE"
  },
  {
    "path": "bikeshed/caniuse/caniuse.py",
    "chars": 7127,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport json\nfrom collections import OrderedDict\nfrom datetime imp"
  },
  {
    "path": "bikeshed/cddl.py",
    "chars": 12668,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nfrom typing import get_args\n\nimport cddlparser\n\nfrom . import con"
  },
  {
    "path": "bikeshed/cli.py",
    "chars": 29229,
    "preview": "from __future__ import annotations\n\nimport argparse\nimport json\nimport os\nimport sys\n\nfrom . import config, constants, p"
  },
  {
    "path": "bikeshed/conditional.py",
    "chars": 3881,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\n\nfrom . import h, t\nfrom . import messages as m\n\n# Any "
  },
  {
    "path": "bikeshed/config/BoolSet.py",
    "chars": 2843,
    "preview": "from __future__ import annotations\n\nimport collections.abc\n\nfrom .. import t\n\n\nclass BoolSet(collections.abc.MutableMapp"
  },
  {
    "path": "bikeshed/config/__init__.py",
    "chars": 717,
    "preview": "from .BoolSet import BoolSet\nfrom .dfnTypes import (\n    adjustKey,\n    anchorishElements,\n    cddlTypes,\n    cssTypes,\n"
  },
  {
    "path": "bikeshed/config/dfnTypes.py",
    "chars": 7747,
    "preview": "from __future__ import annotations\n\nimport re\nfrom collections import defaultdict\n\nfrom .. import t\n\ndfnClassToType = {\n"
  },
  {
    "path": "bikeshed/config/main.py",
    "chars": 6028,
    "preview": "from __future__ import annotations\n\nimport os\nimport re\nimport time\n\nfrom .. import messages, t\n\n\ndef englishFromList(it"
  },
  {
    "path": "bikeshed/constants.py",
    "chars": 501,
    "preview": "from __future__ import annotations\n\nfrom .stringEnum import StringEnum\n\ndryRun: bool = False\nrefStatus: StringEnum = Str"
  },
  {
    "path": "bikeshed/datablocks.py",
    "chars": 37558,
    "preview": "# pylint: disable=unused-argument\nfrom __future__ import annotations\n\nimport io\nimport re\nfrom collections import Ordere"
  },
  {
    "path": "bikeshed/dfnpanels/__init__.py",
    "chars": 70,
    "preview": "from .dfnpanels import (\n    addDfnPanels,\n    addExternalDfnPanel,\n)\n"
  },
  {
    "path": "bikeshed/dfnpanels/dfn-panel.css",
    "chars": 2873,
    "preview": ":root {\n    --dfnpanel-bg: #ddd;\n    --dfnpanel-text: var(--text);\n    --dfnpanel-target-bg: #ffc;\n    --dfnpanel-target"
  },
  {
    "path": "bikeshed/dfnpanels/dfn-panel.js",
    "chars": 10920,
    "preview": "document.addEventListener(\"DOMContentLoaded\", ()=>{\n    genAllDfnPanels();\n\n    document.body.addEventListener(\"click\", "
  },
  {
    "path": "bikeshed/dfnpanels/dfnpanels.py",
    "chars": 3970,
    "preview": "from __future__ import annotations\n\nfrom collections import OrderedDict\n\nfrom .. import h, t\nfrom .. import messages as "
  },
  {
    "path": "bikeshed/dfns/__init__.py",
    "chars": 76,
    "preview": "from __future__ import annotations\n\nfrom .attributeInfo import annotateDfns\n"
  },
  {
    "path": "bikeshed/dfns/attributeInfo.py",
    "chars": 4660,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\n\nfrom .. import config, h, t\nfrom .. import messages as"
  },
  {
    "path": "bikeshed/doctypes/__init__.py",
    "chars": 97,
    "preview": "from .manager import NIL_GROUP, NIL_ORG, NIL_STATUS, Doctype, DoctypeManager, Group, Org, Status\n"
  },
  {
    "path": "bikeshed/doctypes/manager.py",
    "chars": 6100,
    "preview": "from __future__ import annotations\n\nimport dataclasses\n\nimport kdl\n\nfrom .. import t\nfrom . import utils\n\n\n@dataclasses."
  },
  {
    "path": "bikeshed/doctypes/utils.py",
    "chars": 9150,
    "preview": "from __future__ import annotations\n\nfrom .. import config, t\nfrom .. import messages as m\n\nif t.TYPE_CHECKING:\n    from "
  },
  {
    "path": "bikeshed/extensions.py",
    "chars": 233,
    "preview": "from __future__ import annotations\n\nfrom . import constants, retrieve, t\n\n\ndef load(doc: t.SpecT) -> None:\n    code = re"
  },
  {
    "path": "bikeshed/fingerprinting.py",
    "chars": 2988,
    "preview": "from __future__ import annotations\n\nfrom . import h, t\n\ntrackingVectorId = \"b732b3fe\"  # hashlib.md5(\"tracking-vector\")."
  },
  {
    "path": "bikeshed/fonts/README.md",
    "chars": 1734,
    "preview": "`bikeshed source --big-text` relies on a bespoke ASCII font format,\nspecified in [KDL](https://kdl.dev),\ndesigned to be "
  },
  {
    "path": "bikeshed/fonts/__init__.py",
    "chars": 61,
    "preview": "from .fonts import Font\nfrom .rewrite import replaceComments\n"
  },
  {
    "path": "bikeshed/fonts/bigblocks.bsfont",
    "chars": 3806,
    "preview": "config height=7\n\nglyphs {\n\" \" width=5\n\n\"A\" \"\n   ███\n  ██ ██\n ██   ██\n██     ██\n█████████\n██     ██\n██     ██\n\"\n\n\"B\" \"\n██"
  },
  {
    "path": "bikeshed/fonts/fonts.py",
    "chars": 6396,
    "preview": "#!/usr/bin/python3\nfrom __future__ import annotations\n\nimport argparse\nimport dataclasses\nimport string\n\nimport kdl\n\nif "
  },
  {
    "path": "bikeshed/fonts/rewrite.py",
    "chars": 2747,
    "preview": "from __future__ import annotations\n\nimport glob\nimport re\nimport sys\n\nfrom .. import messages as m\nfrom .. import t\n\nif "
  },
  {
    "path": "bikeshed/fonts/smallblocks.bsfont",
    "chars": 3010,
    "preview": "config height=7\n\nglyphs {\n\" \" width=3\n\nA \"\n ███▌\n▐█ ▐█\n█▌  █▌\n█▌  █▌\n█████▌\n█▌  █▌\n█▌  █▌\n\"\n\nB \"\n████▌\n█▌  █▌\n█▌  █▌\n███"
  },
  {
    "path": "bikeshed/func.py",
    "chars": 376,
    "preview": "from __future__ import annotations\n\nfrom . import t\n\n\nclass Functor:\n    # Pointed and Co-Pointed by default;\n    # over"
  },
  {
    "path": "bikeshed/h/__init__.py",
    "chars": 1905,
    "preview": "from . import parser\nfrom .dom import (\n    DuplicatedLinkText,\n    E,\n    addClass,\n    addOldIDs,\n    appendChild,\n   "
  },
  {
    "path": "bikeshed/h/dom.py",
    "chars": 39495,
    "preview": "from __future__ import annotations\n\nimport hashlib\nimport html\nimport re\nfrom collections import OrderedDict\n\nimport lxm"
  },
  {
    "path": "bikeshed/h/merge.py",
    "chars": 6243,
    "preview": "from __future__ import annotations\n\nimport abc\nimport dataclasses\nimport itertools\n\nfrom .. import messages as m\nfrom .."
  },
  {
    "path": "bikeshed/h/parser/__init__.py",
    "chars": 601,
    "preview": "from . import result\nfrom .main import (\n    debugNodes,\n    initialDocumentParse,\n    linesFromNodes,\n    nodesFromHtml"
  },
  {
    "path": "bikeshed/h/parser/main.py",
    "chars": 4474,
    "preview": "# pylint: skip-file\nfrom __future__ import annotations\n\nimport enum\nimport io\nimport os\nimport re\n\nfrom ... import const"
  },
  {
    "path": "bikeshed/h/parser/nodes.py",
    "chars": 29071,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\nfrom abc import ABCMeta, abstractmethod\nfrom collection"
  },
  {
    "path": "bikeshed/h/parser/parser.py",
    "chars": 116647,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\nfrom enum import Enum\n\nfrom ... import config, constant"
  },
  {
    "path": "bikeshed/h/parser/preds.py",
    "chars": 66776,
    "preview": "from __future__ import annotations\n\nxmlishTagnames = {\n    # SVG\n    \"animate\",\n    \"animateMotion\",\n    \"animateTransfo"
  },
  {
    "path": "bikeshed/h/parser/result.py",
    "chars": 509,
    "preview": "from __future__ import annotations\n\nfrom ... import t\n\nif t.TYPE_CHECKING:\n    type OkT[ValT] = tuple[ValT, int, t.Liter"
  },
  {
    "path": "bikeshed/h/parser/simpleparser.py",
    "chars": 14310,
    "preview": "from __future__ import annotations\n\nimport lxml.sax\n\nfrom ... import constants, t\nfrom ... import messages as m\n\n# This "
  },
  {
    "path": "bikeshed/h/parser/stream.py",
    "chars": 8556,
    "preview": "from __future__ import annotations\n\nimport bisect\nimport dataclasses\nfrom dataclasses import dataclass, field\n\nfrom ... "
  },
  {
    "path": "bikeshed/h/serializer.py",
    "chars": 12823,
    "preview": "from __future__ import annotations\n\nimport io\nimport itertools\n\nfrom .. import t\nfrom . import dom\n\nif t.TYPE_CHECKING:\n"
  },
  {
    "path": "bikeshed/headings.py",
    "chars": 5110,
    "preview": "from __future__ import annotations\n\nfrom . import config, h, t\nfrom . import messages as m\n\n\ndef processHeadings(doc: t."
  },
  {
    "path": "bikeshed/highlight/README.md",
    "chars": 728,
    "preview": "To regen the styles, edit and run the below\n\n```python\nfrom pygments import token, style\nfrom pygment.formatters import "
  },
  {
    "path": "bikeshed/highlight/__init__.py",
    "chars": 45,
    "preview": "from .highlight import addSyntaxHighlighting\n"
  },
  {
    "path": "bikeshed/highlight/highlight.py",
    "chars": 19362,
    "preview": "# pylint: disable=unused-argument\n\nfrom __future__ import annotations\n\nimport collections\nimport dataclasses\nimport iter"
  },
  {
    "path": "bikeshed/highlight/line-highlighting.css",
    "chars": 858,
    "preview": ":root {\n    --highlight-hover-bg: rgba(0, 0, 0, .05);\n}\n.line-numbered {\n    display: grid !important;\n    grid-template"
  },
  {
    "path": "bikeshed/highlight/line-numbers.css",
    "chars": 708,
    "preview": ":root {\n    --highlight-hover-bg: rgba(0, 0, 0, .05);\n}\n.line-numbered {\n    display: grid !important;\n    grid-template"
  },
  {
    "path": "bikeshed/highlight/syntax-highlighting.css",
    "chars": 7088,
    "preview": "code.highlight { padding: .1em; border-radius: .3em; }\npre.highlight, pre > code.highlight { display: block; padding: 1e"
  },
  {
    "path": "bikeshed/idl.py",
    "chars": 27647,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\n\nimport widlparser\n\nfrom . import config, h, t\nfrom . i"
  },
  {
    "path": "bikeshed/includes.py",
    "chars": 8232,
    "preview": "from __future__ import annotations\n\nimport hashlib\nimport itertools\nimport re\n\nfrom . import datablocks, h, markdown, t\n"
  },
  {
    "path": "bikeshed/inlineTags/__init__.py",
    "chars": 1652,
    "preview": "from __future__ import annotations\n\nfrom subprocess import PIPE, Popen\n\nfrom .. import constants, h, t\nfrom .. import me"
  },
  {
    "path": "bikeshed/issuelist.py",
    "chars": 11159,
    "preview": "# pylint: disable=R1732\n\nfrom __future__ import annotations\n\nimport dataclasses\nimport glob\nimport re\nimport sys\n\nfrom ."
  },
  {
    "path": "bikeshed/language.py",
    "chars": 185,
    "preview": "from __future__ import annotations\n\nimport dataclasses\n\n\n@dataclasses.dataclass\nclass Language:\n    name: str\n    native"
  },
  {
    "path": "bikeshed/lexers.py",
    "chars": 1616,
    "preview": "import re\n\nfrom pygments.lexer import RegexLexer, bygroups\nfrom pygments.token import Comment, Keyword, Literal, Name, P"
  },
  {
    "path": "bikeshed/line.py",
    "chars": 397,
    "preview": "from __future__ import annotations\n\nimport dataclasses\n\nfrom . import t\n\n\n@dataclasses.dataclass\nclass Line:\n    i: int\n"
  },
  {
    "path": "bikeshed/lint/__init__.py",
    "chars": 246,
    "preview": "from .accidental2119 import accidental2119\nfrom .brokenLinks import brokenLinks\nfrom .exampleIDs import exampleIDs\nfrom "
  },
  {
    "path": "bikeshed/lint/accidental2119.py",
    "chars": 1782,
    "preview": "from __future__ import annotations\n\nimport re\n\nfrom .. import h, t\nfrom .. import messages as m\n\n\ndef accidental2119(doc"
  },
  {
    "path": "bikeshed/lint/brokenLinks.py",
    "chars": 1708,
    "preview": "from __future__ import annotations\n\nimport logging\nimport time\n\nimport requests\n\nfrom .. import h, t\nfrom .. import mess"
  },
  {
    "path": "bikeshed/lint/exampleIDs.py",
    "chars": 372,
    "preview": "from __future__ import annotations\n\nfrom .. import h, t\nfrom .. import messages as m\n\n\ndef exampleIDs(doc: t.SpecT) -> N"
  },
  {
    "path": "bikeshed/lint/missingExposed.py",
    "chars": 1951,
    "preview": "from __future__ import annotations\n\nimport widlparser  # pylint: disable=unused-import\n\nfrom .. import messages as m\nfro"
  },
  {
    "path": "bikeshed/lint/requiredIDs.py",
    "chars": 423,
    "preview": "from __future__ import annotations\n\nfrom .. import h, t\nfrom .. import messages as m\n\n\ndef requiredIDs(doc: t.SpecT) -> "
  },
  {
    "path": "bikeshed/lint/unusedInternalDfns.py",
    "chars": 1169,
    "preview": "from __future__ import annotations\n\nfrom .. import h, t\nfrom .. import messages as m\nfrom ..config import dfnElementsSel"
  },
  {
    "path": "bikeshed/markdown/__init__.py",
    "chars": 44,
    "preview": "from .markdown import MarkdownConfig, parse\n"
  },
  {
    "path": "bikeshed/markdown/inlines.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "bikeshed/markdown/markdown.py",
    "chars": 24519,
    "preview": "from __future__ import annotations\n\nimport functools\nimport re\nfrom dataclasses import dataclass, field\n\nfrom .. import "
  },
  {
    "path": "bikeshed/mdn/__init__.py",
    "chars": 39,
    "preview": "from .mdnspeclinks import addMdnPanels\n"
  },
  {
    "path": "bikeshed/mdn/mdn-anno.css",
    "chars": 5747,
    "preview": ":root {\n\t--mdn-bg: #EEE;\n\t--mdn-shadow: #999;\n\t--mdn-nosupport-text: #ccc;\n\t--mdn-pass: green;\n\t--mdn-fail: red;\n}\n@medi"
  },
  {
    "path": "bikeshed/mdn/mdnspeclinks.py",
    "chars": 11123,
    "preview": "from __future__ import annotations\n\nimport json\nfrom collections import OrderedDict\n\nfrom .. import h, t\nfrom .. import "
  },
  {
    "path": "bikeshed/messages.py",
    "chars": 12924,
    "preview": "from __future__ import annotations\n\nimport contextlib\nimport dataclasses\nimport io\nimport json\nimport os\nimport sys\nfrom"
  },
  {
    "path": "bikeshed/metadata.py",
    "chars": 63356,
    "preview": "# pylint: disable=unused-argument\n\nfrom __future__ import annotations\n\nimport dataclasses\nimport json\nimport os\nimport r"
  },
  {
    "path": "bikeshed/outline.py",
    "chars": 1905,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport os\n\nfrom . import h, t\n\n\n@dataclasses.dataclass\nclass Outl"
  },
  {
    "path": "bikeshed/printjson.py",
    "chars": 2373,
    "preview": "from __future__ import annotations\n\nfrom . import h, t\nfrom . import messages as m\n\n\ndef printjson(x: t.Any, indent: str"
  },
  {
    "path": "bikeshed/publish.py",
    "chars": 2855,
    "preview": "# pylint: disable=R1732\n\nfrom __future__ import annotations\n\nimport contextlib\nimport logging\nimport tarfile\nimport temp"
  },
  {
    "path": "bikeshed/py.typed",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "bikeshed/pyg.py",
    "chars": 947,
    "preview": "import re\n\nfrom pygments import formatters, style, token\n\n# dark\ntext = \"#657b83\"\nbg = \"#002b36\"\n\n# light\n# text = \"#839"
  },
  {
    "path": "bikeshed/railroaddiagrams.py",
    "chars": 47407,
    "preview": "# -*- coding: utf-8 -*-\n# pylint: disable=arguments-renamed\n\nfrom __future__ import annotations\n\nimport math as Math\nfro"
  },
  {
    "path": "bikeshed/railroadparser.py",
    "chars": 8563,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport re\n\nfrom . import messages as m\nfrom . import railroaddiag"
  },
  {
    "path": "bikeshed/refs/__init__.py",
    "chars": 220,
    "preview": "from .external import ExternalRefsGroup, ExternalRefsManager, ExternalRefsSpec\nfrom .manager import ReferenceManager\nfro"
  },
  {
    "path": "bikeshed/refs/external.py",
    "chars": 2128,
    "preview": "from __future__ import annotations\n\nimport dataclasses as dc\n\nfrom .. import t\n\n\n@dc.dataclass\nclass ExternalRefsManager"
  },
  {
    "path": "bikeshed/refs/headingdata.py",
    "chars": 2474,
    "preview": "from __future__ import annotations\n\nfrom .. import h, t\nfrom .. import messages as m\n\n# Heading data for a spec is a dic"
  },
  {
    "path": "bikeshed/refs/manager.py",
    "chars": 40857,
    "preview": "from __future__ import annotations\n\nimport dataclasses\nimport json\nimport random\nimport re\nfrom collections import defau"
  },
  {
    "path": "bikeshed/refs/ref-hints.css",
    "chars": 732,
    "preview": ":root {\n    --ref-hint-bg: #ddd;\n    --ref-hint-text: var(--text);\n}\n@media (prefers-color-scheme: dark) {\n    :root {\n "
  },
  {
    "path": "bikeshed/refs/ref-hints.js",
    "chars": 6477,
    "preview": "function mkRefHint(link, ref) {\n    const linkText = link.textContent;\n    let dfnTextElements = '';\n    if (ref.display"
  },
  {
    "path": "bikeshed/refs/source.py",
    "chars": 16383,
    "preview": "from __future__ import annotations\n\nimport copy\nimport dataclasses\nimport re\nfrom collections import defaultdict\n\nfrom ."
  },
  {
    "path": "bikeshed/refs/utils.py",
    "chars": 6347,
    "preview": "from __future__ import annotations\n\nfrom collections import defaultdict\nfrom enum import Enum\n\nfrom .. import config, t\n"
  },
  {
    "path": "bikeshed/refs/wrapper.py",
    "chars": 2875,
    "preview": "from __future__ import annotations\n\nimport dataclasses\n\nfrom .. import t\n\n\nclass RefDataT(t.TypedDict, total=False):\n   "
  },
  {
    "path": "bikeshed/repository.py",
    "chars": 1300,
    "preview": "from __future__ import annotations\n\nimport abc\nimport dataclasses\n\n\n@dataclasses.dataclass\nclass Repository(metaclass=ab"
  },
  {
    "path": "bikeshed/result/__init__.py",
    "chars": 102,
    "preview": "from __future__ import annotations\n\nfrom result import Err, Ok, Result\n\nfrom .main import isErr, isOk\n"
  },
  {
    "path": "bikeshed/result/main.py",
    "chars": 242,
    "preview": "from __future__ import annotations\n\nfrom result import Err, Ok\n\nfrom .. import t\n\n\ndef isOk[ValT](x: t.Any) -> t.TypeIs["
  },
  {
    "path": "bikeshed/retrieve.py",
    "chars": 7134,
    "preview": "# pylint: disable=R1732\n\nfrom __future__ import annotations\n\nimport io\nimport os\n\nfrom . import InputSource, config, t\nf"
  },
  {
    "path": "bikeshed/semver-dev.txt",
    "chars": 5,
    "preview": "alpha"
  },
  {
    "path": "bikeshed/semver.txt",
    "chars": 6,
    "preview": "7.0.10"
  },
  {
    "path": "bikeshed/shorthands/__init__.py",
    "chars": 208,
    "preview": "from __future__ import annotations\n\nfrom .. import t\nfrom . import oldShorthands\n\n\ndef run(doc: t.SpecT) -> None:\n    ol"
  },
  {
    "path": "bikeshed/shorthands/oldShorthands.py",
    "chars": 5442,
    "preview": "from __future__ import annotations\n\nimport re\n\nfrom .. import config, h, t\n\n\ndef transformMarkdownIB(doc: t.SpecT) -> No"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-1_.data",
    "chars": 278,
    "preview": "\"1\"\n\"1\"\nenum-value\ntrust-token-api\ntrust-token-api\n1\ncurrent\nhttps://wicg.github.io/trust-token-api/#dom-tokenversion-1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-1d.data",
    "chars": 1016,
    "preview": "\"1d\"\n\"1d\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gputexturedimension-1d\n1\n1\nGPUTextureD"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-1s.data",
    "chars": 446,
    "preview": "1st <length>\n1st <length>\ndfn\ncss-backgrounds-3\ncss-backgrounds\n3\ncurrent\nhttps://drafts.csswg.org/css-backgrounds-3/#sh"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-1u.data",
    "chars": 466,
    "preview": "1-ua\n1-UA\ndfn\npresentation-api\npresentation-api\n1\ncurrent\nhttps://w3c.github.io/presentation-api/#dfn-1-ua\n\n\n-\n1-ua\n1-UA"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-24.data",
    "chars": 208,
    "preview": "24-bit depth\n24-bit depth\ndfn\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#24-bit-depth\n\n1\n-\n24-bit depth\n24"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-2d.data",
    "chars": 1699,
    "preview": "\"2d\"\n\"2d\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gputexturedimension-2d\n1\n1\nGPUTextureD"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-2g.data",
    "chars": 136,
    "preview": "2g\n2g\nenum-value\nnetinfo\nnetinfo\n1\ncurrent\nhttps://wicg.github.io/netinfo/#dom-effectiveconnectiontype-2g\n1\n1\nEffectiveC"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-2n.data",
    "chars": 446,
    "preview": "2nd <length>\n2nd <length>\ndfn\ncss-backgrounds-3\ncss-backgrounds\n3\ncurrent\nhttps://drafts.csswg.org/css-backgrounds-3/#sh"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-2u.data",
    "chars": 466,
    "preview": "2-ua\n2-UA\ndfn\npresentation-api\npresentation-api\n1\ncurrent\nhttps://w3c.github.io/presentation-api/#dfn-2-ua\n\n\n-\n2-ua\n2-UA"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-2x.data",
    "chars": 510,
    "preview": "\"2x\"\n\"2x\"\nenum-value\nwebaudio\nwebaudio\n1\ncurrent\nhttps://webaudio.github.io/web-audio-api/#dom-oversampletype-2x\n1\n1\nOve"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-34.data",
    "chars": 349,
    "preview": "3.4.1. generate report of type with data\n3.4.1. Generate report of type with data\ndfn\nreporting-1\nreporting\n1\ncurrent\nht"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-3d.data",
    "chars": 1905,
    "preview": "\"3d\"\n\"3d\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gputexturedimension-3d\n1\n1\nGPUTextureD"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-3f.data",
    "chars": 169,
    "preview": "3. feature query\n3. Feature Query\ndfn\nhandwriting-recognition\nhandwriting-recognition\n1\ncurrent\nhttps://wicg.github.io/h"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-3g.data",
    "chars": 136,
    "preview": "3g\n3g\nenum-value\nnetinfo\nnetinfo\n1\ncurrent\nhttps://wicg.github.io/netinfo/#dom-effectiveconnectiontype-3g\n1\n1\nEffectiveC"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-3r.data",
    "chars": 328,
    "preview": "3rd <length [0,∞]>\n3rd <length [0,∞]>\ndfn\ncss-backgrounds-3\ncss-backgrounds\n3\ncurrent\nhttps://drafts.csswg.org/css-backg"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-4c.data",
    "chars": 227,
    "preview": "4. create a handwriting recognizer\n4. Create a handwriting recognizer\ndfn\nhandwriting-recognition\nhandwriting-recognitio"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-4g.data",
    "chars": 136,
    "preview": "4g\n4g\nenum-value\nnetinfo\nnetinfo\n1\ncurrent\nhttps://wicg.github.io/netinfo/#dom-effectiveconnectiontype-4g\n1\n1\nEffectiveC"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-4t.data",
    "chars": 312,
    "preview": "4th <length>\n4th <length>\ndfn\ncss-backgrounds-3\ncss-backgrounds\n3\ncurrent\nhttps://drafts.csswg.org/css-backgrounds-3/#sh"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-4x.data",
    "chars": 779,
    "preview": "\"4x\"\n\"4x\"\nenum-value\nwebaudio\nwebaudio\n1\ncurrent\nhttps://webaudio.github.io/web-audio-api/#dom-oversampletype-4x\n1\n1\nOve"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-54.data",
    "chars": 427,
    "preview": "5.4 generate a network error report\n5.4 Generate a network error report\ndfn\nnetwork-error-logging\nnetwork-error-logging\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-55.data",
    "chars": 385,
    "preview": "5.5 deliver a network report\n5.5 Deliver a network report\ndfn\nnetwork-error-logging\nnetwork-error-logging\n1\ncurrent\nhttp"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-64.data",
    "chars": 215,
    "preview": "64-bit integer\n64-bit integer\ndfn\nwgsl\nwgsl\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/wgsl/#64-bit-integer\n\n1\n-\n64-bit i"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-6d.data",
    "chars": 161,
    "preview": "6dof\n6DoF\ndfn\nwebxr\nwebxr\n1\ncurrent\nhttps://immersive-web.github.io/webxr/#6dof\n\n1\n-\n6dof\n6DoF\ndfn\nwebxr\nwebxr\n1\nsnapsho"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-__.data",
    "chars": 9555,
    "preview": "\n\ndfn\nhtml\nhtml\n1\ncurrent\nhttps://html.spec.whatwg.org/multipage/media.html#value-track-kind-none\n\n1\n-\n\n\ndfn\ncss2\ncss\n1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a1.data",
    "chars": 314,
    "preview": "a1lx\na1lx\ndfn\nav1-avif\nav1-avif\n1\ncurrent\nhttps://aomediacodec.github.io/av1-avif/#av1layeredimageindexingproperty-a1lx\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a3.data",
    "chars": 232,
    "preview": "a3\na3\nvalue\ncss-page-3\ncss-page\n3\ncurrent\nhttps://drafts.csswg.org/css-page-3/#valdef-page-size-a3\n1\n1\n<page-size>\n-\na3\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a4.data",
    "chars": 232,
    "preview": "a4\na4\nvalue\ncss-page-3\ncss-page\n3\ncurrent\nhttps://drafts.csswg.org/css-page-3/#valdef-page-size-a4\n1\n1\n<page-size>\n-\na4\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a5.data",
    "chars": 232,
    "preview": "a5\na5\nvalue\ncss-page-3\ncss-page\n3\ncurrent\nhttps://drafts.csswg.org/css-page-3/#valdef-page-size-a5\n1\n1\n<page-size>\n-\na5\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a9.data",
    "chars": 252,
    "preview": "a98-rgb\na98-rgb\nvalue\ncss-color-4\ncss-color\n4\ncurrent\nhttps://drafts.csswg.org/css-color-4/#valdef-color-a98-rgb\n1\n1\ncol"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-a_.data",
    "chars": 6684,
    "preview": "a\nA\nattr-value\nhtml\nhtml\n1\ncurrent\nhttps://html.spec.whatwg.org/multipage/grouping-content.html#attr-ol-type-keyword-upp"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-aa.data",
    "chars": 2842,
    "preview": "\"aac\"\n\"aac\"\nenum-value\nwebcodecs-aac-codec-registration\nwebcodecs-aac-codec-registration\n1\ncurrent\nhttps://w3c.github.io"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ab.data",
    "chars": 33183,
    "preview": "\"aborted\"\n\"aborted\"\nenum-value\nbackground-fetch\nbackground-fetch\n1\ncurrent\nhttps://wicg.github.io/background-fetch/#dom-"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ac.data",
    "chars": 84341,
    "preview": "\"accelerometer\"\n\"accelerometer\"\npermission\norientation-event\norientation-event\n1\ncurrent\nhttps://w3c.github.io/deviceori"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ad.data",
    "chars": 67117,
    "preview": "\"add\"\n\"add\"\nenum-value\nweb-animations-1\nweb-animations\n1\ncurrent\nhttps://drafts.csswg.org/web-animations-1/#dom-composit"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ae.data",
    "chars": 1602,
    "preview": "AesCbcParams\nAesCbcParams\ndictionary\nwebcryptoapi\nwebcryptoapi\n1\ncurrent\nhttps://w3c.github.io/webcrypto/#dfn-AesCbcPara"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-af.data",
    "chars": 6429,
    "preview": "::after\n::after\nselector\ncss-pseudo-4\ncss-pseudo\n4\ncurrent\nhttps://drafts.csswg.org/css-pseudo-4/#selectordef-after\n1\n1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ag.data",
    "chars": 19247,
    "preview": "%AggregateError%\n%AggregateError%\nexception\necmascript\necmascript\n1\ncurrent\nhttps://tc39.es/ecma262/multipage/fundamenta"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ak.data",
    "chars": 160,
    "preview": "a known definite encoding\na known definite encoding\ndfn\nhtml\nhtml\n1\ncurrent\nhttps://html.spec.whatwg.org/multipage/parsi"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-al.data",
    "chars": 112482,
    "preview": "\"all\"\n\"all\"\nenum-value\ncss-nav-1\ncss-nav\n1\ncurrent\nhttps://drafts.csswg.org/css-nav-1/#dom-focusableareasearchmode-all\n1"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-am.data",
    "chars": 6175,
    "preview": "\"ambient\"\n\"ambient\"\nenum-value\naudio-session\naudio-session\n1\ncurrent\nhttps://w3c.github.io/audio-session/#dom-audiosessi"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-an.data",
    "chars": 90220,
    "preview": "\"ancestor\"\n\"ancestor\"\nenum-value\nlong-animation-frames\nlong-animation-frames\n1\ncurrent\nhttps://w3c.github.io/long-animat"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ap.data",
    "chars": 39951,
    "preview": "<apply>\n<apply>\ndfn\nmathml4\nmathml\n4\ncurrent\nhttps://w3c.github.io/mathml/#contm_apply\n\n1\n-\n<apply>\n<apply>\ndfn\nmathml4\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-aq.data",
    "chars": 1071,
    "preview": "aqua\naqua\ndfn\ncss-color-3\ncss-color\n3\ncurrent\nhttps://drafts.csswg.org/css-color-3/#aqua\n1\n1\n-\naqua\naqua\nvalue\ncss-color"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ar.data",
    "chars": 63922,
    "preview": "\"a-rate\"\n\"a-rate\"\nenum-value\nwebaudio\nwebaudio\n1\ncurrent\nhttps://webaudio.github.io/web-audio-api/#dom-automationrate-a-"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-as.data",
    "chars": 65005,
    "preview": "\"astc-10x10-unorm\"\n\"astc-10x10-unorm\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gputexture"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-at.data",
    "chars": 54863,
    "preview": "\"attachment\"\n\"attachment\"\nenum-value\nclipboard-apis\nclipboard-apis\n1\ncurrent\nhttps://w3c.github.io/clipboard-apis/#dom-p"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-au.data",
    "chars": 148647,
    "preview": "\"audio\"\n\"audio\"\nenum-value\nfetch\nfetch\n1\ncurrent\nhttps://fetch.spec.whatwg.org/#dom-requestdestination-audio\n1\n1\nRequest"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-av.data",
    "chars": 29496,
    "preview": "\"avc\"\n\"avc\"\nenum-value\nwebcodecs-avc-codec-registration\nwebcodecs-avc-codec-registration\n1\ncurrent\nhttps://w3c.github.io"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-aw.data",
    "chars": 684,
    "preview": "Await\nAwait\nabstract-op\necmascript\necmascript\n1\ncurrent\nhttps://tc39.es/ecma262/multipage/control-abstraction-objects.ht"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ax.data",
    "chars": 8039,
    "preview": "<axis>\n<axis>\ntype\nscroll-animations-1\nscroll-animations\n1\ncurrent\nhttps://drafts.csswg.org/scroll-animations-1/#typedef"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ay.data",
    "chars": 1228,
    "preview": "ay\nay\nattribute\ncss-typed-om-1\ncss-typed-om\n1\ncurrent\nhttps://drafts.css-houdini.org/css-typed-om-1/#dom-cssskew-ay\n1\n1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-az.data",
    "chars": 2765,
    "preview": "\"aztec\"\n\"aztec\"\nenum-value\nshape-detection-api\nshape-detection-api\n1\ncurrent\nhttps://wicg.github.io/shape-detection-api/"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-b4.data",
    "chars": 232,
    "preview": "b4\nb4\nvalue\ncss-page-3\ncss-page\n3\ncurrent\nhttps://drafts.csswg.org/css-page-3/#valdef-page-size-b4\n1\n1\n<page-size>\n-\nb4\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-b5.data",
    "chars": 232,
    "preview": "b5\nb5\nvalue\ncss-page-3\ncss-page\n3\ncurrent\nhttps://drafts.csswg.org/css-page-3/#valdef-page-size-b5\n1\n1\n<page-size>\n-\nb5\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-b_.data",
    "chars": 7633,
    "preview": "b\nb\nattribute\ncss-typed-om-1\ncss-typed-om\n1\ncurrent\nhttps://drafts.css-houdini.org/css-typed-om-1/#dom-csshwb-b\n1\n1\nCSSH"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ba.data",
    "chars": 75833,
    "preview": "\"babble\"\n\"babble\"\nenum-value\nwebusb\nwebusb\n1\ncurrent\nhttps://wicg.github.io/webusb/#dom-usbtransferstatus-babble\n1\n1\nUSB"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bc.data",
    "chars": 4689,
    "preview": "\"bc1-rgba-unorm\"\n\"bc1-rgba-unorm\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gputextureform"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bd.data",
    "chars": 1669,
    "preview": "bd_addr\nBD_ADDR\ndfn\nweb-bluetooth\nweb-bluetooth\n1\ncurrent\nhttps://webbluetoothcg.github.io/web-bluetooth/#bd_addr\n\n1\n-\nb"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-be.data",
    "chars": 21706,
    "preview": "\"belowThreshold\"\n\"belowThreshold\"\nenum-value\nturtledove\nturtledove\n1\ncurrent\nhttps://wicg.github.io/turtledove/#dom-kano"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bf.data",
    "chars": 461,
    "preview": "bfc\nBFC\ndfn\ncss-display-3\ncss-display\n3\ncurrent\nhttps://drafts.csswg.org/css-display-3/#bfc\n1\n1\n-\nbfc\nBFC\ndfn\ncss-displa"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bg.data",
    "chars": 5111,
    "preview": "\"BGRA\"\n\"BGRA\"\nenum-value\nwebcodecs\nwebcodecs\n1\ncurrent\nhttps://w3c.github.io/webcodecs/#dom-videopixelformat-bgra\n1\n1\nVi"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bi.data",
    "chars": 43259,
    "preview": "%BigInt%\n%BigInt%\ninterface\necmascript\necmascript\n1\ncurrent\nhttps://tc39.es/ecma262/multipage/numbers-and-dates.html#sec"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bl.data",
    "chars": 71488,
    "preview": "\"ble\"\n\"ble\"\nenum-value\nwebauthn-3\nwebauthn\n3\ncurrent\nhttps://w3c.github.io/webauthn/#dom-authenticatortransport-ble\n1\n1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bm.data",
    "chars": 243,
    "preview": "bmp\nBMP\ndfn\ni18n-glossary\ni18n-glossary\n1\ncurrent\nhttps://w3c.github.io/i18n-glossary/#dfn-basic-multilingual-plane\n1\n\n-"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bo.data",
    "chars": 95925,
    "preview": "\"border\"\n\"border\"\nenum-value\ncssom-view-1\ncssom-view\n1\ncurrent\nhttps://drafts.csswg.org/cssom-view-1/#dom-cssboxtype-bor"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-br.data",
    "chars": 30762,
    "preview": "br/edr bonding procedure\nBR/EDR Bonding Procedure\ndfn\nweb-bluetooth\nweb-bluetooth\n1\ncurrent\nhttps://webbluetoothcg.githu"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bs.data",
    "chars": 326,
    "preview": "bs\nBS\ndfn\nwebauthn-3\nwebauthn\n3\ncurrent\nhttps://w3c.github.io/webauthn/#authdata-flags-bs\n\n1\nauthData/flags\n-\nbs\nBS\ndfn\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bt.data",
    "chars": 4763,
    "preview": "\"bt2020\"\n\"bt2020\"\nenum-value\nwebcodecs\nwebcodecs\n1\ncurrent\nhttps://w3c.github.io/webcodecs/#dom-videocolorprimaries-bt20"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bu.data",
    "chars": 49516,
    "preview": "\"bulk\"\n\"bulk\"\nenum-value\nwebusb\nwebusb\n1\ncurrent\nhttps://wicg.github.io/webusb/#dom-usbendpointtype-bulk\n1\n1\nUSBEndpoint"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-bv.data",
    "chars": 180,
    "preview": "<bvar>\n<bvar>\ndfn\nmathml4\nmathml\n4\ncurrent\nhttps://w3c.github.io/mathml/#contm_bvar\n\n1\n-\n<bvar>\n<bvar>\ndfn\nmathml4\nmathm"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-by.data",
    "chars": 20637,
    "preview": "\"byob\"\n\"byob\"\nenum-value\nstreams\nstreams\n1\ncurrent\nhttps://streams.spec.whatwg.org/#dom-readablestreamreadermode-byob\n1\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-c0.data",
    "chars": 492,
    "preview": "c0 control\nc0 control\ndfn\ninfra\ninfra\n1\ncurrent\nhttps://infra.spec.whatwg.org/#c0-control\n1\n1\n-\nc0 control or space\nc0 c"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-c_.data",
    "chars": 3117,
    "preview": "c\nC\ndfn\ntracking-dnt\ntracking-dnt\n1\ncurrent\nhttps://w3c.github.io/dnt/drafts/tracking-dnt.html#dfn-c\n\n\n-\nc\nc\nattribute\nc"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ca.data",
    "chars": 134265,
    "preview": "\"cache\"\n\"cache\"\nenum-value\nservice-workers\nservice-workers\n1\ncurrent\nhttps://w3c.github.io/ServiceWorker/#dom-routersour"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-cb.data",
    "chars": 1217,
    "preview": "\"cbcs\"\n\"cbcs\"\ndfn\nencrypted-media-2\nencrypted-media\n2\ncurrent\nhttps://w3c.github.io/encrypted-media/#scheme-cbcs\n\n\n-\n\"cb"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-cc.data",
    "chars": 4002,
    "preview": "\"ccw\"\n\"ccw\"\nenum-value\nwebgpu\nwebgpu\n1\ncurrent\nhttps://gpuweb.github.io/gpuweb/#dom-gpufrontface-ccw\n1\n1\nGPUFrontFace\n-\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-cd.data",
    "chars": 2160,
    "preview": "<cdc-token>\n<CDC-token>\ntype\ncss-syntax-3\ncss-syntax\n3\ncurrent\nhttps://drafts.csswg.org/css-syntax-3/#typedef-cdc-token\n"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-ce.data",
    "chars": 22259,
    "preview": "\"ceil\"\n\"ceil\"\nenum-value\nwebnn\nwebnn\n1\ncurrent\nhttps://webmachinelearning.github.io/webnn/#dom-mlroundingtype-ceil\n1\n1\nM"
  },
  {
    "path": "bikeshed/spec-data/readonly/anchors/anchors-cf.data",
    "chars": 853,
    "preview": "<cf-image>\n<cf-image>\ntype\ncss-images-4\ncss-images\n4\ncurrent\nhttps://drafts.csswg.org/css-images-4/#typedef-cf-image\n1\n1"
  }
]

// ... and 4094 more files (download for full content)

About this extraction

This page contains the full source code of the speced/bikeshed GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4294 files (194.1 MB), approximately 26.6M tokens, and a symbol index with 1397 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!