From 26a7079f56c926d8c14fc926d095f22c26b33548 Mon Sep 17 00:00:00 2001
From: Sid Vishnoi <8426945+sidvishnoi@users.noreply.github.com>
Date: Mon, 29 Mar 2021 14:39:57 +0530
Subject: [PATCH 01/19] tests(build): fix fileExists check, remove chai, run in
CI (#3408)
- Fix fileExists check in `test-build.js` (`stats.fileExists()` is not a function)
- Remove chai dependency, use jasmine's matchers
- Cleanup `builds` dir after running `test:build`
- Run `test:build` in CI
---
.github/workflows/pr.yml | 7 +++---
package-lock.json | 53 ----------------------------------------
package.json | 1 -
tests/test-build.js | 30 ++++++++++++++++-------
4 files changed, 24 insertions(+), 67 deletions(-)
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index be33aac3c1..6c4a3600f2 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -46,10 +46,9 @@ jobs:
with:
path: ~/.npm
key: ${{ runner.os }}-node-12-${{ hashFiles('**/package-lock.json') }}
- - name: install & build
- run: |
- npm ci
- npm run build:w3c
+ - run: npm ci
+ - run: npm run test:build
+ - run: npm run build:w3c
- run: npm run test:headless
test-karma:
diff --git a/package-lock.json b/package-lock.json
index 7a3bb8c413..30b245650e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -514,12 +514,6 @@
"es-abstract": "^1.17.0-next.1"
}
},
- "assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true
- },
"astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -762,20 +756,6 @@
"upper-case": "^1.1.1"
}
},
- "chai": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
- "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
- "dev": true,
- "requires": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.2",
- "deep-eql": "^3.0.1",
- "get-func-name": "^2.0.0",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.5"
- }
- },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -787,12 +767,6 @@
"supports-color": "^5.3.0"
}
},
- "check-error": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
- "dev": true
- },
"chokidar": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
@@ -1109,15 +1083,6 @@
"ms": "2.1.2"
}
},
- "deep-eql": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
- "dev": true,
- "requires": {
- "type-detect": "^4.0.0"
- }
- },
"deep-equal": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz",
@@ -1986,12 +1951,6 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
- "get-func-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
- "dev": true
- },
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -3130,12 +3089,6 @@
"pify": "^2.0.0"
}
},
- "pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true
- },
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -4247,12 +4200,6 @@
"prelude-ls": "^1.2.1"
}
},
- "type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true
- },
"type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
diff --git a/package.json b/package.json
index e1773ec245..785d653d58 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,6 @@
"@types/marked": "^2.0.0",
"@types/pluralize": "0.0.29",
"boxen": "^5.0.0",
- "chai": "^4.3.4",
"chokidar": "^3.5.1",
"clean-css": "^5.1.2",
"epipebomb": "^1.0.0",
diff --git a/tests/test-build.js b/tests/test-build.js
index 673b3de59a..44387a99f3 100644
--- a/tests/test-build.js
+++ b/tests/test-build.js
@@ -1,18 +1,26 @@
/* eslint-env node */
-const { readFile, lstat } = require("fs").promises;
+const {
+ constants: { F_OK },
+ promises: { readFile, access },
+} = require("fs");
+const { execSync } = require("child_process");
const path = require("path");
-const expect = require("chai").expect;
const { Builder } = require("../tools/builder");
async function fileExists(filePath) {
- const stats = await lstat(filePath);
- return stats.fileExists();
+ try {
+ await access(filePath, F_OK);
+ return true;
+ } catch {
+ return false;
+ }
}
describe("builder (tool)", () => {
jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000;
const profiles = ["w3c", "geonovum"];
+ const rootDir = path.join(__dirname, "..");
beforeAll(async () => {
await Promise.all(
@@ -20,16 +28,20 @@ describe("builder (tool)", () => {
);
});
+ afterAll(() => {
+ execSync("git restore builds", { cwd: rootDir });
+ });
+
for (const profile of profiles) {
- const profileFile = path.join(__dirname, `../builds/respec-${profile}.js`);
- const mapFile = path.join(__dirname, `../builds/respec-${profile}.js.map`);
+ const profileFile = path.join(rootDir, `builds/respec-${profile}.js`);
+ const mapFile = path.join(rootDir, `builds/respec-${profile}.js.map`);
it(`builds the "${profile}" profile and sourcemap`, async () => {
- expect(await fileExists(profileFile)).to.equal(true);
- expect(await fileExists(mapFile)).to.equal(true);
+ await expectAsync(fileExists(profileFile)).toBeResolvedTo(true);
+ await expectAsync(fileExists(mapFile)).toBeResolvedTo(true);
});
it(`includes sourcemap link for "${profile}"`, async () => {
const source = await readFile(profileFile, "utf-8");
- expect(source.includes(`${profile}.js.map`)).to.equal(true);
+ expect(source).toContain(`${profile}.js.map`);
});
}
});
From a4e5709feccec43af6c8b2a900012f61dd10db8c Mon Sep 17 00:00:00 2001
From: Sid Vishnoi <8426945+sidvishnoi@users.noreply.github.com>
Date: Mon, 29 Mar 2021 15:00:38 +0530
Subject: [PATCH 02/19] refactor(tools/dev-server): add promisified KarmaServer
(#3410)
---
tools/dev-server.js | 91 +++++++++++++++++++++++++++++----------------
1 file changed, 59 insertions(+), 32 deletions(-)
diff --git a/tools/dev-server.js b/tools/dev-server.js
index 724002a700..1082eb9dd0 100644
--- a/tools/dev-server.js
+++ b/tools/dev-server.js
@@ -13,34 +13,66 @@ const { Builder } = require("./builder");
const KARMA_PORT = 9876;
const SERVE_PORT = 5000;
+class KarmaServer {
+ /**
+ * @param {string} configFile
+ * @param {string} [browser]
+ */
+ constructor(configFile, browser, grep = "") {
+ const browsers = browser ? [browser] : [];
+ this._karmaConfig = karma.config.parseConfig(configFile, {
+ browsers,
+ autoWatch: false,
+ port: KARMA_PORT,
+ logLevel: karma.constants.LOG_INFO,
+ client: {
+ args: ["--grep", grep],
+ },
+ mochaReporter: { ignoreSkipped: true },
+ });
+ this._isActive = null;
+ }
+
+ start() {
+ this.karmaServer = new karma.Server(this._karmaConfig);
+ this.karmaServer.start();
+ return new Promise(resolve =>
+ this.karmaServer.once("browsers_ready", resolve)
+ );
+ }
+
+ stop() {
+ return new Promise(resolve =>
+ karma.stopper.stop(this._karmaConfig, resolve)
+ );
+ }
+
+ async run() {
+ if (this._isActive) return;
+ this._isActive = true;
+ karma.runner.run(this._karmaConfig, () => {});
+ await new Promise(resolve =>
+ this.karmaServer.once("run_complete", resolve)
+ );
+ this._isActive = false;
+ }
+}
+
sade("./tools/dev-server.js", true)
.option("-p, --profile", "Name of profile to build.", "w3c")
.option("-i, --interactive", "Run in interactive mode.", false)
- .option(
- "--browser",
- 'Browser for Karma unit tests (e.g., "Chrome"). Multiple allowed.'
- )
+ .option("--browser", 'Browser for Karma unit tests (e.g., "Chrome").')
.option("--grep", "Run specific tests using karma --grep")
.action(opts => run(opts))
.parse(process.argv);
-function run(args) {
+async function run(args) {
let isActive = false;
- const karmaConfig = karma.config.parseConfig(
+ const karmaServer = new KarmaServer(
path.join(__dirname, "../karma.conf.js"),
- {
- browsers:
- typeof args.browser === "string" ? [args.browser] : args.browser,
- autoWatch: false,
- port: KARMA_PORT,
- logLevel: karma.constants.LOG_WARN,
- client: {
- args: ["--grep", args.grep || ""],
- },
- mochaReporter: { ignoreSkipped: true },
- }
+ args.browser,
+ args.grep
);
- const karmaServer = new karma.Server(karmaConfig);
const devServer = createServer((req, res) => serve(req, res, serveConfig));
devServer.on("error", onError);
@@ -59,11 +91,9 @@ function run(args) {
printWelcomeMessage(args);
- karmaServer.start();
+ await karmaServer.start();
devServer.listen(SERVE_PORT);
- karmaServer.on("browsers_ready", () =>
- buildAndTest({ profile: args.profile })
- );
+ await buildAndTest({ profile: args.profile });
function registerStdinHandler() {
// https://stackoverflow.com/a/12506613
@@ -80,11 +110,9 @@ function run(args) {
switch (key) {
case "\u0003": // ctrl-c (end of text)
- case "q": {
- return karma.stopper.stop(karmaConfig, code => {
- setTimeout(() => process.exit(code), 0);
- });
- }
+ case "q":
+ await karmaServer.stop();
+ return process.exit(0);
case "t":
return await buildAndTest();
case "T":
@@ -105,7 +133,7 @@ function run(args) {
if (!preventBuild) {
await Builder.build({ name: args.profile, debug: true });
}
- karma.runner.run(karmaConfig, () => {});
+ await karmaServer.run();
} catch (err) {
console.error(colors.error(err.stack));
} finally {
@@ -113,11 +141,10 @@ function run(args) {
}
}
- function onError(err) {
+ async function onError(err) {
console.error(colors.error(err.stack));
- karma.stopper.stop(karmaConfig, () => {
- process.exit(1);
- });
+ await karmaServer.stop();
+ process.exit(1);
}
async function onFileChange(_event, file) {
From d66c31e9ac1d34e618987645d29cec6ff015fcc6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marcos=20C=C3=A1ceres?= "+e+" An error occurred: An error occurred:Some title
Test interface
+ [Exposed=Window]
interface Test {
undefined foo();
};
diff --git a/tests/spec/w3c/headers-spec.js b/tests/spec/w3c/headers-spec.js
index 454ae6d49a..c23808feeb 100644
--- a/tests/spec/w3c/headers-spec.js
+++ b/tests/spec/w3c/headers-spec.js
@@ -1409,6 +1409,67 @@ describe("W3C — Headers", () => {
});
});
+ describe("wgPatentPolicy", () => {
+ it("supports wgPatentPolicy as string", async () => {
+ const ops = makeStandardOps({
+ wgPatentPolicy: "PP2020",
+ });
+ const doc = await makeRSDoc(ops, simpleSpecURL);
+ expect(doc.respec.errors).toHaveSize(0);
+ const patentPolicyLink = doc.querySelector(
+ "#sotd a[href='https://www.w3.org/Consortium/Patent-Policy/']"
+ );
+ expect(patentPolicyLink).toBeTruthy();
+ });
+
+ it("supports wgPatentPolicy as an array", async () => {
+ const ops = makeStandardOps({
+ wgPatentPolicy: ["PP2020", "PP2020"],
+ });
+ const doc = await makeRSDoc(ops, simpleSpecURL);
+ expect(doc.respec.errors).toHaveSize(0);
+ const patentPolicyLink = doc.querySelector(
+ "#sotd a[href='https://www.w3.org/Consortium/Patent-Policy/']"
+ );
+ expect(patentPolicyLink).toBeTruthy();
+ });
+
+ it("errors when the patent policy is invalid", async () => {
+ const ops = makeStandardOps({
+ wgPatentPolicy: "NOT A Patent Policy",
+ });
+ const doc = await makeRSDoc(ops, simpleSpecURL);
+ expect(doc.respec.errors).toHaveSize(1);
+ const [error] = doc.respec.errors;
+ expect(error.plugin).toBe("w3c/headers");
+ expect(error.message).toContain("Invalid [`wgPatentPolicy`]");
+ });
+
+ it("errors when patent policies don't match", async () => {
+ const ops = makeStandardOps({
+ wgPatentPolicy: ["PP2017", "PP2020"],
+ });
+ const doc = await makeRSDoc(ops, simpleSpecURL);
+ expect(doc.respec.errors).toHaveSize(1);
+ const [error] = doc.respec.errors;
+ expect(error.plugin).toBe("w3c/headers");
+ expect(error.message).toContain("must use the same patent policy");
+ });
+
+ it("errors when some patent policy is invalid", async () => {
+ const ops = makeStandardOps({
+ wgPatentPolicy: ["PP2020", "NOT A Patent Policy", "PP2017"],
+ });
+ const doc = await makeRSDoc(ops, simpleSpecURL);
+ expect(doc.respec.errors).toHaveSize(2);
+ const [error1, error2] = doc.respec.errors;
+ expect(error1.plugin).toBe("w3c/headers");
+ expect(error1.message).toContain("Invalid [`wgPatentPolicy`]");
+ expect(error2.plugin).toBe("w3c/headers");
+ expect(error2.message).toContain("must use the same patent policy");
+ });
+ });
+
describe("wgId, data-deliverer, and isNote", () => {
it("derives the wgId from wgPatentURI and adds data-deliverer", async () => {
const ops = makeStandardOps();
From 0496fa97ff65b4b4fabaa67021c06e1f2f562e5f Mon Sep 17 00:00:00 2001
From: Sid Vishnoi <8426945+sidvishnoi@users.noreply.github.com>
Date: Mon, 29 Mar 2021 15:09:51 +0530
Subject: [PATCH 04/19] v26.4.1
---
builds/respec-dini.js | 311 +++++++++++++-----
builds/respec-dini.js.map | 2 +-
builds/respec-geonovum.js | 360 +++++++++++++--------
builds/respec-geonovum.js.map | 2 +-
builds/respec-highlight.js | 1 +
builds/respec-w3c.js | 576 ++++++++++++++++++++++------------
builds/respec-w3c.js.map | 2 +-
builds/respec-worker.js | 1 -
package-lock.json | 2 +-
package.json | 2 +-
10 files changed, 847 insertions(+), 412 deletions(-)
create mode 100644 builds/respec-highlight.js
diff --git a/builds/respec-dini.js b/builds/respec-dini.js
index 989d7bf9f6..330c999b8c 100644
--- a/builds/respec-dini.js
+++ b/builds/respec-dini.js
@@ -1,30 +1,140 @@
-window.respecVersion="26.4.0",function(){"use strict";window.addEventListener("error",e=>{console.error(e.error,e.message,e)});const e=[Promise.resolve().then((function(){return ft})),Promise.resolve().then((function(){return Ht})),Promise.resolve().then((function(){return Zt})),Promise.resolve().then((function(){return s})),Promise.resolve().then((function(){return qn})),Promise.resolve().then((function(){return Fn})),Promise.resolve().then((function(){return Un})),Promise.resolve().then((function(){return Vn})),Promise.resolve().then((function(){return Ct})),Promise.resolve().then((function(){return gt})),Promise.resolve().then((function(){return Gn})),Promise.resolve().then((function(){return dr})),Promise.resolve().then((function(){return hr})),Promise.resolve().then((function(){return mr})),Promise.resolve().then((function(){return wr})),Promise.resolve().then((function(){return Eo})),Promise.resolve().then((function(){return Lo})),Promise.resolve().then((function(){return No})),Promise.resolve().then((function(){return Ro})),Promise.resolve().then((function(){return Oo})),Promise.resolve().then((function(){return Bo})),Promise.resolve().then((function(){return Vo})),Promise.resolve().then((function(){return Go})),Promise.resolve().then((function(){return Ur})),Promise.resolve().then((function(){return mi})),Promise.resolve().then((function(){return si})),Promise.resolve().then((function(){return ro})),Promise.resolve().then((function(){return bi})),Promise.resolve().then((function(){return wi})),Promise.resolve().then((function(){return Ci})),Promise.resolve().then((function(){return Li})),Promise.resolve().then((function(){return Ti})),Promise.resolve().then((function(){return Mi})),Promise.resolve().then((function(){return Zi})),Promise.resolve().then((function(){return Vi})),Promise.resolve().then((function(){return Qi})),Promise.resolve().then((function(){return os})),Promise.resolve().then((function(){return us})),Promise.resolve().then((function(){return fs})),Promise.resolve().then((function(){return hs})),Promise.resolve().then((function(){return gs})),Promise.resolve().then((function(){return $s})),Promise.resolve().then((function(){return Ls})),Promise.resolve().then((function(){return pn}))];(async()=>{const[t,{ui:n},...r]=await Promise.all(e);try{n.show(),await async function(){"loading"===document.readyState&&await new Promise(e=>document.addEventListener("DOMContentLoaded",e))}(),await t.runAll(r)}finally{n.enable()}})().catch(e=>{console.error(e)});const t=!!window.require;if(!t){const e=function(e,t){const n=e.map(e=>{if(!(e in window.require.modules))throw new Error("Unsupported dependency name: "+e);return window.require.modules[e]});Promise.all(n).then(e=>t(...e))};e.modules={},window.require=e}function n(e,n){t||(window.require.modules[e]=n)}const r=document.documentElement;r&&!r.hasAttribute("lang")&&(r.lang="en",r.hasAttribute("dir")||(r.dir="ltr"));const o={},i=r.lang;var s=Object.freeze({__proto__:null,name:"core/l10n",l10n:o,lang:i,run:function(e){e.l10n=o[i]||o.en}});let a,c;const l=new WeakMap,u=new WeakMap,d=new WeakMap,f=new WeakMap,p=new WeakMap;let h={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return u.get(e);if("objectStoreNames"===t)return e.objectStoreNames||d.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return b(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function m(e){return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?(c||(c=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(w(this),t),b(l.get(this))}:function(...t){return b(e.apply(w(this),t))}:function(t,...n){const r=e.call(w(this),t,...n);return d.set(r,t.sort?t.sort():[t]),b(r)}}function g(e){return"function"==typeof e?m(e):(e instanceof IDBTransaction&&function(e){if(u.has(e))return;const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("complete",o),e.removeEventListener("error",i),e.removeEventListener("abort",i)},o=()=>{t(),r()},i=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",o),e.addEventListener("error",i),e.addEventListener("abort",i)});u.set(e,t)}(e),t=e,(a||(a=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])).some(e=>t instanceof e)?new Proxy(e,h):e);var t}function b(e){if(e instanceof IDBRequest)return function(e){const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("success",o),e.removeEventListener("error",i)},o=()=>{t(b(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",o),e.addEventListener("error",i)});return t.then(t=>{t instanceof IDBCursor&&l.set(t,e)}).catch(()=>{}),p.set(t,e),t}(e);if(f.has(e))return f.get(e);const t=g(e);return t!==e&&(f.set(e,t),p.set(t,e)),t}const w=e=>p.get(e);const y=["get","getKey","getAll","getAllKeys","count"],v=["put","add","delete","clear"],k=new Map;function x(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(k.get(t))return k.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,o=v.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!o&&!y.includes(n))return;const i=async function(e,...t){const i=this.transaction(e,o?"readwrite":"readonly");let s=i.store;return r&&(s=s.index(t.shift())),(await Promise.all([s[n](...t),o&&i.done]))[0]};return k.set(t,i),i}h=(e=>({...e,get:(t,n,r)=>x(t,n)||e.get(t,n,r),has:(t,n)=>!!x(t,n)||e.has(t,n)}))(h);var $=Object.freeze({__proto__:null,deleteDB:function(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",()=>t()),b(n).then(()=>{})},openDB:function(e,t,{blocked:n,upgrade:r,blocking:o,terminated:i}={}){const s=indexedDB.open(e,t),a=b(s);return r&&s.addEventListener("upgradeneeded",e=>{r(b(s.result),e.oldVersion,e.newVersion,b(s.transaction))}),n&&s.addEventListener("blocked",()=>n()),a.then(e=>{i&&e.addEventListener("close",()=>i()),o&&e.addEventListener("versionchange",()=>o())}).catch(()=>{}),a},unwrap:w,wrap:b});var _,E=(function(e){function t(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}e.exports={defaults:{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1},getDefaults:t,changeDefaults:function(t){e.exports.defaults=t}}}(_={exports:{}},_.exports),_.exports);const S=/[&<>"']/,C=/[&<>"']/g,A=/[<>"']|&(?!#?\w+;)/,L=/[<>"']|&(?!#?\w+;)/g,T={"&":"&","<":"<",">":">",'"':""","'":"'"},z=e=>T[e];const N=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function R(e){return e.replace(N,(e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):"")}const j=/(^|[^\[])\^/g;const D=/[^\w:]/g,P=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;const O={},I=/^[^:]+:\/*[^/]*$/,q=/^([^:]+:)[\s\S]*$/,M=/^([^:]+:\/*[^/]*)[\s\S]*$/;function F(e,t){O[" "+e]||(I.test(e)?O[" "+e]=e+"/":O[" "+e]=B(e,"/",!0));const n=-1===(e=O[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(q,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(M,"$1")+t:e+t}function B(e,t,n){const r=e.length;if(0===r)return"";let o=0;for(;o
\n":"'+(n?e:fe(e,!0))+"
\n"}blockquote(e){return""+(n?e:fe(e,!0))+"
\n"+e+"
\n"}html(e){return e}heading(e,t,n,r){return this.options.headerIds?"
\n":"
\n"}list(e,t,n){const r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"}listitem(e){return"\n\n"+e+"\n"+t+"
\n"}tablerow(e){return"\n"+e+" \n"}tablecell(e,t){const n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+""+n+">\n"}strong(e){return""+e+""}em(e){return""+e+""}codespan(e){return""+e+"
"}br(){return this.options.xhtml?"
":"
"}del(e){return""+e+""}link(e,t,n){if(null===(e=de(this.options.sanitize,this.options.baseUrl,e)))return n;let r='"+n+"",r}image(e,t,n){if(null===(e=de(this.options.sanitize,this.options.baseUrl,e)))return n;let r='":">",r}text(e){return e}},he=class{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,n){return""+n}image(e,t,n){return""+n}br(){return""}},me=class{constructor(){this.seen={}}serialize(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")}getNextSafeSlug(e,t){let n=e,r=0;if(this.seen.hasOwnProperty(n)){r=this.seen[e];do{r++,n=e+"-"+r}while(this.seen.hasOwnProperty(n))}return t||(this.seen[e]=r,this.seen[n]=0),n}slug(e,t={}){const n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)}};const{defaults:ge}=E,{unescape:be}=W;var we=class e{constructor(e){this.options=e||ge,this.options.renderer=this.options.renderer||new pe,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new he,this.slugger=new me}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e,t=!0){let n,r,o,i,s,a,c,l,u,d,f,p,h,m,g,b,w,y,v="";const k=e.length;for(n=0;n"+ke(e.message+"",!0)+"
";throw e}}Ee.options=Ee.setOptions=function(e){return ye(Ee.defaults,e),$e(Ee.defaults),Ee},Ee.getDefaults=xe,Ee.defaults=_e,Ee.use=function(e){const t=ye({},e);if(e.renderer){const n=Ee.defaults.renderer||new pe;for(const t in e.renderer){const r=n[t];n[t]=(...o)=>{let i=e.renderer[t].apply(n,o);return!1===i&&(i=r.apply(n,o)),i}}t.renderer=n}if(e.tokenizer){const n=Ee.defaults.tokenizer||new G;for(const t in e.tokenizer){const r=n[t];n[t]=(...o)=>{let i=e.tokenizer[t].apply(n,o);return!1===i&&(i=r.apply(n,o)),i}}t.tokenizer=n}if(e.walkTokens){const n=Ee.defaults.walkTokens;t.walkTokens=t=>{e.walkTokens(t),n&&n(t)}}Ee.setOptions(t)},Ee.walkTokens=function(e,t){for(const n of e)switch(t(n),n.type){case"table":for(const e of n.tokens.header)Ee.walkTokens(e,t);for(const e of n.tokens.cells)for(const n of e)Ee.walkTokens(n,t);break;case"list":Ee.walkTokens(n.items,t);break;default:n.tokens&&Ee.walkTokens(n.tokens,t)}},Ee.parseInline=function(e,t){if(null==e)throw new Error("marked.parseInline(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");t=ye({},Ee.defaults,t||{}),ve(t);try{const n=le.lexInline(e,t);return t.walkTokens&&Ee.walkTokens(n,t.walkTokens),we.parseInline(n,t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return""+ke(e.message+"",!0)+"
";throw e}},Ee.Parser=we,Ee.parser=we.parse,Ee.Renderer=pe,Ee.TextRenderer=he,Ee.Lexer=le,Ee.lexer=le.lex,Ee.Tokenizer=G,Ee.Slugger=me,Ee.parse=Ee;var Se=Ee;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ce=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){!function(t,n){e.exports=n()}(0,(function(){var e=[],t=[],n={},r={},o={};function i(e){return"string"==typeof e?new RegExp("^"+e+"$","i"):e}function s(e,t){return e===t?t:e===e.toLowerCase()?t.toLowerCase():e===e.toUpperCase()?t.toUpperCase():e[0]===e[0].toUpperCase()?t.charAt(0).toUpperCase()+t.substr(1).toLowerCase():t.toLowerCase()}function a(e,t){return e.replace(/\$(\d{1,2})/g,(function(e,n){return t[n]||""}))}function c(e,t){return e.replace(t[0],(function(n,r){var o=a(t[1],arguments);return s(""===n?e[r-1]:n,o)}))}function l(e,t,r){if(!e.length||n.hasOwnProperty(e))return t;for(var o=r.length;o--;){var i=r[o];if(i[0].test(t))return c(t,i)}return t}function u(e,t,n){return function(r){var o=r.toLowerCase();return t.hasOwnProperty(o)?s(r,o):e.hasOwnProperty(o)?s(r,e[o]):l(o,r,n)}}function d(e,t,n,r){return function(r){var o=r.toLowerCase();return!!t.hasOwnProperty(o)||!e.hasOwnProperty(o)&&l(o,o,n)===o}}function f(e,t,n){return(n?t+" ":"")+(1===t?f.singular(e):f.plural(e))}return f.plural=u(o,r,e),f.isPlural=d(o,r,e),f.singular=u(r,o,t),f.isSingular=d(r,o,t),f.addPluralRule=function(t,n){e.push([i(t),n])},f.addSingularRule=function(e,n){t.push([i(e),n])},f.addUncountableRule=function(e){"string"!=typeof e?(f.addPluralRule(e,"$0"),f.addSingularRule(e,"$0")):n[e.toLowerCase()]=!0},f.addIrregularRule=function(e,t){t=t.toLowerCase(),e=e.toLowerCase(),o[e]=t,r[t]=e},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(e){return f.addIrregularRule(e[0],e[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(e){return f.addPluralRule(e[0],e[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(e){return f.addSingularRule(e[0],e[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[eé]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(f.addUncountableRule),f}))})),Ae=function(e){var t={};try{t.WeakMap=WeakMap}catch(u){t.WeakMap=function(e,t){var n=t.defineProperty,r=t.hasOwnProperty,o=i.prototype;return o.delete=function(e){return this.has(e)&&delete e[this._]},o.get=function(e){return this.has(e)?e[this._]:void 0},o.has=function(e){return r.call(e,this._)},o.set=function(e,t){return n(e,this._,{configurable:!0,value:t}),this},i;function i(t){n(this,"_",{value:"_@ungap/weakmap"+e++}),t&&t.forEach(s,this)}function s(e){this.set(e[0],e[1])}}(Math.random(),Object)}var n=t.WeakMap,r={};try{r.WeakSet=WeakSet}catch(u){!function(e,t){var n=o.prototype;function o(){t(this,"_",{value:"_@ungap/weakmap"+e++})}n.add=function(e){return this.has(e)||t(e,this._,{value:!0,configurable:!0}),this},n.has=function(e){return this.hasOwnProperty.call(e,this._)},n.delete=function(e){return this.has(e)&&delete e[this._]},r.WeakSet=o}(Math.random(),Object.defineProperty)}function o(e,t,n,r,o,i){for(var s=("selectedIndex"in t),a=s;r
${e}`;const i=super.code(e,r,n),{example:s,illegalExample:a}=o;if(!s&&!a)return i;const c=s||a,l=`${r} ${s?"example":"illegal-example"}`;return i.replace("
",``)}static parseInfoString(e){const t=e.search(/\s/);if(-1===t)return{language:e};const n=e.slice(0,t),r=e.slice(t+1);let o;if(r)try{o=JSON.parse(`{ ${r} }`)}catch(e){console.error(e)}return{language:n,...o}}heading(e,t,n,r){const o=/(.+)\s+{#([\w-]+)}$/;if(o.test(e)){const[,n,r]=e.match(o);return`${n} `}return super.heading(e,t,n,r)}}function vt(e){const t=mt(e).replace(bt,">").replace(wt,"&");return ze(t,{sanitize:!1,gfm:!0,headerIds:!1,langPrefix:"",renderer:new yt})}function kt(e){for(const t of e.getElementsByTagName("pre"))t.prepend("\n");e.innerHTML=vt(e.innerHTML)}class xt{constructor(e){this.doc=e,this.root=e.createDocumentFragment(),this.stack=[this.root],this.current=this.root}findPosition(e){return parseInt(e.tagName.charAt(1),10)}findParent(e){let t;for(;e>0;)if(e--,t=this.stack[e],t)return t}findHeader({firstChild:e}){for(;e;){if(/H[1-6]/.test(e.tagName))return e;e=e.nextSibling}return null}addHeader(e){const t=this.doc.createElement("section"),n=this.findPosition(e);t.appendChild(e),this.findParent(n).appendChild(t),this.stack[n]=t,this.stack.length=n+1,this.current=t}addSection(e,t){const n=this.findHeader(e),r=n?this.findPosition(n):1,o=this.findParent(r);n&&e.removeChild(n),e.appendChild(t(e)),n&&e.prepend(n),o.appendChild(e),this.current=o}addElement(e){this.current.appendChild(e)}}function $t(e,t){return function e(n){const r=new xt(t);for(;n.firstChild;){const t=n.firstChild;if(t.nodeType===Node.ELEMENT_NODE)switch(t.localName){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":r.addHeader(t);break;case"section":r.addSection(t,e);break;default:r.addElement(t)}else n.removeChild(t)}return r.root}(e)}function _t(e){const t=$t(e,e.ownerDocument);if("section"===t.firstElementChild.localName&&"section"===e.localName){const n=t.firstElementChild;n.remove(),e.append(...n.childNodes)}else e.textContent="";e.appendChild(t)}const Et=(St="[data-format='markdown']:not(body)",e=>{const t=e.querySelectorAll(St);return t.forEach(kt),Array.from(t)});var St;var Ct=Object.freeze({__proto__:null,name:"core/markdown",markdownToHtml:vt,restructure:_t,run:function(e){const t=!!document.querySelector("[data-format=markdown]:not(body)"),n="markdown"===e.format;if(!n&&!t)return;if(!n){for(const e of Et(document.body))_t(e);return}const r=document.getElementById("respec-ui");r.remove();const o=document.body.cloneNode(!0);!function(e,t){const n=e.querySelectorAll(t);for(const e of n){const{innerHTML:t}=e;if(/^<\w/.test(t.trimStart()))continue;const n=t.split("\n"),r=n.slice(0,2).join("\n"),o=n.slice(-2).join("\n");if(r.trim()&&e.prepend("\n\n"),o.trim()){const t=Ye(e);e.append("\n\n"+t)}}}(o,"[data-format=markdown], section, div, address, article, aside, figure, header, main"),kt(o),function(e){Array.from(e).forEach(e=>{e.replaceWith(e.textContent)})}(o.querySelectorAll(".nolinks a[href]"));const i=$t(o,document);o.append(r,i),document.body.replaceWith(o)}});function At(e,t){e&&Array.from(t).forEach(([t,n])=>{e.setAttribute("aria-"+t,n)})}!async function(){const e=document.createElement("style");e.id="respec-ui-styles",e.textContent=await async function(){try{return(await Promise.resolve().then((function(){return Ts}))).default}catch{return ht("ui.css")}}(),e.classList.add("removeOnSave"),document.head.appendChild(e)}();const Lt=Te``,Tt=Te`
'+(n?e:fe(e,!0))+"
\n":""+(n?e:fe(e,!0))+"
\n"}blockquote(e){return"\n"+e+"\n"}html(e){return e}heading(e,t,n,r){return this.options.headerIds?"
"+e+"
\n"}table(e,t){return t&&(t=""+t+""),""+e+"
"}br(){return this.options.xhtml?"An error occurred:
"+ke(e.message+"",!0)+"";throw e}}Se.options=Se.setOptions=function(e){return ye(Se.defaults,e),$e(Se.defaults),Se},Se.getDefaults=xe,Se.defaults=_e,Se.use=function(e){const t=ye({},e);if(e.renderer){const n=Se.defaults.renderer||new pe;for(const t in e.renderer){const r=n[t];n[t]=(...o)=>{let i=e.renderer[t].apply(n,o);return!1===i&&(i=r.apply(n,o)),i}}t.renderer=n}if(e.tokenizer){const n=Se.defaults.tokenizer||new G;for(const t in e.tokenizer){const r=n[t];n[t]=(...o)=>{let i=e.tokenizer[t].apply(n,o);return!1===i&&(i=r.apply(n,o)),i}}t.tokenizer=n}if(e.walkTokens){const n=Se.defaults.walkTokens;t.walkTokens=t=>{e.walkTokens(t),n&&n(t)}}Se.setOptions(t)},Se.walkTokens=function(e,t){for(const n of e)switch(t(n),n.type){case"table":for(const e of n.tokens.header)Se.walkTokens(e,t);for(const e of n.tokens.cells)for(const n of e)Se.walkTokens(n,t);break;case"list":Se.walkTokens(n.items,t);break;default:n.tokens&&Se.walkTokens(n.tokens,t)}},Se.parseInline=function(e,t){if(null==e)throw new Error("marked.parseInline(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");t=ye({},Se.defaults,t||{}),ve(t);try{const n=ce.lexInline(e,t);return t.walkTokens&&Se.walkTokens(n,t.walkTokens),we.parseInline(n,t)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",t.silent)return"
An error occurred:
"+ke(e.message+"",!0)+"";throw e}},Se.Parser=we,Se.parser=we.parse,Se.Renderer=pe,Se.TextRenderer=he,Se.Lexer=ce,Se.lexer=ce.lex,Se.Tokenizer=G,Se.Slugger=me,Se.parse=Se;var Ee=Se;"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var Ce=function(e){var t={exports:{}};return e(t,t.exports),t.exports}((function(e,t){!function(t,n){e.exports=n()}(0,(function(){var e=[],t=[],n={},r={},o={};function i(e){return"string"==typeof e?new RegExp("^"+e+"$","i"):e}function s(e,t){return e===t?t:e===e.toLowerCase()?t.toLowerCase():e===e.toUpperCase()?t.toUpperCase():e[0]===e[0].toUpperCase()?t.charAt(0).toUpperCase()+t.substr(1).toLowerCase():t.toLowerCase()}function a(e,t){return e.replace(/\$(\d{1,2})/g,(function(e,n){return t[n]||""}))}function l(e,t){return e.replace(t[0],(function(n,r){var o=a(t[1],arguments);return s(""===n?e[r-1]:n,o)}))}function c(e,t,r){if(!e.length||n.hasOwnProperty(e))return t;for(var o=r.length;o--;){var i=r[o];if(i[0].test(t))return l(t,i)}return t}function u(e,t,n){return function(r){var o=r.toLowerCase();return t.hasOwnProperty(o)?s(r,o):e.hasOwnProperty(o)?s(r,e[o]):c(o,r,n)}}function d(e,t,n,r){return function(r){var o=r.toLowerCase();return!!t.hasOwnProperty(o)||!e.hasOwnProperty(o)&&c(o,o,n)===o}}function f(e,t,n){return(n?t+" ":"")+(1===t?f.singular(e):f.plural(e))}return f.plural=u(o,r,e),f.isPlural=d(o,r,e),f.singular=u(r,o,t),f.isSingular=d(r,o,t),f.addPluralRule=function(t,n){e.push([i(t),n])},f.addSingularRule=function(e,n){t.push([i(e),n])},f.addUncountableRule=function(e){"string"!=typeof e?(f.addPluralRule(e,"$0"),f.addSingularRule(e,"$0")):n[e.toLowerCase()]=!0},f.addIrregularRule=function(e,t){t=t.toLowerCase(),e=e.toLowerCase(),o[e]=t,r[t]=e},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(e){return f.addIrregularRule(e[0],e[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(e){return f.addPluralRule(e[0],e[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(e){return f.addSingularRule(e[0],e[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[eé]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(f.addUncountableRule),f}))})),Ae=function(e){var t={};try{t.WeakMap=WeakMap}catch(u){t.WeakMap=function(e,t){var n=t.defineProperty,r=t.hasOwnProperty,o=i.prototype;return o.delete=function(e){return this.has(e)&&delete e[this._]},o.get=function(e){return this.has(e)?e[this._]:void 0},o.has=function(e){return r.call(e,this._)},o.set=function(e,t){return n(e,this._,{configurable:!0,value:t}),this},i;function i(t){n(this,"_",{value:"_@ungap/weakmap"+e++}),t&&t.forEach(s,this)}function s(e){this.set(e[0],e[1])}}(Math.random(),Object)}var n=t.WeakMap,r={};try{r.WeakSet=WeakSet}catch(u){!function(e,t){var n=o.prototype;function o(){t(this,"_",{value:"_@ungap/weakmap"+e++})}n.add=function(e){return this.has(e)||t(e,this._,{value:!0,configurable:!0}),this},n.has=function(e){return this.hasOwnProperty.call(e,this._)},n.delete=function(e){return this.has(e)&&delete e[this._]},r.WeakSet=o}(Math.random(),Object.defineProperty)}function o(e,t,n,r,o,i){for(var s=("selectedIndex"in t),a=s;r
${e}`;const i=super.code(e,r,n),{example:s,illegalExample:a}=o;if(!s&&!a)return i;const l=s||a,c=`${r} ${s?"example":"illegal-example"}`;return i.replace("
",``,zt=Te``)}static parseInfoString(e){const t=e.search(/\s/);if(-1===t)return{language:e};const n=e.slice(0,t),r=e.slice(t+1);let o;if(r)try{o=JSON.parse(`{ ${r} }`)}catch(e){console.error(e)}return{language:n,...o}}heading(e,t,n,r){const o=/(.+)\s+{#([\w-]+)}$/;if(o.test(e)){const[,n,r]=e.match(o);return`${n} `}return super.heading(e,t,n,r)}}function yt(e){const t=ht(e).replace(gt,">").replace(bt,"&");return Ne(t,{sanitize:!1,gfm:!0,headerIds:!1,langPrefix:"",renderer:new wt})}function vt(e){for(const t of e.getElementsByTagName("pre"))t.prepend("\n");e.innerHTML=yt(e.innerHTML)}class kt{constructor(e){this.doc=e,this.root=e.createDocumentFragment(),this.stack=[this.root],this.current=this.root}findPosition(e){return parseInt(e.tagName.charAt(1),10)}findParent(e){let t;for(;e>0;)if(e--,t=this.stack[e],t)return t}findHeader({firstChild:e}){for(;e;){if(/H[1-6]/.test(e.tagName))return e;e=e.nextSibling}return null}addHeader(e){const t=this.doc.createElement("section"),n=this.findPosition(e);t.appendChild(e),this.findParent(n).appendChild(t),this.stack[n]=t,this.stack.length=n+1,this.current=t}addSection(e,t){const n=this.findHeader(e),r=n?this.findPosition(n):1,o=this.findParent(r);n&&e.removeChild(n),e.appendChild(t(e)),n&&e.prepend(n),o.appendChild(e),this.current=o}addElement(e){this.current.appendChild(e)}}function xt(e,t){return function e(n){const r=new kt(t);for(;n.firstChild;){const t=n.firstChild;if(t.nodeType===Node.ELEMENT_NODE)switch(t.localName){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":r.addHeader(t);break;case"section":r.addSection(t,e);break;default:r.addElement(t)}else n.removeChild(t)}return r.root}(e)}function $t(e){const t=xt(e,e.ownerDocument);if("section"===t.firstElementChild.localName&&"section"===e.localName){const n=t.firstElementChild;n.remove(),e.append(...n.childNodes)}else e.textContent="";e.appendChild(t)}const _t=(St="[data-format='markdown']:not(body)",e=>{const t=e.querySelectorAll(St);return t.forEach(vt),Array.from(t)});var St;var Et=Object.freeze({__proto__:null,name:"core/markdown",markdownToHtml:yt,restructure:$t,run:function(e){const t=!!document.querySelector("[data-format=markdown]:not(body)"),n="markdown"===e.format;if(!n&&!t)return;if(!n){for(const e of _t(document.body))$t(e);return}const r=document.getElementById("respec-ui");r.remove();const o=document.body.cloneNode(!0);!function(e,t){const n=e.querySelectorAll(t);for(const e of n){const{innerHTML:t}=e;if(/^<\w/.test(t.trimStart()))continue;const n=t.split("\n"),r=n.slice(0,2).join("\n"),o=n.slice(-2).join("\n");if(r.trim()&&e.prepend("\n\n"),o.trim()){const t=Ye(e);e.append("\n\n"+t)}}}(o,"[data-format=markdown], section, div, address, article, aside, figure, header, main"),vt(o),function(e){Array.from(e).forEach(e=>{e.replaceWith(e.textContent)})}(o.querySelectorAll(".nolinks a[href]"));const i=xt(o,document);o.append(r,i),document.body.replaceWith(o)}});function Ct(e,t){e&&Array.from(t).forEach(([t,n])=>{e.setAttribute("aria-"+t,n)})}!function(){const e=document.createElement("style");e.id="respec-ui-styles",e.textContent=pt,e.classList.add("removeOnSave"),document.head.appendChild(e)}();const At=Te``,Lt=Te`