diff --git a/.npmignore b/.npmignore index 8afc386..485db2a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,7 +1,5 @@ **/* -!/extra/**/* +!/app/**/* !*.d.ts -!index.js -!platforms.js !*.md !*.json \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index b78b0c3..8cadae8 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ /dist /build +/examples /node_modules package-lock.json \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 650cbc8..5737a34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,7 @@ -# v0.2.1 (February 11, 2023) +# v0.2.2 (February 11, 2023) -- New Options: `viewport` -- New Options: `policy` -- Fix: HTML Regex +- Fix: Docs +- New: `/examples` folder @@ -10,6 +9,12 @@ +# v0.2.1 (February 11, 2023) + +- New Options: `viewport` +- New Options: `policy` +- Fix: HTML Regex + # v0.1.0 (February 06, 2023) - First release diff --git a/README.md b/README.md index 033b049..b87ca6b 100755 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ import adapter from "@ptkdev/sveltekit-electron-adapter"; const config = { kit: { adapter: adapter({ - strict: true, + strict: false, }), }, }; @@ -72,7 +72,7 @@ I make a boilerplate that "automate" this process, but is working in progress: c ## 🧰 Options -The `adatper({ options })` parameters list: +The `adapter({ options })` parameters list: | Parameter | Description | Values | Default value | Available since | | ----------- | --------------------------------------------------------------- | ------ | ----------------------------------------------------------- | --------------- | @@ -81,7 +81,7 @@ The `adatper({ options })` parameters list: | fallback | See official [docs](https://kit.svelte.dev/docs/adapter-static) | | | | | precompress | See official [docs](https://kit.svelte.dev/docs/adapter-static) | | | | | strict | See official [docs](https://kit.svelte.dev/docs/adapter-static) | | | | -| policy | Set meta-tag `content-security-policy` | String | `default-src 'self'; script-src 'self'` | v0.2.0 | +| policy | Set meta-tag `content-security-policy` | String | Empty | v0.2.0 | | viewport | Set meta-tag `viewport` | String | `width=device-width, initial-scale=1.0, viewport-fit=cover` | v0.2.0 | #### Example: @@ -90,8 +90,8 @@ The `adatper({ options })` parameters list: const config = { kit: { adapter: adapter({ - strict: true, - policy: "", + strict: false, + policy: "default-src 'self'; script-src 'self'", viewport: `width=device-width`, }), }, diff --git a/app/adapter/index.js b/app/adapter/index.js index 6666ee3..ec3e424 100644 --- a/app/adapter/index.js +++ b/app/adapter/index.js @@ -109,7 +109,7 @@ See https://kit.svelte.dev/docs/page-options#prerender for more details`, }); let regex_input = new RegExp(`http-equiv="content-security-policy" content=""`, "g"); - const policy = "default-src 'self'; script-src 'self'"; + const policy = ""; let regex_replace = `http-equiv="content-security-policy" content="${ options?.policy ? options.policy : policy }"`; diff --git a/examples/electron-app/.gitignore b/examples/electron-app/.gitignore new file mode 100644 index 0000000..8e3a106 --- /dev/null +++ b/examples/electron-app/.gitignore @@ -0,0 +1,89 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock +.DS_Store + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Webpack +.webpack/ + +# Electron-Forge +out/ diff --git a/examples/electron-app/forge.config.js b/examples/electron-app/forge.config.js new file mode 100644 index 0000000..9a4060f --- /dev/null +++ b/examples/electron-app/forge.config.js @@ -0,0 +1,22 @@ +module.exports = { + packagerConfig: {}, + rebuildConfig: {}, + makers: [ + { + name: '@electron-forge/maker-squirrel', + config: {}, + }, + { + name: '@electron-forge/maker-zip', + platforms: ['darwin'], + }, + { + name: '@electron-forge/maker-deb', + config: {}, + }, + { + name: '@electron-forge/maker-rpm', + config: {}, + }, + ], +}; diff --git a/examples/electron-app/package.json b/examples/electron-app/package.json new file mode 100644 index 0000000..f450136 --- /dev/null +++ b/examples/electron-app/package.json @@ -0,0 +1,31 @@ +{ + "name": "electron-app", + "productName": "electron-app", + "version": "1.0.0", + "description": "My Electron application description", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start", + "package": "electron-forge package", + "make": "electron-forge make", + "publish": "electron-forge publish", + "lint": "echo \"No linting configured\"" + }, + "keywords": [], + "author": { + "name": "Patryk Rzucidlo (PTKDev)", + "email": "ptkdev@gmail.com" + }, + "license": "MIT", + "dependencies": { + "electron-squirrel-startup": "^1.0.0" + }, + "devDependencies": { + "@electron-forge/cli": "^6.0.5", + "@electron-forge/maker-deb": "^6.0.5", + "@electron-forge/maker-rpm": "^6.0.5", + "@electron-forge/maker-squirrel": "^6.0.5", + "@electron-forge/maker-zip": "^6.0.5", + "electron": "23.0.0" + } +} diff --git a/examples/electron-app/src/_app/immutable/assets/_layout-19af9c2d.css b/examples/electron-app/src/_app/immutable/assets/_layout-19af9c2d.css new file mode 100644 index 0000000..331aa6e --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/_layout-19af9c2d.css @@ -0,0 +1,147 @@ +header.svelte-1u9z1tp.svelte-1u9z1tp{display:flex;justify-content:space-between}.corner.svelte-1u9z1tp.svelte-1u9z1tp{width:3em;height:3em}.corner.svelte-1u9z1tp a.svelte-1u9z1tp{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.corner.svelte-1u9z1tp img.svelte-1u9z1tp{width:2em;height:2em;object-fit:contain}nav.svelte-1u9z1tp.svelte-1u9z1tp{display:flex;justify-content:center;--background:rgba(255, 255, 255, 0.7)}svg.svelte-1u9z1tp.svelte-1u9z1tp{width:2em;height:3em;display:block}path.svelte-1u9z1tp.svelte-1u9z1tp{fill:var(--background)}ul.svelte-1u9z1tp.svelte-1u9z1tp{position:relative;padding:0;margin:0;height:3em;display:flex;justify-content:center;align-items:center;list-style:none;background:var(--background);background-size:contain}li.svelte-1u9z1tp.svelte-1u9z1tp{position:relative;height:100%}li[aria-current='page'].svelte-1u9z1tp.svelte-1u9z1tp::before{--size:6px;content:'';width:0;height:0;position:absolute;top:0;left:calc(50% - var(--size));border:var(--size) solid transparent;border-top:var(--size) solid var(--color-theme-1)}nav.svelte-1u9z1tp a.svelte-1u9z1tp{display:flex;height:100%;align-items:center;padding:0 0.5rem;color:var(--color-text);font-weight:700;font-size:0.8rem;text-transform:uppercase;letter-spacing:0.1em;text-decoration:none;transition:color 0.2s linear}a.svelte-1u9z1tp.svelte-1u9z1tp:hover{color:var(--color-theme-1)}/* fira-mono-cyrillic-ext-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-cyrillic-ext-400-normal-3df7909e.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F; +} +/* fira-mono-cyrillic-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-cyrillic-400-normal-c7d433fd.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116; +} +/* fira-mono-greek-ext-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-greek-ext-400-normal-9e2fe623.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} +/* fira-mono-greek-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-greek-400-normal-a8be01ce.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+0370-03FF; +} +/* fira-mono-latin-ext-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-latin-ext-400-normal-6bfabd30.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF; +} +/* fira-mono-latin-400-normal*/ +@font-face { + font-family: 'Fira Mono'; + font-style: normal; + font-display: swap; + font-weight: 400; + src: url('./fira-mono-latin-400-normal-e43b3538.woff2') format('woff2'), url('./fira-mono-all-400-normal-1e3b098c.woff') format('woff'); + unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD; +} +:root { + --font-body: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, + Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + --font-mono: 'Fira Mono', monospace; + --color-bg-0: rgb(202, 216, 228); + --color-bg-1: hsl(209, 36%, 86%); + --color-bg-2: hsl(224, 44%, 95%); + --color-theme-1: #ff3e00; + --color-theme-2: #4075a6; + --color-text: rgba(0, 0, 0, 0.7); + --column-width: 42rem; + --column-margin-top: 4rem; + font-family: var(--font-body); + color: var(--color-text); +} +body { + min-height: 100vh; + margin: 0; + background-attachment: fixed; + background-color: var(--color-bg-1); + background-size: 100vw 100vh; + background-image: radial-gradient( + 50% 50% at 50% 50%, + rgba(255, 255, 255, 0.75) 0%, + rgba(255, 255, 255, 0) 100% + ), + linear-gradient(180deg, var(--color-bg-0) 0%, var(--color-bg-1) 15%, var(--color-bg-2) 50%); +} +h1, +h2, +p { + font-weight: 400; +} +p { + line-height: 1.5; +} +a { + color: var(--color-theme-1); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +h1 { + font-size: 2rem; + text-align: center; +} +h2 { + font-size: 1rem; +} +pre { + font-size: 16px; + font-family: var(--font-mono); + background-color: rgba(255, 255, 255, 0.45); + border-radius: 3px; + box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); + padding: 0.5em; + overflow-x: auto; + color: var(--color-text); +} +.text-column { + display: flex; + max-width: 48rem; + flex: 0.6; + flex-direction: column; + justify-content: center; + margin: 0 auto; +} +input, +button { + font-size: inherit; + font-family: inherit; +} +button:focus:not(:focus-visible) { + outline: none; +} +@media (min-width: 720px) { + h1 { + font-size: 2.4rem; + } +} +.visually-hidden { + border: 0; + clip: rect(0 0 0 0); + height: auto; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; +} +.app.svelte-8o1gnw.svelte-8o1gnw{display:flex;flex-direction:column;min-height:100vh}main.svelte-8o1gnw.svelte-8o1gnw{flex:1;display:flex;flex-direction:column;padding:1rem;width:100%;max-width:64rem;margin:0 auto;box-sizing:border-box}footer.svelte-8o1gnw.svelte-8o1gnw{display:flex;flex-direction:column;justify-content:center;align-items:center;padding:12px}footer.svelte-8o1gnw a.svelte-8o1gnw{font-weight:bold}@media(min-width: 480px){footer.svelte-8o1gnw.svelte-8o1gnw{padding:12px 0}} \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/_page-08e4d5ca.css b/examples/electron-app/src/_app/immutable/assets/_page-08e4d5ca.css new file mode 100644 index 0000000..a358516 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/_page-08e4d5ca.css @@ -0,0 +1 @@ +.counter.svelte-y96mxt.svelte-y96mxt{display:flex;border-top:1px solid rgba(0, 0, 0, 0.1);border-bottom:1px solid rgba(0, 0, 0, 0.1);margin:1rem 0}.counter.svelte-y96mxt button.svelte-y96mxt{width:2em;padding:0;display:flex;align-items:center;justify-content:center;border:0;background-color:transparent;touch-action:manipulation;font-size:2rem}.counter.svelte-y96mxt button.svelte-y96mxt:hover{background-color:var(--color-bg-1)}svg.svelte-y96mxt.svelte-y96mxt{width:25%;height:25%}path.svelte-y96mxt.svelte-y96mxt{vector-effect:non-scaling-stroke;stroke-width:2px;stroke:#444}.counter-viewport.svelte-y96mxt.svelte-y96mxt{width:8em;height:4em;overflow:hidden;text-align:center;position:relative}.counter-viewport.svelte-y96mxt strong.svelte-y96mxt{position:absolute;display:flex;width:100%;height:100%;font-weight:400;color:var(--color-theme-1);font-size:4rem;align-items:center;justify-content:center}.counter-digits.svelte-y96mxt.svelte-y96mxt{position:absolute;width:100%;height:100%}.hidden.svelte-y96mxt.svelte-y96mxt{top:-100%;user-select:none}section.svelte-19xx0bt.svelte-19xx0bt{display:flex;flex-direction:column;justify-content:center;align-items:center;flex:0.6}h1.svelte-19xx0bt.svelte-19xx0bt{width:100%}.welcome.svelte-19xx0bt.svelte-19xx0bt{display:block;position:relative;width:100%;height:0;padding:0 0 calc(100% * 495 / 2048) 0}.welcome.svelte-19xx0bt img.svelte-19xx0bt{position:absolute;width:100%;height:100%;top:0;display:block} \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/_page-0e6c8ae6.css b/examples/electron-app/src/_app/immutable/assets/_page-0e6c8ae6.css new file mode 100644 index 0000000..43efd22 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/_page-0e6c8ae6.css @@ -0,0 +1 @@ +span.svelte-1x5nq1n.svelte-1x5nq1n{display:inline-flex;justify-content:center;align-items:center;font-size:0.8em;width:2.4em;height:2.4em;background-color:white;box-sizing:border-box;border-radius:2px;border-width:2px;color:rgba(0, 0, 0, 0.7)}.missing.svelte-1x5nq1n.svelte-1x5nq1n{background:rgba(255, 255, 255, 0.5);color:rgba(0, 0, 0, 0.5)}.close.svelte-1x5nq1n.svelte-1x5nq1n{border-style:solid;border-color:var(--color-theme-2)}.exact.svelte-1x5nq1n.svelte-1x5nq1n{background:var(--color-theme-2);color:white}.example.svelte-1x5nq1n.svelte-1x5nq1n{display:flex;justify-content:flex-start;margin:1rem 0;gap:0.2rem}.example.svelte-1x5nq1n span.svelte-1x5nq1n{font-size:1.4rem}p.svelte-1x5nq1n span.svelte-1x5nq1n{position:relative;border-width:1px;border-radius:1px;font-size:0.4em;transform:scale(2) translate(0, -10%);margin:0 1em} \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/_page-b0e588ca.css b/examples/electron-app/src/_app/immutable/assets/_page-b0e588ca.css new file mode 100644 index 0000000..3de115b --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/_page-b0e588ca.css @@ -0,0 +1 @@ +form.svelte-1pg2j5l.svelte-1pg2j5l{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;flex:1}.how-to-play.svelte-1pg2j5l.svelte-1pg2j5l{color:var(--color-text)}.how-to-play.svelte-1pg2j5l.svelte-1pg2j5l::before{content:'i';display:inline-block;font-size:0.8em;font-weight:900;width:1em;height:1em;padding:0.2em;line-height:1;border:1.5px solid var(--color-text);border-radius:50%;text-align:center;margin:0 0.5em 0 0;position:relative;top:-0.05em}.grid.svelte-1pg2j5l.svelte-1pg2j5l{--width:min(100vw, 40vh, 380px);max-width:var(--width);align-self:center;justify-self:center;width:100%;height:100%;display:flex;flex-direction:column;justify-content:flex-start}.grid.svelte-1pg2j5l .row.svelte-1pg2j5l{display:grid;grid-template-columns:repeat(5, 1fr);grid-gap:0.2rem;margin:0 0 0.2rem 0}@media(prefers-reduced-motion: no-preference){.grid.bad-guess.svelte-1pg2j5l .row.current.svelte-1pg2j5l{animation:svelte-1pg2j5l-wiggle 0.5s}}.grid.playing.svelte-1pg2j5l .row.current.svelte-1pg2j5l{filter:drop-shadow(3px 3px 10px var(--color-bg-0))}.letter.svelte-1pg2j5l.svelte-1pg2j5l{aspect-ratio:1;width:100%;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;text-transform:lowercase;border:none;font-size:calc(0.08 * var(--width));border-radius:2px;background:white;margin:0;color:rgba(0, 0, 0, 0.7)}.letter.missing.svelte-1pg2j5l.svelte-1pg2j5l{background:rgba(255, 255, 255, 0.5);color:rgba(0, 0, 0, 0.5)}.letter.exact.svelte-1pg2j5l.svelte-1pg2j5l{background:var(--color-theme-2);color:white}.letter.close.svelte-1pg2j5l.svelte-1pg2j5l{border:2px solid var(--color-theme-2)}.selected.svelte-1pg2j5l.svelte-1pg2j5l{outline:2px solid var(--color-theme-1)}.controls.svelte-1pg2j5l.svelte-1pg2j5l{text-align:center;justify-content:center;height:min(18vh, 10rem)}.keyboard.svelte-1pg2j5l.svelte-1pg2j5l{--gap:0.2rem;position:relative;display:flex;flex-direction:column;gap:var(--gap);height:100%}.keyboard.svelte-1pg2j5l .row.svelte-1pg2j5l{display:flex;justify-content:center;gap:0.2rem;flex:1}.keyboard.svelte-1pg2j5l button.svelte-1pg2j5l,.keyboard.svelte-1pg2j5l button.svelte-1pg2j5l:disabled{--size:min(8vw, 4vh, 40px);background-color:white;color:black;width:var(--size);border:none;border-radius:2px;font-size:calc(var(--size) * 0.5);margin:0}.keyboard.svelte-1pg2j5l button.exact.svelte-1pg2j5l{background:var(--color-theme-2);color:white}.keyboard.svelte-1pg2j5l button.missing.svelte-1pg2j5l{opacity:0.5}.keyboard.svelte-1pg2j5l button.close.svelte-1pg2j5l{border:2px solid var(--color-theme-2)}.keyboard.svelte-1pg2j5l button.svelte-1pg2j5l:focus{background:var(--color-theme-1);color:white;outline:none}.keyboard.svelte-1pg2j5l button[data-key='enter'].svelte-1pg2j5l,.keyboard.svelte-1pg2j5l button[data-key='backspace'].svelte-1pg2j5l{position:absolute;bottom:0;width:calc(1.5 * var(--size));height:calc(1 / 3 * (100% - 2 * var(--gap)));text-transform:uppercase;font-size:calc(0.3 * var(--size));padding-top:calc(0.15 * var(--size))}.keyboard.svelte-1pg2j5l button[data-key='enter'].svelte-1pg2j5l{right:calc(50% + 3.5 * var(--size) + 0.8rem)}.keyboard.svelte-1pg2j5l button[data-key='backspace'].svelte-1pg2j5l{left:calc(50% + 3.5 * var(--size) + 0.8rem)}.keyboard.svelte-1pg2j5l button[data-key='enter'].svelte-1pg2j5l:disabled{opacity:0.5}.restart.svelte-1pg2j5l.svelte-1pg2j5l{width:100%;padding:1rem;background:rgba(255, 255, 255, 0.5);border-radius:2px;border:none}.restart.svelte-1pg2j5l.svelte-1pg2j5l:focus,.restart.svelte-1pg2j5l.svelte-1pg2j5l:hover{background:var(--color-theme-1);color:white;outline:none}@keyframes svelte-1pg2j5l-wiggle{0%{transform:translateX(0)}10%{transform:translateX(-2px)}30%{transform:translateX(4px)}50%{transform:translateX(-6px)}70%{transform:translateX(+4px)}90%{transform:translateX(-2px)}100%{transform:translateX(0)}} \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-all-400-normal-1e3b098c.woff b/examples/electron-app/src/_app/immutable/assets/fira-mono-all-400-normal-1e3b098c.woff new file mode 100644 index 0000000..7f61fe9 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-all-400-normal-1e3b098c.woff differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-400-normal-c7d433fd.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-400-normal-c7d433fd.woff2 new file mode 100644 index 0000000..48cf9cf Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-400-normal-c7d433fd.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-ext-400-normal-3df7909e.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-ext-400-normal-3df7909e.woff2 new file mode 100644 index 0000000..d633202 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-cyrillic-ext-400-normal-3df7909e.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-400-normal-a8be01ce.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-400-normal-a8be01ce.woff2 new file mode 100644 index 0000000..01061b4 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-400-normal-a8be01ce.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-ext-400-normal-9e2fe623.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-ext-400-normal-9e2fe623.woff2 new file mode 100644 index 0000000..4dc2f4b Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-greek-ext-400-normal-9e2fe623.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-400-normal-e43b3538.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-400-normal-e43b3538.woff2 new file mode 100644 index 0000000..edc71a8 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-400-normal-e43b3538.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-ext-400-normal-6bfabd30.woff2 b/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-ext-400-normal-6bfabd30.woff2 new file mode 100644 index 0000000..43e41c8 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/fira-mono-latin-ext-400-normal-6bfabd30.woff2 differ diff --git a/examples/electron-app/src/_app/immutable/assets/github-1ea8d62e.svg b/examples/electron-app/src/_app/immutable/assets/github-1ea8d62e.svg new file mode 100644 index 0000000..bc5d249 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/github-1ea8d62e.svg @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/svelte-logo-87df40b8.svg b/examples/electron-app/src/_app/immutable/assets/svelte-logo-87df40b8.svg new file mode 100644 index 0000000..49492a8 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/assets/svelte-logo-87df40b8.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/examples/electron-app/src/_app/immutable/assets/svelte-welcome-6c300099.png b/examples/electron-app/src/_app/immutable/assets/svelte-welcome-6c300099.png new file mode 100644 index 0000000..fe7d2d6 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/svelte-welcome-6c300099.png differ diff --git a/examples/electron-app/src/_app/immutable/assets/svelte-welcome-c18bcf5a.webp b/examples/electron-app/src/_app/immutable/assets/svelte-welcome-c18bcf5a.webp new file mode 100644 index 0000000..6ec1a28 Binary files /dev/null and b/examples/electron-app/src/_app/immutable/assets/svelte-welcome-c18bcf5a.webp differ diff --git a/examples/electron-app/src/_app/immutable/chunks/0-f2cd2ce4.js b/examples/electron-app/src/_app/immutable/chunks/0-f2cd2ce4.js new file mode 100644 index 0000000..a7f9d22 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/0-f2cd2ce4.js @@ -0,0 +1,4 @@ +import { default as default2 } from "../components/pages/_layout.svelte-20a5d298.js"; +export { + default2 as component +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/1-429531b0.js b/examples/electron-app/src/_app/immutable/chunks/1-429531b0.js new file mode 100644 index 0000000..7802873 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/1-429531b0.js @@ -0,0 +1,4 @@ +import { default as default2 } from "../components/error.svelte-673baa07.js"; +export { + default2 as component +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/2-c7cfc074.js b/examples/electron-app/src/_app/immutable/chunks/2-c7cfc074.js new file mode 100644 index 0000000..ae1814e --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/2-c7cfc074.js @@ -0,0 +1,6 @@ +import { _ } from "./_page-de0ef88a.js"; +import { default as default2 } from "../components/pages/_page.svelte-8f3445c9.js"; +export { + default2 as component, + _ as universal +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/3-44ff0c1d.js b/examples/electron-app/src/_app/immutable/chunks/3-44ff0c1d.js new file mode 100644 index 0000000..e056f99 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/3-44ff0c1d.js @@ -0,0 +1,6 @@ +import { _ } from "./_page-34b026b6.js"; +import { default as default2 } from "../components/pages/about/_page.svelte-f31c9606.js"; +export { + default2 as component, + _ as universal +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/4-5dde9a39.js b/examples/electron-app/src/_app/immutable/chunks/4-5dde9a39.js new file mode 100644 index 0000000..ec332f0 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/4-5dde9a39.js @@ -0,0 +1,4 @@ +import { default as default2 } from "../components/pages/sverdle/_page.svelte-aa322e66.js"; +export { + default2 as component +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/5-9483b414.js b/examples/electron-app/src/_app/immutable/chunks/5-9483b414.js new file mode 100644 index 0000000..e7b2a56 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/5-9483b414.js @@ -0,0 +1,6 @@ +import { _ } from "./_page-cbe3748d.js"; +import { default as default2 } from "../components/pages/sverdle/how-to-play/_page.svelte-fb619894.js"; +export { + default2 as component, + _ as universal +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/_page-34b026b6.js b/examples/electron-app/src/_app/immutable/chunks/_page-34b026b6.js new file mode 100644 index 0000000..4f4f937 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/_page-34b026b6.js @@ -0,0 +1,13 @@ +import { d as dev } from "./environment-57be8769.js"; +const csr = dev; +const prerender = true; +const _page = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + csr, + prerender +}, Symbol.toStringTag, { value: "Module" })); +export { + _page as _, + csr as c, + prerender as p +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/_page-cbe3748d.js b/examples/electron-app/src/_app/immutable/chunks/_page-cbe3748d.js new file mode 100644 index 0000000..4f4f937 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/_page-cbe3748d.js @@ -0,0 +1,13 @@ +import { d as dev } from "./environment-57be8769.js"; +const csr = dev; +const prerender = true; +const _page = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + csr, + prerender +}, Symbol.toStringTag, { value: "Module" })); +export { + _page as _, + csr as c, + prerender as p +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/_page-de0ef88a.js b/examples/electron-app/src/_app/immutable/chunks/_page-de0ef88a.js new file mode 100644 index 0000000..11bb079 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/_page-de0ef88a.js @@ -0,0 +1,9 @@ +const prerender = true; +const _page = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + prerender +}, Symbol.toStringTag, { value: "Module" })); +export { + _page as _, + prerender as p +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/environment-57be8769.js b/examples/electron-app/src/_app/immutable/chunks/environment-57be8769.js new file mode 100644 index 0000000..7bb4dde --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/environment-57be8769.js @@ -0,0 +1,5 @@ +const DEV = false; +const dev = DEV; +export { + dev as d +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/index-bb582736.js b/examples/electron-app/src/_app/immutable/chunks/index-bb582736.js new file mode 100644 index 0000000..e9f5f42 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/index-bb582736.js @@ -0,0 +1,52 @@ +import { C as noop, s as safe_not_equal } from "./index-d985765e.js"; +const subscriber_queue = []; +function readable(value, start) { + return { + subscribe: writable(value, start).subscribe + }; +} +function writable(value, start = noop) { + let stop; + const subscribers = /* @__PURE__ */ new Set(); + function set(new_value) { + if (safe_not_equal(value, new_value)) { + value = new_value; + if (stop) { + const run_queue = !subscriber_queue.length; + for (const subscriber of subscribers) { + subscriber[1](); + subscriber_queue.push(subscriber, value); + } + if (run_queue) { + for (let i = 0; i < subscriber_queue.length; i += 2) { + subscriber_queue[i][0](subscriber_queue[i + 1]); + } + subscriber_queue.length = 0; + } + } + } + } + function update(fn) { + set(fn(value)); + } + function subscribe(run, invalidate = noop) { + const subscriber = [run, invalidate]; + subscribers.add(subscriber); + if (subscribers.size === 1) { + stop = start(set) || noop; + } + run(value); + return () => { + subscribers.delete(subscriber); + if (subscribers.size === 0) { + stop(); + stop = null; + } + }; + } + return { set, update, subscribe }; +} +export { + readable as r, + writable as w +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/index-d985765e.js b/examples/electron-app/src/_app/immutable/chunks/index-d985765e.js new file mode 100644 index 0000000..0a4ed05 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/index-d985765e.js @@ -0,0 +1,684 @@ +function noop() { +} +function assign(tar, src) { + for (const k in src) + tar[k] = src[k]; + return tar; +} +function run(fn) { + return fn(); +} +function blank_object() { + return /* @__PURE__ */ Object.create(null); +} +function run_all(fns) { + fns.forEach(run); +} +function is_function(thing) { + return typeof thing === "function"; +} +function safe_not_equal(a, b) { + return a != a ? b == b : a !== b || (a && typeof a === "object" || typeof a === "function"); +} +let src_url_equal_anchor; +function src_url_equal(element_src, url) { + if (!src_url_equal_anchor) { + src_url_equal_anchor = document.createElement("a"); + } + src_url_equal_anchor.href = url; + return element_src === src_url_equal_anchor.href; +} +function is_empty(obj) { + return Object.keys(obj).length === 0; +} +function subscribe(store, ...callbacks) { + if (store == null) { + return noop; + } + const unsub = store.subscribe(...callbacks); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; +} +function component_subscribe(component, store, callback) { + component.$$.on_destroy.push(subscribe(store, callback)); +} +function create_slot(definition, ctx, $$scope, fn) { + if (definition) { + const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); + return definition[0](slot_ctx); + } +} +function get_slot_context(definition, ctx, $$scope, fn) { + return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx; +} +function get_slot_changes(definition, $$scope, dirty, fn) { + if (definition[2] && fn) { + const lets = definition[2](fn(dirty)); + if ($$scope.dirty === void 0) { + return lets; + } + if (typeof lets === "object") { + const merged = []; + const len = Math.max($$scope.dirty.length, lets.length); + for (let i = 0; i < len; i += 1) { + merged[i] = $$scope.dirty[i] | lets[i]; + } + return merged; + } + return $$scope.dirty | lets; + } + return $$scope.dirty; +} +function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) { + if (slot_changes) { + const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); + slot.p(slot_context, slot_changes); + } +} +function get_all_dirty_from_scope($$scope) { + if ($$scope.ctx.length > 32) { + const dirty = []; + const length = $$scope.ctx.length / 32; + for (let i = 0; i < length; i++) { + dirty[i] = -1; + } + return dirty; + } + return -1; +} +function null_to_empty(value) { + return value == null ? "" : value; +} +function action_destroyer(action_result) { + return action_result && is_function(action_result.destroy) ? action_result.destroy : noop; +} +const is_client = typeof window !== "undefined"; +let now = is_client ? () => window.performance.now() : () => Date.now(); +let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; +const tasks = /* @__PURE__ */ new Set(); +function run_tasks(now2) { + tasks.forEach((task) => { + if (!task.c(now2)) { + tasks.delete(task); + task.f(); + } + }); + if (tasks.size !== 0) + raf(run_tasks); +} +function loop(callback) { + let task; + if (tasks.size === 0) + raf(run_tasks); + return { + promise: new Promise((fulfill) => { + tasks.add(task = { c: callback, f: fulfill }); + }), + abort() { + tasks.delete(task); + } + }; +} +let is_hydrating = false; +function start_hydrating() { + is_hydrating = true; +} +function end_hydrating() { + is_hydrating = false; +} +function upper_bound(low, high, key, value) { + while (low < high) { + const mid = low + (high - low >> 1); + if (key(mid) <= value) { + low = mid + 1; + } else { + high = mid; + } + } + return low; +} +function init_hydrate(target) { + if (target.hydrate_init) + return; + target.hydrate_init = true; + let children2 = target.childNodes; + if (target.nodeName === "HEAD") { + const myChildren = []; + for (let i = 0; i < children2.length; i++) { + const node = children2[i]; + if (node.claim_order !== void 0) { + myChildren.push(node); + } + } + children2 = myChildren; + } + const m = new Int32Array(children2.length + 1); + const p = new Int32Array(children2.length); + m[0] = -1; + let longest = 0; + for (let i = 0; i < children2.length; i++) { + const current = children2[i].claim_order; + const seqLen = (longest > 0 && children2[m[longest]].claim_order <= current ? longest + 1 : upper_bound(1, longest, (idx) => children2[m[idx]].claim_order, current)) - 1; + p[i] = m[seqLen] + 1; + const newLen = seqLen + 1; + m[newLen] = i; + longest = Math.max(newLen, longest); + } + const lis = []; + const toMove = []; + let last = children2.length - 1; + for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) { + lis.push(children2[cur - 1]); + for (; last >= cur; last--) { + toMove.push(children2[last]); + } + last--; + } + for (; last >= 0; last--) { + toMove.push(children2[last]); + } + lis.reverse(); + toMove.sort((a, b) => a.claim_order - b.claim_order); + for (let i = 0, j = 0; i < toMove.length; i++) { + while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) { + j++; + } + const anchor = j < lis.length ? lis[j] : null; + target.insertBefore(toMove[i], anchor); + } +} +function append_hydration(target, node) { + if (is_hydrating) { + init_hydrate(target); + if (target.actual_end_child === void 0 || target.actual_end_child !== null && target.actual_end_child.parentNode !== target) { + target.actual_end_child = target.firstChild; + } + while (target.actual_end_child !== null && target.actual_end_child.claim_order === void 0) { + target.actual_end_child = target.actual_end_child.nextSibling; + } + if (node !== target.actual_end_child) { + if (node.claim_order !== void 0 || node.parentNode !== target) { + target.insertBefore(node, target.actual_end_child); + } + } else { + target.actual_end_child = node.nextSibling; + } + } else if (node.parentNode !== target || node.nextSibling !== null) { + target.appendChild(node); + } +} +function insert_hydration(target, node, anchor) { + if (is_hydrating && !anchor) { + append_hydration(target, node); + } else if (node.parentNode !== target || node.nextSibling != anchor) { + target.insertBefore(node, anchor || null); + } +} +function detach(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} +function destroy_each(iterations, detaching) { + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) + iterations[i].d(detaching); + } +} +function element(name) { + return document.createElement(name); +} +function svg_element(name) { + return document.createElementNS("http://www.w3.org/2000/svg", name); +} +function text(data) { + return document.createTextNode(data); +} +function space() { + return text(" "); +} +function empty() { + return text(""); +} +function listen(node, event, handler, options) { + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); +} +function prevent_default(fn) { + return function(event) { + event.preventDefault(); + return fn.call(this, event); + }; +} +function attr(node, attribute, value) { + if (value == null) + node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); +} +function children(element2) { + return Array.from(element2.childNodes); +} +function init_claim_info(nodes) { + if (nodes.claim_info === void 0) { + nodes.claim_info = { last_index: 0, total_claimed: 0 }; + } +} +function claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) { + init_claim_info(nodes); + const resultNode = (() => { + for (let i = nodes.claim_info.last_index; i < nodes.length; i++) { + const node = nodes[i]; + if (predicate(node)) { + const replacement = processNode(node); + if (replacement === void 0) { + nodes.splice(i, 1); + } else { + nodes[i] = replacement; + } + if (!dontUpdateLastIndex) { + nodes.claim_info.last_index = i; + } + return node; + } + } + for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) { + const node = nodes[i]; + if (predicate(node)) { + const replacement = processNode(node); + if (replacement === void 0) { + nodes.splice(i, 1); + } else { + nodes[i] = replacement; + } + if (!dontUpdateLastIndex) { + nodes.claim_info.last_index = i; + } else if (replacement === void 0) { + nodes.claim_info.last_index--; + } + return node; + } + } + return createNode(); + })(); + resultNode.claim_order = nodes.claim_info.total_claimed; + nodes.claim_info.total_claimed += 1; + return resultNode; +} +function claim_element_base(nodes, name, attributes, create_element) { + return claim_node(nodes, (node) => node.nodeName === name, (node) => { + const remove = []; + for (let j = 0; j < node.attributes.length; j++) { + const attribute = node.attributes[j]; + if (!attributes[attribute.name]) { + remove.push(attribute.name); + } + } + remove.forEach((v) => node.removeAttribute(v)); + return void 0; + }, () => create_element(name)); +} +function claim_element(nodes, name, attributes) { + return claim_element_base(nodes, name, attributes, element); +} +function claim_svg_element(nodes, name, attributes) { + return claim_element_base(nodes, name, attributes, svg_element); +} +function claim_text(nodes, data) { + return claim_node( + nodes, + (node) => node.nodeType === 3, + (node) => { + const dataStr = "" + data; + if (node.data.startsWith(dataStr)) { + if (node.data.length !== dataStr.length) { + return node.splitText(dataStr.length); + } + } else { + node.data = dataStr; + } + }, + () => text(data), + true + // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements + ); +} +function claim_space(nodes) { + return claim_text(nodes, " "); +} +function set_data(text2, data) { + data = "" + data; + if (text2.wholeText !== data) + text2.data = data; +} +function set_style(node, key, value, important) { + if (value === null) { + node.style.removeProperty(key); + } else { + node.style.setProperty(key, value, important ? "important" : ""); + } +} +function toggle_class(element2, name, toggle) { + element2.classList[toggle ? "add" : "remove"](name); +} +function head_selector(nodeId, head) { + const result = []; + let started = 0; + for (const node of head.childNodes) { + if (node.nodeType === 8) { + const comment = node.textContent.trim(); + if (comment === `HEAD_${nodeId}_END`) { + started -= 1; + result.push(node); + } else if (comment === `HEAD_${nodeId}_START`) { + started += 1; + result.push(node); + } + } else if (started > 0) { + result.push(node); + } + } + return result; +} +function construct_svelte_component(component, props) { + return new component(props); +} +let current_component; +function set_current_component(component) { + current_component = component; +} +function get_current_component() { + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; +} +function onMount(fn) { + get_current_component().$$.on_mount.push(fn); +} +function afterUpdate(fn) { + get_current_component().$$.after_update.push(fn); +} +const dirty_components = []; +const binding_callbacks = []; +const render_callbacks = []; +const flush_callbacks = []; +const resolved_promise = Promise.resolve(); +let update_scheduled = false; +function schedule_update() { + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } +} +function tick() { + schedule_update(); + return resolved_promise; +} +function add_render_callback(fn) { + render_callbacks.push(fn); +} +const seen_callbacks = /* @__PURE__ */ new Set(); +let flushidx = 0; +function flush() { + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e) { + dirty_components.length = 0; + flushidx = 0; + throw e; + } + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) + binding_callbacks.pop()(); + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + seen_callbacks.add(callback); + callback(); + } + } + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); +} +function update($$) { + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } +} +const outroing = /* @__PURE__ */ new Set(); +let outros; +function group_outros() { + outros = { + r: 0, + c: [], + p: outros + // parent group + }; +} +function check_outros() { + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; +} +function transition_in(block, local) { + if (block && block.i) { + outroing.delete(block); + block.i(local); + } +} +function transition_out(block, local, detach2, callback) { + if (block && block.o) { + if (outroing.has(block)) + return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach2) + block.d(1); + callback(); + } + }); + block.o(local); + } else if (callback) { + callback(); + } +} +const globals = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : global; +function create_component(block) { + block && block.c(); +} +function claim_component(block, parent_nodes) { + block && block.l(parent_nodes); +} +function mount_component(component, target, anchor, customElement) { + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); +} +function destroy_component(component, detaching) { + const $$ = component.$$; + if ($$.fragment !== null) { + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } +} +function make_dirty(component, i) { + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[i / 31 | 0] |= 1 << i % 31; +} +function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { + const parent_component = current_component; + set_current_component(component); + const $$ = component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root + }; + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { + if (!$$.skip_bound && $$.bound[i]) + $$.bound[i](value); + if (ready) + make_dirty(component, i); + } + return ret; + }) : []; + $$.update(); + ready = true; + run_all($$.before_update); + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + start_hydrating(); + const nodes = children(options.target); + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + $$.fragment && $$.fragment.c(); + } + if (options.intro) + transition_in(component.$$.fragment); + mount_component(component, options.target, options.anchor, options.customElement); + end_hydrating(); + flush(); + } + set_current_component(parent_component); +} +class SvelteComponent { + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; + } + const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) + callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; + } + } +} +export { + destroy_component as A, + tick as B, + noop as C, + svg_element as D, + claim_svg_element as E, + src_url_equal as F, + append_hydration as G, + component_subscribe as H, + create_slot as I, + update_slot_base as J, + get_all_dirty_from_scope as K, + get_slot_changes as L, + now as M, + loop as N, + listen as O, + run_all as P, + head_selector as Q, + toggle_class as R, + SvelteComponent as S, + action_destroyer as T, + destroy_each as U, + globals as V, + is_function as W, + prevent_default as X, + null_to_empty as Y, + space as a, + insert_hydration as b, + claim_space as c, + check_outros as d, + empty as e, + transition_in as f, + group_outros as g, + detach as h, + init as i, + afterUpdate as j, + element as k, + claim_element as l, + children as m, + attr as n, + onMount as o, + set_style as p, + text as q, + claim_text as r, + safe_not_equal as s, + transition_out as t, + set_data as u, + binding_callbacks as v, + construct_svelte_component as w, + create_component as x, + claim_component as y, + mount_component as z +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/parse-a9b5aeea.js b/examples/electron-app/src/_app/immutable/chunks/parse-a9b5aeea.js new file mode 100644 index 0000000..cd8990d --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/parse-a9b5aeea.js @@ -0,0 +1,109 @@ +Object.getOwnPropertyNames(Object.prototype).sort().join("\0"); +const UNDEFINED = -1; +const HOLE = -2; +const NAN = -3; +const POSITIVE_INFINITY = -4; +const NEGATIVE_INFINITY = -5; +const NEGATIVE_ZERO = -6; +function parse(serialized, revivers) { + return unflatten(JSON.parse(serialized), revivers); +} +function unflatten(parsed, revivers) { + if (typeof parsed === "number") + return hydrate(parsed, true); + if (!Array.isArray(parsed) || parsed.length === 0) { + throw new Error("Invalid input"); + } + const values = ( + /** @type {any[]} */ + parsed + ); + const hydrated = Array(values.length); + function hydrate(index, standalone = false) { + if (index === UNDEFINED) + return void 0; + if (index === NAN) + return NaN; + if (index === POSITIVE_INFINITY) + return Infinity; + if (index === NEGATIVE_INFINITY) + return -Infinity; + if (index === NEGATIVE_ZERO) + return -0; + if (standalone) + throw new Error(`Invalid input`); + if (index in hydrated) + return hydrated[index]; + const value = values[index]; + if (!value || typeof value !== "object") { + hydrated[index] = value; + } else if (Array.isArray(value)) { + if (typeof value[0] === "string") { + const type = value[0]; + const reviver = revivers == null ? void 0 : revivers[type]; + if (reviver) { + return hydrated[index] = reviver(hydrate(value[1])); + } + switch (type) { + case "Date": + hydrated[index] = new Date(value[1]); + break; + case "Set": + const set = /* @__PURE__ */ new Set(); + hydrated[index] = set; + for (let i = 1; i < value.length; i += 1) { + set.add(hydrate(value[i])); + } + break; + case "Map": + const map = /* @__PURE__ */ new Map(); + hydrated[index] = map; + for (let i = 1; i < value.length; i += 2) { + map.set(hydrate(value[i]), hydrate(value[i + 1])); + } + break; + case "RegExp": + hydrated[index] = new RegExp(value[1], value[2]); + break; + case "Object": + hydrated[index] = Object(value[1]); + break; + case "BigInt": + hydrated[index] = BigInt(value[1]); + break; + case "null": + const obj = /* @__PURE__ */ Object.create(null); + hydrated[index] = obj; + for (let i = 1; i < value.length; i += 2) { + obj[value[i]] = hydrate(value[i + 1]); + } + break; + default: + throw new Error(`Unknown type ${type}`); + } + } else { + const array = new Array(value.length); + hydrated[index] = array; + for (let i = 0; i < value.length; i += 1) { + const n = value[i]; + if (n === HOLE) + continue; + array[i] = hydrate(n); + } + } + } else { + const object = {}; + hydrated[index] = object; + for (const key in value) { + const n = value[key]; + object[key] = hydrate(n); + } + } + return hydrated[index]; + } + return hydrate(0); +} +export { + parse as p, + unflatten as u +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/singletons-0c6ee057.js b/examples/electron-app/src/_app/immutable/chunks/singletons-0c6ee057.js new file mode 100644 index 0000000..fc8f9b3 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/singletons-0c6ee057.js @@ -0,0 +1,187 @@ +import { w as writable } from "./index-bb582736.js"; +const base = ""; +let assets = base; +function set_assets(path) { + assets = path; +} +let version = ""; +function set_version(value) { + version = value; +} +const SNAPSHOT_KEY = "sveltekit:snapshot"; +const SCROLL_KEY = "sveltekit:scroll"; +const INDEX_KEY = "sveltekit:index"; +const PRELOAD_PRIORITIES = ( + /** @type {const} */ + { + tap: 1, + hover: 2, + viewport: 3, + eager: 4, + off: -1 + } +); +function get_base_uri(doc) { + let baseURI = doc.baseURI; + if (!baseURI) { + const baseTags = doc.getElementsByTagName("base"); + baseURI = baseTags.length ? baseTags[0].href : doc.URL; + } + return baseURI; +} +function scroll_state() { + return { + x: pageXOffset, + y: pageYOffset + }; +} +function link_option(element, name) { + const value = ( + /** @type {ValidLinkOptions | null} */ + element.getAttribute(`data-sveltekit-${name}`) + ); + return value; +} +const levels = { + ...PRELOAD_PRIORITIES, + "": PRELOAD_PRIORITIES.hover +}; +function parent_element(element) { + let parent = element.assignedSlot ?? element.parentNode; + if ((parent == null ? void 0 : parent.nodeType) === 11) + parent = parent.host; + return ( + /** @type {Element} */ + parent + ); +} +function find_anchor(element, target) { + while (element && element !== target) { + if (element.nodeName.toUpperCase() === "A" && element.hasAttribute("href")) { + return ( + /** @type {HTMLAnchorElement | SVGAElement} */ + element + ); + } + element = /** @type {Element} */ + parent_element(element); + } +} +function get_link_info(a, base2) { + let url; + try { + url = new URL(a instanceof SVGAElement ? a.href.baseVal : a.href, document.baseURI); + } catch { + } + const target = a instanceof SVGAElement ? a.target.baseVal : a.target; + const external = !url || !!target || is_external_url(url, base2) || (a.getAttribute("rel") || "").split(/\s+/).includes("external") || a.hasAttribute("download"); + return { url, external, target }; +} +function get_router_options(element) { + let noscroll = null; + let preload_code = null; + let preload_data = null; + let reload = null; + let el = element; + while (el && el !== document.documentElement) { + if (preload_code === null) + preload_code = link_option(el, "preload-code"); + if (preload_data === null) + preload_data = link_option(el, "preload-data"); + if (noscroll === null) + noscroll = link_option(el, "noscroll"); + if (reload === null) + reload = link_option(el, "reload"); + el = /** @type {Element} */ + parent_element(el); + } + return { + preload_code: levels[preload_code ?? "off"], + preload_data: levels[preload_data ?? "off"], + noscroll: noscroll === "off" ? false : noscroll === "" ? true : null, + reload: reload === "off" ? false : reload === "" ? true : null + }; +} +function notifiable_store(value) { + const store = writable(value); + let ready = true; + function notify() { + ready = true; + store.update((val) => val); + } + function set(new_value) { + ready = false; + store.set(new_value); + } + function subscribe(run) { + let old_value; + return store.subscribe((new_value) => { + if (old_value === void 0 || ready && new_value !== old_value) { + run(old_value = new_value); + } + }); + } + return { notify, set, subscribe }; +} +function create_updated_store() { + const { set, subscribe } = writable(false); + let timeout; + async function check() { + clearTimeout(timeout); + const res = await fetch(`${assets}/${"_app/version.json"}`, { + headers: { + pragma: "no-cache", + "cache-control": "no-cache" + } + }); + if (res.ok) { + const data = await res.json(); + const updated = data.version !== version; + if (updated) { + set(true); + clearTimeout(timeout); + } + return updated; + } else { + throw new Error(`Version check failed: ${res.status}`); + } + } + return { + subscribe, + check + }; +} +function is_external_url(url, base2) { + return url.origin !== location.origin || !url.pathname.startsWith(base2); +} +let client; +function init(opts) { + client = opts.client; +} +const stores = { + url: notifiable_store({}), + page: notifiable_store({}), + navigating: writable( + /** @type {import('types').Navigation | null} */ + null + ), + updated: create_updated_store() +}; +export { + INDEX_KEY as I, + PRELOAD_PRIORITIES as P, + SCROLL_KEY as S, + SNAPSHOT_KEY as a, + get_link_info as b, + get_router_options as c, + scroll_state as d, + base as e, + find_anchor as f, + get_base_uri as g, + init as h, + is_external_url as i, + set_assets as j, + set_version as k, + client as l, + stores as s +}; diff --git a/examples/electron-app/src/_app/immutable/chunks/stores-8cac4559.js b/examples/electron-app/src/_app/immutable/chunks/stores-8cac4559.js new file mode 100644 index 0000000..7c36fd2 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/chunks/stores-8cac4559.js @@ -0,0 +1,24 @@ +import "./index-d985765e.js"; +import { s as stores } from "./singletons-0c6ee057.js"; +const getStores = () => { + const stores$1 = stores; + return { + page: { + subscribe: stores$1.page.subscribe + }, + navigating: { + subscribe: stores$1.navigating.subscribe + }, + updated: stores$1.updated + }; +}; +const page = { + /** @param {(value: any) => void} fn */ + subscribe(fn) { + const store = getStores().page; + return store.subscribe(fn); + } +}; +export { + page as p +}; diff --git a/examples/electron-app/src/_app/immutable/components/error.svelte-673baa07.js b/examples/electron-app/src/_app/immutable/components/error.svelte-673baa07.js new file mode 100644 index 0000000..c836802 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/error.svelte-673baa07.js @@ -0,0 +1,80 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, k as element, q as text, a as space, l as claim_element, m as children, r as claim_text, h as detach, c as claim_space, b as insert_hydration, G as append_hydration, u as set_data, C as noop, H as component_subscribe } from "../chunks/index-d985765e.js"; +import { p as page } from "../chunks/stores-8cac4559.js"; +function create_fragment(ctx) { + var _a; + let h1; + let t0_value = ( + /*$page*/ + ctx[0].status + "" + ); + let t0; + let t1; + let p; + let t2_value = ( + /*$page*/ + ((_a = ctx[0].error) == null ? void 0 : _a.message) + "" + ); + let t2; + return { + c() { + h1 = element("h1"); + t0 = text(t0_value); + t1 = space(); + p = element("p"); + t2 = text(t2_value); + }, + l(nodes) { + h1 = claim_element(nodes, "H1", {}); + var h1_nodes = children(h1); + t0 = claim_text(h1_nodes, t0_value); + h1_nodes.forEach(detach); + t1 = claim_space(nodes); + p = claim_element(nodes, "P", {}); + var p_nodes = children(p); + t2 = claim_text(p_nodes, t2_value); + p_nodes.forEach(detach); + }, + m(target, anchor) { + insert_hydration(target, h1, anchor); + append_hydration(h1, t0); + insert_hydration(target, t1, anchor); + insert_hydration(target, p, anchor); + append_hydration(p, t2); + }, + p(ctx2, [dirty]) { + var _a2; + if (dirty & /*$page*/ + 1 && t0_value !== (t0_value = /*$page*/ + ctx2[0].status + "")) + set_data(t0, t0_value); + if (dirty & /*$page*/ + 1 && t2_value !== (t2_value = /*$page*/ + ((_a2 = ctx2[0].error) == null ? void 0 : _a2.message) + "")) + set_data(t2, t2_value); + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(h1); + if (detaching) + detach(t1); + if (detaching) + detach(p); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let $page; + component_subscribe($$self, page, ($$value) => $$invalidate(0, $page = $$value)); + return [$page]; +} +class Error extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, {}); + } +} +export { + Error as default +}; diff --git a/examples/electron-app/src/_app/immutable/components/pages/_layout.svelte-20a5d298.js b/examples/electron-app/src/_app/immutable/components/pages/_layout.svelte-20a5d298.js new file mode 100644 index 0000000..ae0fd53 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/pages/_layout.svelte-20a5d298.js @@ -0,0 +1,409 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, k as element, a as space, D as svg_element, q as text, l as claim_element, m as children, h as detach, c as claim_space, E as claim_svg_element, r as claim_text, F as src_url_equal, n as attr, b as insert_hydration, G as append_hydration, C as noop, H as component_subscribe, I as create_slot, x as create_component, y as claim_component, z as mount_component, J as update_slot_base, K as get_all_dirty_from_scope, L as get_slot_changes, f as transition_in, t as transition_out, A as destroy_component } from "../../chunks/index-d985765e.js"; +import { p as page } from "../../chunks/stores-8cac4559.js"; +const logo = "" + new URL("../../assets/svelte-logo-87df40b8.svg", import.meta.url).href; +const github = "" + new URL("../../assets/github-1ea8d62e.svg", import.meta.url).href; +const Header_svelte_svelte_type_style_lang = ""; +function create_fragment$1(ctx) { + let header; + let div0; + let a0; + let img0; + let img0_src_value; + let t0; + let nav; + let svg0; + let path0; + let t1; + let ul; + let li0; + let a1; + let t2; + let li0_aria_current_value; + let t3; + let li1; + let a2; + let t4; + let li1_aria_current_value; + let t5; + let li2; + let a3; + let t6; + let li2_aria_current_value; + let t7; + let svg1; + let path1; + let t8; + let div1; + let a4; + let img1; + let img1_src_value; + return { + c() { + header = element("header"); + div0 = element("div"); + a0 = element("a"); + img0 = element("img"); + t0 = space(); + nav = element("nav"); + svg0 = svg_element("svg"); + path0 = svg_element("path"); + t1 = space(); + ul = element("ul"); + li0 = element("li"); + a1 = element("a"); + t2 = text("Home"); + t3 = space(); + li1 = element("li"); + a2 = element("a"); + t4 = text("About"); + t5 = space(); + li2 = element("li"); + a3 = element("a"); + t6 = text("Sverdle"); + t7 = space(); + svg1 = svg_element("svg"); + path1 = svg_element("path"); + t8 = space(); + div1 = element("div"); + a4 = element("a"); + img1 = element("img"); + this.h(); + }, + l(nodes) { + header = claim_element(nodes, "HEADER", { class: true }); + var header_nodes = children(header); + div0 = claim_element(header_nodes, "DIV", { class: true }); + var div0_nodes = children(div0); + a0 = claim_element(div0_nodes, "A", { href: true, class: true }); + var a0_nodes = children(a0); + img0 = claim_element(a0_nodes, "IMG", { src: true, alt: true, class: true }); + a0_nodes.forEach(detach); + div0_nodes.forEach(detach); + t0 = claim_space(header_nodes); + nav = claim_element(header_nodes, "NAV", { class: true }); + var nav_nodes = children(nav); + svg0 = claim_svg_element(nav_nodes, "svg", { + viewBox: true, + "aria-hidden": true, + class: true + }); + var svg0_nodes = children(svg0); + path0 = claim_svg_element(svg0_nodes, "path", { d: true, class: true }); + children(path0).forEach(detach); + svg0_nodes.forEach(detach); + t1 = claim_space(nav_nodes); + ul = claim_element(nav_nodes, "UL", { class: true }); + var ul_nodes = children(ul); + li0 = claim_element(ul_nodes, "LI", { "aria-current": true, class: true }); + var li0_nodes = children(li0); + a1 = claim_element(li0_nodes, "A", { href: true, class: true }); + var a1_nodes = children(a1); + t2 = claim_text(a1_nodes, "Home"); + a1_nodes.forEach(detach); + li0_nodes.forEach(detach); + t3 = claim_space(ul_nodes); + li1 = claim_element(ul_nodes, "LI", { "aria-current": true, class: true }); + var li1_nodes = children(li1); + a2 = claim_element(li1_nodes, "A", { href: true, class: true }); + var a2_nodes = children(a2); + t4 = claim_text(a2_nodes, "About"); + a2_nodes.forEach(detach); + li1_nodes.forEach(detach); + t5 = claim_space(ul_nodes); + li2 = claim_element(ul_nodes, "LI", { "aria-current": true, class: true }); + var li2_nodes = children(li2); + a3 = claim_element(li2_nodes, "A", { href: true, class: true }); + var a3_nodes = children(a3); + t6 = claim_text(a3_nodes, "Sverdle"); + a3_nodes.forEach(detach); + li2_nodes.forEach(detach); + ul_nodes.forEach(detach); + t7 = claim_space(nav_nodes); + svg1 = claim_svg_element(nav_nodes, "svg", { + viewBox: true, + "aria-hidden": true, + class: true + }); + var svg1_nodes = children(svg1); + path1 = claim_svg_element(svg1_nodes, "path", { d: true, class: true }); + children(path1).forEach(detach); + svg1_nodes.forEach(detach); + nav_nodes.forEach(detach); + t8 = claim_space(header_nodes); + div1 = claim_element(header_nodes, "DIV", { class: true }); + var div1_nodes = children(div1); + a4 = claim_element(div1_nodes, "A", { href: true, class: true }); + var a4_nodes = children(a4); + img1 = claim_element(a4_nodes, "IMG", { src: true, alt: true, class: true }); + a4_nodes.forEach(detach); + div1_nodes.forEach(detach); + header_nodes.forEach(detach); + this.h(); + }, + h() { + if (!src_url_equal(img0.src, img0_src_value = logo)) + attr(img0, "src", img0_src_value); + attr(img0, "alt", "SvelteKit"); + attr(img0, "class", "svelte-1u9z1tp"); + attr(a0, "href", "https://kit.svelte.dev"); + attr(a0, "class", "svelte-1u9z1tp"); + attr(div0, "class", "corner svelte-1u9z1tp"); + attr(path0, "d", "M0,0 L1,2 C1.5,3 1.5,3 2,3 L2,0 Z"); + attr(path0, "class", "svelte-1u9z1tp"); + attr(svg0, "viewBox", "0 0 2 3"); + attr(svg0, "aria-hidden", "true"); + attr(svg0, "class", "svelte-1u9z1tp"); + attr(a1, "href", "/"); + attr(a1, "class", "svelte-1u9z1tp"); + attr(li0, "aria-current", li0_aria_current_value = /*$page*/ + ctx[0].url.pathname === "/" ? "page" : void 0); + attr(li0, "class", "svelte-1u9z1tp"); + attr(a2, "href", "/about"); + attr(a2, "class", "svelte-1u9z1tp"); + attr(li1, "aria-current", li1_aria_current_value = /*$page*/ + ctx[0].url.pathname === "/about" ? "page" : void 0); + attr(li1, "class", "svelte-1u9z1tp"); + attr(a3, "href", "/sverdle"); + attr(a3, "class", "svelte-1u9z1tp"); + attr(li2, "aria-current", li2_aria_current_value = /*$page*/ + ctx[0].url.pathname.startsWith("/sverdle") ? "page" : void 0); + attr(li2, "class", "svelte-1u9z1tp"); + attr(ul, "class", "svelte-1u9z1tp"); + attr(path1, "d", "M0,0 L0,3 C0.5,3 0.5,3 1,2 L2,0 Z"); + attr(path1, "class", "svelte-1u9z1tp"); + attr(svg1, "viewBox", "0 0 2 3"); + attr(svg1, "aria-hidden", "true"); + attr(svg1, "class", "svelte-1u9z1tp"); + attr(nav, "class", "svelte-1u9z1tp"); + if (!src_url_equal(img1.src, img1_src_value = github)) + attr(img1, "src", img1_src_value); + attr(img1, "alt", "GitHub"); + attr(img1, "class", "svelte-1u9z1tp"); + attr(a4, "href", "https://github.com/sveltejs/kit"); + attr(a4, "class", "svelte-1u9z1tp"); + attr(div1, "class", "corner svelte-1u9z1tp"); + attr(header, "class", "svelte-1u9z1tp"); + }, + m(target, anchor) { + insert_hydration(target, header, anchor); + append_hydration(header, div0); + append_hydration(div0, a0); + append_hydration(a0, img0); + append_hydration(header, t0); + append_hydration(header, nav); + append_hydration(nav, svg0); + append_hydration(svg0, path0); + append_hydration(nav, t1); + append_hydration(nav, ul); + append_hydration(ul, li0); + append_hydration(li0, a1); + append_hydration(a1, t2); + append_hydration(ul, t3); + append_hydration(ul, li1); + append_hydration(li1, a2); + append_hydration(a2, t4); + append_hydration(ul, t5); + append_hydration(ul, li2); + append_hydration(li2, a3); + append_hydration(a3, t6); + append_hydration(nav, t7); + append_hydration(nav, svg1); + append_hydration(svg1, path1); + append_hydration(header, t8); + append_hydration(header, div1); + append_hydration(div1, a4); + append_hydration(a4, img1); + }, + p(ctx2, [dirty]) { + if (dirty & /*$page*/ + 1 && li0_aria_current_value !== (li0_aria_current_value = /*$page*/ + ctx2[0].url.pathname === "/" ? "page" : void 0)) { + attr(li0, "aria-current", li0_aria_current_value); + } + if (dirty & /*$page*/ + 1 && li1_aria_current_value !== (li1_aria_current_value = /*$page*/ + ctx2[0].url.pathname === "/about" ? "page" : void 0)) { + attr(li1, "aria-current", li1_aria_current_value); + } + if (dirty & /*$page*/ + 1 && li2_aria_current_value !== (li2_aria_current_value = /*$page*/ + ctx2[0].url.pathname.startsWith("/sverdle") ? "page" : void 0)) { + attr(li2, "aria-current", li2_aria_current_value); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(header); + } + }; +} +function instance$1($$self, $$props, $$invalidate) { + let $page; + component_subscribe($$self, page, ($$value) => $$invalidate(0, $page = $$value)); + return [$page]; +} +class Header extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$1, create_fragment$1, safe_not_equal, {}); + } +} +const styles = ""; +const _layout_svelte_svelte_type_style_lang = ""; +function create_fragment(ctx) { + let div; + let header; + let t0; + let main; + let t1; + let footer; + let p; + let t2; + let a; + let t3; + let t4; + let current; + header = new Header({}); + const default_slot_template = ( + /*#slots*/ + ctx[1].default + ); + const default_slot = create_slot( + default_slot_template, + ctx, + /*$$scope*/ + ctx[0], + null + ); + return { + c() { + div = element("div"); + create_component(header.$$.fragment); + t0 = space(); + main = element("main"); + if (default_slot) + default_slot.c(); + t1 = space(); + footer = element("footer"); + p = element("p"); + t2 = text("visit "); + a = element("a"); + t3 = text("kit.svelte.dev"); + t4 = text(" to learn SvelteKit"); + this.h(); + }, + l(nodes) { + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + claim_component(header.$$.fragment, div_nodes); + t0 = claim_space(div_nodes); + main = claim_element(div_nodes, "MAIN", { class: true }); + var main_nodes = children(main); + if (default_slot) + default_slot.l(main_nodes); + main_nodes.forEach(detach); + t1 = claim_space(div_nodes); + footer = claim_element(div_nodes, "FOOTER", { class: true }); + var footer_nodes = children(footer); + p = claim_element(footer_nodes, "P", {}); + var p_nodes = children(p); + t2 = claim_text(p_nodes, "visit "); + a = claim_element(p_nodes, "A", { href: true, class: true }); + var a_nodes = children(a); + t3 = claim_text(a_nodes, "kit.svelte.dev"); + a_nodes.forEach(detach); + t4 = claim_text(p_nodes, " to learn SvelteKit"); + p_nodes.forEach(detach); + footer_nodes.forEach(detach); + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(main, "class", "svelte-8o1gnw"); + attr(a, "href", "https://kit.svelte.dev"); + attr(a, "class", "svelte-8o1gnw"); + attr(footer, "class", "svelte-8o1gnw"); + attr(div, "class", "app svelte-8o1gnw"); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + mount_component(header, div, null); + append_hydration(div, t0); + append_hydration(div, main); + if (default_slot) { + default_slot.m(main, null); + } + append_hydration(div, t1); + append_hydration(div, footer); + append_hydration(footer, p); + append_hydration(p, t2); + append_hydration(p, a); + append_hydration(a, t3); + append_hydration(p, t4); + current = true; + }, + p(ctx2, [dirty]) { + if (default_slot) { + if (default_slot.p && (!current || dirty & /*$$scope*/ + 1)) { + update_slot_base( + default_slot, + default_slot_template, + ctx2, + /*$$scope*/ + ctx2[0], + !current ? get_all_dirty_from_scope( + /*$$scope*/ + ctx2[0] + ) : get_slot_changes( + default_slot_template, + /*$$scope*/ + ctx2[0], + dirty, + null + ), + null + ); + } + } + }, + i(local) { + if (current) + return; + transition_in(header.$$.fragment, local); + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(header.$$.fragment, local); + transition_out(default_slot, local); + current = false; + }, + d(detaching) { + if (detaching) + detach(div); + destroy_component(header); + if (default_slot) + default_slot.d(detaching); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + $$self.$$set = ($$props2) => { + if ("$$scope" in $$props2) + $$invalidate(0, $$scope = $$props2.$$scope); + }; + return [$$scope, slots]; +} +class Layout extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, {}); + } +} +export { + Layout as default +}; diff --git a/examples/electron-app/src/_app/immutable/components/pages/_page.svelte-8f3445c9.js b/examples/electron-app/src/_app/immutable/components/pages/_page.svelte-8f3445c9.js new file mode 100644 index 0000000..722e228 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/pages/_page.svelte-8f3445c9.js @@ -0,0 +1,469 @@ +import { M as now, N as loop, S as SvelteComponent, i as init, s as safe_not_equal, k as element, D as svg_element, a as space, q as text, l as claim_element, m as children, E as claim_svg_element, h as detach, c as claim_space, r as claim_text, n as attr, p as set_style, b as insert_hydration, G as append_hydration, O as listen, u as set_data, C as noop, P as run_all, H as component_subscribe, x as create_component, Q as head_selector, y as claim_component, F as src_url_equal, z as mount_component, f as transition_in, t as transition_out, A as destroy_component } from "../../chunks/index-d985765e.js"; +import { w as writable } from "../../chunks/index-bb582736.js"; +function is_date(obj) { + return Object.prototype.toString.call(obj) === "[object Date]"; +} +function tick_spring(ctx, last_value, current_value, target_value) { + if (typeof current_value === "number" || is_date(current_value)) { + const delta = target_value - current_value; + const velocity = (current_value - last_value) / (ctx.dt || 1 / 60); + const spring2 = ctx.opts.stiffness * delta; + const damper = ctx.opts.damping * velocity; + const acceleration = (spring2 - damper) * ctx.inv_mass; + const d = (velocity + acceleration) * ctx.dt; + if (Math.abs(d) < ctx.opts.precision && Math.abs(delta) < ctx.opts.precision) { + return target_value; + } else { + ctx.settled = false; + return is_date(current_value) ? new Date(current_value.getTime() + d) : current_value + d; + } + } else if (Array.isArray(current_value)) { + return current_value.map((_, i) => tick_spring(ctx, last_value[i], current_value[i], target_value[i])); + } else if (typeof current_value === "object") { + const next_value = {}; + for (const k in current_value) { + next_value[k] = tick_spring(ctx, last_value[k], current_value[k], target_value[k]); + } + return next_value; + } else { + throw new Error(`Cannot spring ${typeof current_value} values`); + } +} +function spring(value, opts = {}) { + const store = writable(value); + const { stiffness = 0.15, damping = 0.8, precision = 0.01 } = opts; + let last_time; + let task; + let current_token; + let last_value = value; + let target_value = value; + let inv_mass = 1; + let inv_mass_recovery_rate = 0; + let cancel_task = false; + function set(new_value, opts2 = {}) { + target_value = new_value; + const token = current_token = {}; + if (value == null || opts2.hard || spring2.stiffness >= 1 && spring2.damping >= 1) { + cancel_task = true; + last_time = now(); + last_value = new_value; + store.set(value = target_value); + return Promise.resolve(); + } else if (opts2.soft) { + const rate = opts2.soft === true ? 0.5 : +opts2.soft; + inv_mass_recovery_rate = 1 / (rate * 60); + inv_mass = 0; + } + if (!task) { + last_time = now(); + cancel_task = false; + task = loop((now2) => { + if (cancel_task) { + cancel_task = false; + task = null; + return false; + } + inv_mass = Math.min(inv_mass + inv_mass_recovery_rate, 1); + const ctx = { + inv_mass, + opts: spring2, + settled: true, + dt: (now2 - last_time) * 60 / 1e3 + }; + const next_value = tick_spring(ctx, last_value, value, target_value); + last_time = now2; + last_value = value; + store.set(value = next_value); + if (ctx.settled) { + task = null; + } + return !ctx.settled; + }); + } + return new Promise((fulfil) => { + task.promise.then(() => { + if (token === current_token) + fulfil(); + }); + }); + } + const spring2 = { + set, + update: (fn, opts2) => set(fn(target_value, value), opts2), + subscribe: store.subscribe, + stiffness, + damping, + precision + }; + return spring2; +} +const Counter_svelte_svelte_type_style_lang = ""; +function create_fragment$1(ctx) { + let div2; + let button0; + let svg0; + let path0; + let t0; + let div1; + let div0; + let strong0; + let t1_value = Math.floor( + /*$displayed_count*/ + ctx[1] + 1 + ) + ""; + let t1; + let t2; + let strong1; + let t3_value = Math.floor( + /*$displayed_count*/ + ctx[1] + ) + ""; + let t3; + let t4; + let button1; + let svg1; + let path1; + let mounted; + let dispose; + return { + c() { + div2 = element("div"); + button0 = element("button"); + svg0 = svg_element("svg"); + path0 = svg_element("path"); + t0 = space(); + div1 = element("div"); + div0 = element("div"); + strong0 = element("strong"); + t1 = text(t1_value); + t2 = space(); + strong1 = element("strong"); + t3 = text(t3_value); + t4 = space(); + button1 = element("button"); + svg1 = svg_element("svg"); + path1 = svg_element("path"); + this.h(); + }, + l(nodes) { + div2 = claim_element(nodes, "DIV", { class: true }); + var div2_nodes = children(div2); + button0 = claim_element(div2_nodes, "BUTTON", { "aria-label": true, class: true }); + var button0_nodes = children(button0); + svg0 = claim_svg_element(button0_nodes, "svg", { + "aria-hidden": true, + viewBox: true, + class: true + }); + var svg0_nodes = children(svg0); + path0 = claim_svg_element(svg0_nodes, "path", { d: true, class: true }); + children(path0).forEach(detach); + svg0_nodes.forEach(detach); + button0_nodes.forEach(detach); + t0 = claim_space(div2_nodes); + div1 = claim_element(div2_nodes, "DIV", { class: true }); + var div1_nodes = children(div1); + div0 = claim_element(div1_nodes, "DIV", { class: true, style: true }); + var div0_nodes = children(div0); + strong0 = claim_element(div0_nodes, "STRONG", { class: true, "aria-hidden": true }); + var strong0_nodes = children(strong0); + t1 = claim_text(strong0_nodes, t1_value); + strong0_nodes.forEach(detach); + t2 = claim_space(div0_nodes); + strong1 = claim_element(div0_nodes, "STRONG", { class: true }); + var strong1_nodes = children(strong1); + t3 = claim_text(strong1_nodes, t3_value); + strong1_nodes.forEach(detach); + div0_nodes.forEach(detach); + div1_nodes.forEach(detach); + t4 = claim_space(div2_nodes); + button1 = claim_element(div2_nodes, "BUTTON", { "aria-label": true, class: true }); + var button1_nodes = children(button1); + svg1 = claim_svg_element(button1_nodes, "svg", { + "aria-hidden": true, + viewBox: true, + class: true + }); + var svg1_nodes = children(svg1); + path1 = claim_svg_element(svg1_nodes, "path", { d: true, class: true }); + children(path1).forEach(detach); + svg1_nodes.forEach(detach); + button1_nodes.forEach(detach); + div2_nodes.forEach(detach); + this.h(); + }, + h() { + attr(path0, "d", "M0,0.5 L1,0.5"); + attr(path0, "class", "svelte-y96mxt"); + attr(svg0, "aria-hidden", "true"); + attr(svg0, "viewBox", "0 0 1 1"); + attr(svg0, "class", "svelte-y96mxt"); + attr(button0, "aria-label", "Decrease the counter by one"); + attr(button0, "class", "svelte-y96mxt"); + attr(strong0, "class", "hidden svelte-y96mxt"); + attr(strong0, "aria-hidden", "true"); + attr(strong1, "class", "svelte-y96mxt"); + attr(div0, "class", "counter-digits svelte-y96mxt"); + set_style(div0, "transform", "translate(0, " + 100 * /*offset*/ + ctx[2] + "%)"); + attr(div1, "class", "counter-viewport svelte-y96mxt"); + attr(path1, "d", "M0,0.5 L1,0.5 M0.5,0 L0.5,1"); + attr(path1, "class", "svelte-y96mxt"); + attr(svg1, "aria-hidden", "true"); + attr(svg1, "viewBox", "0 0 1 1"); + attr(svg1, "class", "svelte-y96mxt"); + attr(button1, "aria-label", "Increase the counter by one"); + attr(button1, "class", "svelte-y96mxt"); + attr(div2, "class", "counter svelte-y96mxt"); + }, + m(target, anchor) { + insert_hydration(target, div2, anchor); + append_hydration(div2, button0); + append_hydration(button0, svg0); + append_hydration(svg0, path0); + append_hydration(div2, t0); + append_hydration(div2, div1); + append_hydration(div1, div0); + append_hydration(div0, strong0); + append_hydration(strong0, t1); + append_hydration(div0, t2); + append_hydration(div0, strong1); + append_hydration(strong1, t3); + append_hydration(div2, t4); + append_hydration(div2, button1); + append_hydration(button1, svg1); + append_hydration(svg1, path1); + if (!mounted) { + dispose = [ + listen( + button0, + "click", + /*click_handler*/ + ctx[4] + ), + listen( + button1, + "click", + /*click_handler_1*/ + ctx[5] + ) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + if (dirty & /*$displayed_count*/ + 2 && t1_value !== (t1_value = Math.floor( + /*$displayed_count*/ + ctx2[1] + 1 + ) + "")) + set_data(t1, t1_value); + if (dirty & /*$displayed_count*/ + 2 && t3_value !== (t3_value = Math.floor( + /*$displayed_count*/ + ctx2[1] + ) + "")) + set_data(t3, t3_value); + if (dirty & /*offset*/ + 4) { + set_style(div0, "transform", "translate(0, " + 100 * /*offset*/ + ctx2[2] + "%)"); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) + detach(div2); + mounted = false; + run_all(dispose); + } + }; +} +function modulo(n, m) { + return (n % m + m) % m; +} +function instance($$self, $$props, $$invalidate) { + let offset; + let $displayed_count; + let count = 0; + const displayed_count = spring(); + component_subscribe($$self, displayed_count, (value) => $$invalidate(1, $displayed_count = value)); + const click_handler = () => $$invalidate(0, count -= 1); + const click_handler_1 = () => $$invalidate(0, count += 1); + $$self.$$.update = () => { + if ($$self.$$.dirty & /*count*/ + 1) { + displayed_count.set(count); + } + if ($$self.$$.dirty & /*$displayed_count*/ + 2) { + $$invalidate(2, offset = modulo($displayed_count, 1)); + } + }; + return [ + count, + $displayed_count, + offset, + displayed_count, + click_handler, + click_handler_1 + ]; +} +class Counter extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment$1, safe_not_equal, {}); + } +} +const welcome = "" + new URL("../../assets/svelte-welcome-c18bcf5a.webp", import.meta.url).href; +const welcome_fallback = "" + new URL("../../assets/svelte-welcome-6c300099.png", import.meta.url).href; +const _page_svelte_svelte_type_style_lang = ""; +function create_fragment(ctx) { + let meta; + let t0; + let section; + let h1; + let span; + let picture; + let source; + let t1; + let img; + let img_src_value; + let t2; + let br; + let t3; + let t4; + let h2; + let t5; + let strong; + let t6; + let t7; + let counter; + let current; + counter = new Counter({}); + return { + c() { + meta = element("meta"); + t0 = space(); + section = element("section"); + h1 = element("h1"); + span = element("span"); + picture = element("picture"); + source = element("source"); + t1 = space(); + img = element("img"); + t2 = text("\n\n to your new"); + br = element("br"); + t3 = text("SvelteKit app"); + t4 = space(); + h2 = element("h2"); + t5 = text("try editing "); + strong = element("strong"); + t6 = text("src/routes/+page.svelte"); + t7 = space(); + create_component(counter.$$.fragment); + this.h(); + }, + l(nodes) { + const head_nodes = head_selector("svelte-t32ptj", document.head); + meta = claim_element(head_nodes, "META", { name: true, content: true }); + head_nodes.forEach(detach); + t0 = claim_space(nodes); + section = claim_element(nodes, "SECTION", { class: true }); + var section_nodes = children(section); + h1 = claim_element(section_nodes, "H1", { class: true }); + var h1_nodes = children(h1); + span = claim_element(h1_nodes, "SPAN", { class: true }); + var span_nodes = children(span); + picture = claim_element(span_nodes, "PICTURE", {}); + var picture_nodes = children(picture); + source = claim_element(picture_nodes, "SOURCE", { srcset: true, type: true }); + t1 = claim_space(picture_nodes); + img = claim_element(picture_nodes, "IMG", { src: true, alt: true, class: true }); + picture_nodes.forEach(detach); + span_nodes.forEach(detach); + t2 = claim_text(h1_nodes, "\n\n to your new"); + br = claim_element(h1_nodes, "BR", {}); + t3 = claim_text(h1_nodes, "SvelteKit app"); + h1_nodes.forEach(detach); + t4 = claim_space(section_nodes); + h2 = claim_element(section_nodes, "H2", {}); + var h2_nodes = children(h2); + t5 = claim_text(h2_nodes, "try editing "); + strong = claim_element(h2_nodes, "STRONG", {}); + var strong_nodes = children(strong); + t6 = claim_text(strong_nodes, "src/routes/+page.svelte"); + strong_nodes.forEach(detach); + h2_nodes.forEach(detach); + t7 = claim_space(section_nodes); + claim_component(counter.$$.fragment, section_nodes); + section_nodes.forEach(detach); + this.h(); + }, + h() { + document.title = "Home"; + attr(meta, "name", "description"); + attr(meta, "content", "Svelte demo app"); + attr(source, "srcset", welcome); + attr(source, "type", "image/webp"); + if (!src_url_equal(img.src, img_src_value = welcome_fallback)) + attr(img, "src", img_src_value); + attr(img, "alt", "Welcome"); + attr(img, "class", "svelte-19xx0bt"); + attr(span, "class", "welcome svelte-19xx0bt"); + attr(h1, "class", "svelte-19xx0bt"); + attr(section, "class", "svelte-19xx0bt"); + }, + m(target, anchor) { + append_hydration(document.head, meta); + insert_hydration(target, t0, anchor); + insert_hydration(target, section, anchor); + append_hydration(section, h1); + append_hydration(h1, span); + append_hydration(span, picture); + append_hydration(picture, source); + append_hydration(picture, t1); + append_hydration(picture, img); + append_hydration(h1, t2); + append_hydration(h1, br); + append_hydration(h1, t3); + append_hydration(section, t4); + append_hydration(section, h2); + append_hydration(h2, t5); + append_hydration(h2, strong); + append_hydration(strong, t6); + append_hydration(section, t7); + mount_component(counter, section, null); + current = true; + }, + p: noop, + i(local) { + if (current) + return; + transition_in(counter.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(counter.$$.fragment, local); + current = false; + }, + d(detaching) { + detach(meta); + if (detaching) + detach(t0); + if (detaching) + detach(section); + destroy_component(counter); + } + }; +} +class Page extends SvelteComponent { + constructor(options) { + super(); + init(this, options, null, create_fragment, safe_not_equal, {}); + } +} +export { + Page as default +}; diff --git a/examples/electron-app/src/_app/immutable/components/pages/about/_page.svelte-f31c9606.js b/examples/electron-app/src/_app/immutable/components/pages/about/_page.svelte-f31c9606.js new file mode 100644 index 0000000..6093e61 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/pages/about/_page.svelte-f31c9606.js @@ -0,0 +1,150 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, k as element, a as space, q as text, Q as head_selector, l as claim_element, h as detach, c as claim_space, m as children, r as claim_text, n as attr, G as append_hydration, b as insert_hydration, C as noop } from "../../../chunks/index-d985765e.js"; +function create_fragment(ctx) { + let meta; + let t0; + let div; + let h1; + let t1; + let t2; + let p0; + let t3; + let a0; + let t4; + let t5; + let t6; + let pre; + let t7; + let t8; + let p1; + let t9; + let t10; + let p2; + let t11; + let a1; + let t12; + let t13; + return { + c() { + meta = element("meta"); + t0 = space(); + div = element("div"); + h1 = element("h1"); + t1 = text("About this app"); + t2 = space(); + p0 = element("p"); + t3 = text("This is a "); + a0 = element("a"); + t4 = text("SvelteKit"); + t5 = text(" app. You can make your own by typing the\n following into your command line and following the prompts:"); + t6 = space(); + pre = element("pre"); + t7 = text("npm create svelte@latest"); + t8 = space(); + p1 = element("p"); + t9 = text("The page you're looking at is purely static HTML, with no client-side interactivity needed.\n Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening\n the devtools network panel and reloading."); + t10 = space(); + p2 = element("p"); + t11 = text("The "); + a1 = element("a"); + t12 = text("Sverdle"); + t13 = text(" page illustrates SvelteKit's data loading and form handling. Try\n using it with JavaScript disabled!"); + this.h(); + }, + l(nodes) { + const head_nodes = head_selector("svelte-1ds1qyu", document.head); + meta = claim_element(head_nodes, "META", { name: true, content: true }); + head_nodes.forEach(detach); + t0 = claim_space(nodes); + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + h1 = claim_element(div_nodes, "H1", {}); + var h1_nodes = children(h1); + t1 = claim_text(h1_nodes, "About this app"); + h1_nodes.forEach(detach); + t2 = claim_space(div_nodes); + p0 = claim_element(div_nodes, "P", {}); + var p0_nodes = children(p0); + t3 = claim_text(p0_nodes, "This is a "); + a0 = claim_element(p0_nodes, "A", { href: true }); + var a0_nodes = children(a0); + t4 = claim_text(a0_nodes, "SvelteKit"); + a0_nodes.forEach(detach); + t5 = claim_text(p0_nodes, " app. You can make your own by typing the\n following into your command line and following the prompts:"); + p0_nodes.forEach(detach); + t6 = claim_space(div_nodes); + pre = claim_element(div_nodes, "PRE", {}); + var pre_nodes = children(pre); + t7 = claim_text(pre_nodes, "npm create svelte@latest"); + pre_nodes.forEach(detach); + t8 = claim_space(div_nodes); + p1 = claim_element(div_nodes, "P", {}); + var p1_nodes = children(p1); + t9 = claim_text(p1_nodes, "The page you're looking at is purely static HTML, with no client-side interactivity needed.\n Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening\n the devtools network panel and reloading."); + p1_nodes.forEach(detach); + t10 = claim_space(div_nodes); + p2 = claim_element(div_nodes, "P", {}); + var p2_nodes = children(p2); + t11 = claim_text(p2_nodes, "The "); + a1 = claim_element(p2_nodes, "A", { href: true }); + var a1_nodes = children(a1); + t12 = claim_text(a1_nodes, "Sverdle"); + a1_nodes.forEach(detach); + t13 = claim_text(p2_nodes, " page illustrates SvelteKit's data loading and form handling. Try\n using it with JavaScript disabled!"); + p2_nodes.forEach(detach); + div_nodes.forEach(detach); + this.h(); + }, + h() { + document.title = "About"; + attr(meta, "name", "description"); + attr(meta, "content", "About this app"); + attr(a0, "href", "https://kit.svelte.dev"); + attr(a1, "href", "/sverdle"); + attr(div, "class", "text-column"); + }, + m(target, anchor) { + append_hydration(document.head, meta); + insert_hydration(target, t0, anchor); + insert_hydration(target, div, anchor); + append_hydration(div, h1); + append_hydration(h1, t1); + append_hydration(div, t2); + append_hydration(div, p0); + append_hydration(p0, t3); + append_hydration(p0, a0); + append_hydration(a0, t4); + append_hydration(p0, t5); + append_hydration(div, t6); + append_hydration(div, pre); + append_hydration(pre, t7); + append_hydration(div, t8); + append_hydration(div, p1); + append_hydration(p1, t9); + append_hydration(div, t10); + append_hydration(div, p2); + append_hydration(p2, t11); + append_hydration(p2, a1); + append_hydration(a1, t12); + append_hydration(p2, t13); + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + detach(meta); + if (detaching) + detach(t0); + if (detaching) + detach(div); + } + }; +} +class Page extends SvelteComponent { + constructor(options) { + super(); + init(this, options, null, create_fragment, safe_not_equal, {}); + } +} +export { + Page as default +}; diff --git a/examples/electron-app/src/_app/immutable/components/pages/sverdle/_page.svelte-aa322e66.js b/examples/electron-app/src/_app/immutable/components/pages/sverdle/_page.svelte-aa322e66.js new file mode 100644 index 0000000..3869dca --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/pages/sverdle/_page.svelte-aa322e66.js @@ -0,0 +1,1416 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, k as element, a as space, q as text, e as empty, Q as head_selector, l as claim_element, h as detach, c as claim_space, m as children, r as claim_text, n as attr, R as toggle_class, G as append_hydration, b as insert_hydration, O as listen, T as action_destroyer, C as noop, U as destroy_each, P as run_all, H as component_subscribe, V as globals, p as set_style, W as is_function, u as set_data, X as prevent_default, Y as null_to_empty } from "../../../chunks/index-d985765e.js"; +import { p as parse } from "../../../chunks/parse-a9b5aeea.js"; +import { l as client } from "../../../chunks/singletons-0c6ee057.js"; +import { r as readable } from "../../../chunks/index-bb582736.js"; +const t = (t2, b2 = {}) => { + w(b2); + let { colors: k2 = ["#FFC700", "#FF0000", "#2E3191", "#41BBC7"], duration: W = 3500, force: S = 0.5, particleCount: G = 150, particleShape: X = "mix", particleSize: _ = 12, destroyAfterDone: C = true, stageHeight: z = 800, stageWidth: E = 1600 } = b2; + !function(t3) { + const e2 = f("style"); + e2.dataset.neoconfetti = "", e2.textContent = '@keyframes fk9XWG_y-axis{to{transform:translate3d(0,var(--stage-height),0)}}@keyframes fk9XWG_x-axis{to{transform:translate3d(var(--x-landing-point),0,0)}}@keyframes fk9XWG_rotation{50%{transform:rotate3d(var(--half-rotation),180deg)}to{transform:rotate3d(var(--rotation),360deg)}}.fk9XWG_container{width:0;height:0;z-index:1200;position:relative;overflow:visible}.fk9XWG_particle{animation:x-axis var(--duration-chaos)forwards cubic-bezier(var(--x1),var(--x2),var(--x3),var(--x4));animation-name:fk9XWG_x-axis}.fk9XWG_particle>div{animation:y-axis var(--duration-chaos)forwards cubic-bezier(var(--y1),var(--y2),var(--y3),var(--y4));width:var(--width);height:var(--height);animation-name:fk9XWG_y-axis;position:absolute;top:0;left:0}.fk9XWG_particle>div:before{height:100%;width:100%;content:"";background-color:var(--bgcolor);animation:rotation var(--rotation-duration)infinite linear;border-radius:var(--border-radius);animation-name:fk9XWG_rotation;display:block}', h(document.head, e2); + }(), t2.classList.add("fk9XWG_container"), t2.style.setProperty("--stage-height", z + "px"); + let P, A = p(G, k2), H = e(t2, A); + function M(t3, e2) { + const f2 = l(c() * (x - 1)), h2 = "rectangles" !== X && ("circles" === X || v(f2)), p2 = (e3, r2) => t3.style.setProperty(e3, r2 + ""); + p2("--x-landing-point", u(s(m(e2, 90) - 180), 0, 180, -E / 2, E / 2) + "px"), p2("--duration-chaos", W - l(1e3 * c()) + "ms"); + const b3 = c() < a ? g(c() * i, 2) : 0; + p2("--x1", b3), p2("--x2", -1 * b3), p2("--x3", b3), p2("--x4", g(s(u(s(m(e2, 90) - 180), 0, 180, -1, 1)), 4)), p2("--y1", g(c() * n, 4)), p2("--y2", g(c() * S * (y() ? 1 : -1), 4)), p2("--y3", n), p2("--y4", g(d(u(s(e2 - 180), 0, 180, S, -S), 0), 4)), p2("--width", (h2 ? _ : l(4 * c()) + _ / 2) + "px"), p2("--height", (h2 ? _ : l(2 * c()) + _) + "px"); + const k3 = f2.toString(2).padStart(3, "0").split(""); + p2("--half-rotation", k3.map((t4) => +t4 / 2 + "")), p2("--rotation", k3), p2("--rotation-duration", g(c() * (o - r) + r) + "ms"), p2("--border-radius", h2 ? "50%" : 0); + } + for (const [t3, e2] of Object.entries(H)) + M(e2, A[+t3].degree); + return Promise.resolve().then(() => P = setTimeout(() => C && (t2.innerHTML = ""), W)), { update(r2) { + w(r2); + const o2 = r2.particleCount ?? G, a2 = r2.colors ?? k2, i2 = r2.stageHeight ?? z; + if (A = p(o2, a2), o2 === G && JSON.stringify(k2) !== JSON.stringify(a2)) + for (const [t3, { color: e2 }] of Object.entries(A)) + H[+t3].style.setProperty("--bgcolor", e2); + o2 !== G && (t2.innerHTML = "", H = e(t2, A)), C && !r2.destroyAfterDone && clearTimeout(P), t2.style.setProperty("--stage-height", i2 + "px"), k2 = a2, W = r2.duration ?? W, S = r2.force ?? S, G = o2, X = r2.particleShape ?? X, _ = r2.particleSize ?? _, C = r2.destroyAfterDone ?? C, z = i2, E = r2.stageWidth ?? E; + }, destroy() { + clearTimeout(P); + } }; +}; +function e(t2, e2 = []) { + const r2 = []; + for (const { color: o2 } of e2) { + const e3 = f("div"); + e3.className = "fk9XWG_particle", e3.style.setProperty("--bgcolor", o2); + const a2 = f("div"); + h(e3, a2), h(t2, e3), r2.push(e3); + } + return r2; +} +const r = 200, o = 800, a = 0.1, i = 0.3, n = 0.5, s = Math.abs, c = Math.random, l = Math.round, d = Math.max, f = (t2) => document.createElement(t2), h = (t2, e2) => t2.appendChild(e2), p = (t2, e2) => Array.from({ length: t2 }, (r2, o2) => ({ color: e2[o2 % e2.length], degree: 360 * o2 / t2 })), g = (t2, e2 = 2) => l((t2 + Number.EPSILON) * 10 ** e2) / 10 ** e2, u = (t2, e2, r2, o2, a2) => (t2 - e2) * (a2 - o2) / (r2 - e2) + o2, m = (t2, e2) => t2 + e2 > 360 ? t2 + e2 - 360 : t2 + e2, y = () => c() > 0.5, x = 6, v = (t2) => 1 !== t2 && y(), b = (t2) => void 0 === t2, k = (t2, e2) => { + if (!b(t2) && Number.isSafeInteger(t2) && t2 < 0) + throw new Error(e2 + " must be a positive integer"); +}, w = ({ particleCount: t2, duration: e2, colors: r2, particleSize: o2, force: a2, stageHeight: i2, stageWidth: n2, particleShape: s2 }) => { + if (k(t2, "particleCount"), k(e2, "duration"), k(o2, "particleSize"), k(a2, "force"), k(i2, "stageHeight"), k(n2, "stageWidth"), !b(s2) && !/^(mix|circles|rectangles)$/i.test(s2)) + throw new Error('particlesShape should be either "mix" or "circles" or "rectangle"'); + if (!b(r2) && !Array.isArray(r2)) + throw new Error("colors must be an array of strings"); + if (a2 > 1) + throw new Error("force must be within 0 and 1"); +}; +client.disable_scroll_handling; +client.goto; +client.invalidate; +const invalidateAll = client.invalidateAll; +client.preload_data; +client.preload_code; +client.before_navigate; +client.after_navigate; +const applyAction = client.apply_action; +function deserialize(result) { + const parsed = JSON.parse(result); + if (parsed.data) { + parsed.data = parse(parsed.data); + } + return parsed; +} +function enhance(form, submit = () => { +}) { + const fallback_callback = async ({ action, result, reset }) => { + if (result.type === "success") { + if (reset !== false) { + HTMLFormElement.prototype.reset.call(form); + } + await invalidateAll(); + } + if (location.origin + location.pathname === action.origin + action.pathname || result.type === "redirect" || result.type === "error") { + applyAction(result); + } + }; + async function handle_submit(event) { + var _a, _b, _c; + event.preventDefault(); + const action = new URL( + // We can't do submitter.formAction directly because that property is always set + // We do cloneNode for avoid DOM clobbering - https://github.com/sveltejs/kit/issues/7593 + ((_a = event.submitter) == null ? void 0 : _a.hasAttribute("formaction")) ? ( + /** @type {HTMLButtonElement | HTMLInputElement} */ + event.submitter.formAction + ) : ( + /** @type {HTMLFormElement} */ + HTMLFormElement.prototype.cloneNode.call(form).action + ) + ); + const data = new FormData(form); + const submitter_name = (_b = event.submitter) == null ? void 0 : _b.getAttribute("name"); + if (submitter_name) { + data.append(submitter_name, ((_c = event.submitter) == null ? void 0 : _c.getAttribute("value")) ?? ""); + } + const controller = new AbortController(); + let cancelled = false; + const cancel = () => cancelled = true; + const callback = await submit({ + action, + cancel, + controller, + data, + form + }) ?? fallback_callback; + if (cancelled) + return; + let result; + try { + const response = await fetch(action, { + method: "POST", + headers: { + accept: "application/json", + "x-sveltekit-action": "true" + }, + cache: "no-store", + body: data, + signal: controller.signal + }); + result = deserialize(await response.text()); + if (result.type === "error") + result.status = response.status; + } catch (error) { + if ( + /** @type {any} */ + (error == null ? void 0 : error.name) === "AbortError" + ) + return; + result = { type: "error", error }; + } + callback({ + action, + data, + form, + update: (opts) => fallback_callback({ action, result, reset: opts == null ? void 0 : opts.reset }), + // @ts-expect-error generic constraints stuff we don't care about + result + }); + } + HTMLFormElement.prototype.addEventListener.call(form, "submit", handle_submit); + return { + destroy() { + HTMLFormElement.prototype.removeEventListener.call(form, "submit", handle_submit); + } + }; +} +const reduced_motion_query = "(prefers-reduced-motion: reduce)"; +const get_initial_motion_preference = () => { + return window.matchMedia(reduced_motion_query).matches; +}; +const reduced_motion = readable(get_initial_motion_preference(), (set) => { + { + const set_reduced_motion = (event) => { + set(event.matches); + }; + const media_query_list = window.matchMedia(reduced_motion_query); + media_query_list.addEventListener("change", set_reduced_motion); + return () => { + media_query_list.removeEventListener("change", set_reduced_motion); + }; + } +}); +const _page_svelte_svelte_type_style_lang = ""; +const { document: document_1, window: window_1 } = globals; +function get_each_context(ctx, list, i2) { + const child_ctx = ctx.slice(); + child_ctx[9] = list[i2]; + return child_ctx; +} +function get_each_context_1(ctx, list, i2) { + const child_ctx = ctx.slice(); + child_ctx[12] = list[i2]; + return child_ctx; +} +function get_each_context_2(ctx, list, i2) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i2]; + child_ctx[9] = i2; + const constants_0 = ( + /*row*/ + child_ctx[9] === /*i*/ + child_ctx[3] + ); + child_ctx[16] = constants_0; + return child_ctx; +} +function get_each_context_3(ctx, list, i2) { + var _a, _b; + const child_ctx = ctx.slice(); + child_ctx[15] = list[i2]; + child_ctx[25] = i2; + const constants_0 = ( + /*data*/ + (_a = child_ctx[0].answers[ + /*row*/ + child_ctx[9] + ]) == null ? void 0 : _a[ + /*column*/ + child_ctx[25] + ] + ); + child_ctx[18] = constants_0; + const constants_1 = ( + /*data*/ + ((_b = child_ctx[0].guesses[ + /*row*/ + child_ctx[9] + ]) == null ? void 0 : _b[ + /*column*/ + child_ctx[25] + ]) ?? "" + ); + child_ctx[19] = constants_1; + const constants_2 = ( + /*current*/ + child_ctx[16] && /*column*/ + child_ctx[25] === /*data*/ + child_ctx[0].guesses[ + /*row*/ + child_ctx[9] + ].length + ); + child_ctx[20] = constants_2; + const constants_3 = ( + /*answer*/ + child_ctx[18] === "x" + ); + child_ctx[21] = constants_3; + const constants_4 = ( + /*answer*/ + child_ctx[18] === "c" + ); + child_ctx[22] = constants_4; + const constants_5 = ( + /*answer*/ + child_ctx[18] === "_" + ); + child_ctx[23] = constants_5; + return child_ctx; +} +function create_else_block_1(ctx) { + let t2; + return { + c() { + t2 = text("empty"); + }, + l(nodes) { + t2 = claim_text(nodes, "empty"); + }, + m(target, anchor) { + insert_hydration(target, t2, anchor); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_if_block_5(ctx) { + let t2; + return { + c() { + t2 = text("(absent)"); + }, + l(nodes) { + t2 = claim_text(nodes, "(absent)"); + }, + m(target, anchor) { + insert_hydration(target, t2, anchor); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_if_block_4(ctx) { + let t2; + return { + c() { + t2 = text("(present)"); + }, + l(nodes) { + t2 = claim_text(nodes, "(present)"); + }, + m(target, anchor) { + insert_hydration(target, t2, anchor); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_if_block_3(ctx) { + let t2; + return { + c() { + t2 = text("(correct)"); + }, + l(nodes) { + t2 = claim_text(nodes, "(correct)"); + }, + m(target, anchor) { + insert_hydration(target, t2, anchor); + }, + d(detaching) { + if (detaching) + detach(t2); + } + }; +} +function create_each_block_3(ctx) { + let div; + let t0_value = ( + /*value*/ + ctx[19] + "" + ); + let t0; + let t1; + let span; + let t2; + let input; + let input_disabled_value; + let input_value_value; + function select_block_type(ctx2, dirty) { + if ( + /*exact*/ + ctx2[21] + ) + return create_if_block_3; + if ( + /*close*/ + ctx2[22] + ) + return create_if_block_4; + if ( + /*missing*/ + ctx2[23] + ) + return create_if_block_5; + return create_else_block_1; + } + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); + return { + c() { + div = element("div"); + t0 = text(t0_value); + t1 = space(); + span = element("span"); + if_block.c(); + t2 = space(); + input = element("input"); + this.h(); + }, + l(nodes) { + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + t0 = claim_text(div_nodes, t0_value); + t1 = claim_space(div_nodes); + span = claim_element(div_nodes, "SPAN", { class: true }); + var span_nodes = children(span); + if_block.l(span_nodes); + span_nodes.forEach(detach); + t2 = claim_space(div_nodes); + input = claim_element(div_nodes, "INPUT", { name: true, type: true }); + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(span, "class", "visually-hidden"); + attr(input, "name", "guess"); + input.disabled = input_disabled_value = !/*current*/ + ctx[16]; + attr(input, "type", "hidden"); + input.value = input_value_value = /*value*/ + ctx[19]; + attr(div, "class", "letter svelte-1pg2j5l"); + toggle_class( + div, + "exact", + /*exact*/ + ctx[21] + ); + toggle_class( + div, + "close", + /*close*/ + ctx[22] + ); + toggle_class( + div, + "missing", + /*missing*/ + ctx[23] + ); + toggle_class( + div, + "selected", + /*selected*/ + ctx[20] + ); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + append_hydration(div, t0); + append_hydration(div, t1); + append_hydration(div, span); + if_block.m(span, null); + append_hydration(div, t2); + append_hydration(div, input); + }, + p(ctx2, dirty) { + if (dirty & /*data*/ + 1 && t0_value !== (t0_value = /*value*/ + ctx2[19] + "")) + set_data(t0, t0_value); + if (current_block_type !== (current_block_type = select_block_type(ctx2))) { + if_block.d(1); + if_block = current_block_type(ctx2); + if (if_block) { + if_block.c(); + if_block.m(span, null); + } + } + if (dirty & /*i*/ + 8 && input_disabled_value !== (input_disabled_value = !/*current*/ + ctx2[16])) { + input.disabled = input_disabled_value; + } + if (dirty & /*data*/ + 1 && input_value_value !== (input_value_value = /*value*/ + ctx2[19])) { + input.value = input_value_value; + } + if (dirty & /*data*/ + 1) { + toggle_class( + div, + "exact", + /*exact*/ + ctx2[21] + ); + } + if (dirty & /*data*/ + 1) { + toggle_class( + div, + "close", + /*close*/ + ctx2[22] + ); + } + if (dirty & /*data*/ + 1) { + toggle_class( + div, + "missing", + /*missing*/ + ctx2[23] + ); + } + if (dirty & /*i, data*/ + 9) { + toggle_class( + div, + "selected", + /*selected*/ + ctx2[20] + ); + } + }, + d(detaching) { + if (detaching) + detach(div); + if_block.d(); + } + }; +} +function create_each_block_2(ctx) { + let h2; + let t0; + let t1_value = ( + /*row*/ + ctx[9] + 1 + "" + ); + let t1; + let t2; + let div; + let t3; + let each_value_3 = Array(5); + let each_blocks = []; + for (let i2 = 0; i2 < each_value_3.length; i2 += 1) { + each_blocks[i2] = create_each_block_3(get_each_context_3(ctx, each_value_3, i2)); + } + return { + c() { + h2 = element("h2"); + t0 = text("Row "); + t1 = text(t1_value); + t2 = space(); + div = element("div"); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].c(); + } + t3 = space(); + this.h(); + }, + l(nodes) { + h2 = claim_element(nodes, "H2", { class: true }); + var h2_nodes = children(h2); + t0 = claim_text(h2_nodes, "Row "); + t1 = claim_text(h2_nodes, t1_value); + h2_nodes.forEach(detach); + t2 = claim_space(nodes); + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].l(div_nodes); + } + t3 = claim_space(div_nodes); + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(h2, "class", "visually-hidden"); + attr(div, "class", "row svelte-1pg2j5l"); + toggle_class( + div, + "current", + /*current*/ + ctx[16] + ); + }, + m(target, anchor) { + insert_hydration(target, h2, anchor); + append_hydration(h2, t0); + append_hydration(h2, t1); + insert_hydration(target, t2, anchor); + insert_hydration(target, div, anchor); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].m(div, null); + } + append_hydration(div, t3); + }, + p(ctx2, dirty) { + if (dirty & /*data, i*/ + 9) { + each_value_3 = Array(5); + let i2; + for (i2 = 0; i2 < each_value_3.length; i2 += 1) { + const child_ctx = get_each_context_3(ctx2, each_value_3, i2); + if (each_blocks[i2]) { + each_blocks[i2].p(child_ctx, dirty); + } else { + each_blocks[i2] = create_each_block_3(child_ctx); + each_blocks[i2].c(); + each_blocks[i2].m(div, t3); + } + } + for (; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].d(1); + } + each_blocks.length = each_value_3.length; + } + if (dirty & /*i*/ + 8) { + toggle_class( + div, + "current", + /*current*/ + ctx2[16] + ); + } + }, + d(detaching) { + if (detaching) + detach(h2); + if (detaching) + detach(t2); + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + } + }; +} +function create_else_block(ctx) { + let div; + let button0; + let t0; + let button0_disabled_value; + let t1; + let button1; + let t2; + let t3; + let mounted; + let dispose; + let each_value = ["qwertyuiop", "asdfghjkl", "zxcvbnm"]; + let each_blocks = []; + for (let i2 = 0; i2 < 3; i2 += 1) { + each_blocks[i2] = create_each_block(get_each_context(ctx, each_value, i2)); + } + return { + c() { + div = element("div"); + button0 = element("button"); + t0 = text("enter"); + t1 = space(); + button1 = element("button"); + t2 = text("back"); + t3 = space(); + for (let i2 = 0; i2 < 3; i2 += 1) { + each_blocks[i2].c(); + } + this.h(); + }, + l(nodes) { + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + button0 = claim_element(div_nodes, "BUTTON", { "data-key": true, class: true }); + var button0_nodes = children(button0); + t0 = claim_text(button0_nodes, "enter"); + button0_nodes.forEach(detach); + t1 = claim_space(div_nodes); + button1 = claim_element(div_nodes, "BUTTON", { + "data-key": true, + formaction: true, + name: true, + class: true + }); + var button1_nodes = children(button1); + t2 = claim_text(button1_nodes, "back"); + button1_nodes.forEach(detach); + t3 = claim_space(div_nodes); + for (let i2 = 0; i2 < 3; i2 += 1) { + each_blocks[i2].l(div_nodes); + } + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(button0, "data-key", "enter"); + button0.disabled = button0_disabled_value = !/*submittable*/ + ctx[6]; + attr(button0, "class", "svelte-1pg2j5l"); + toggle_class( + button0, + "selected", + /*submittable*/ + ctx[6] + ); + attr(button1, "data-key", "backspace"); + attr(button1, "formaction", "?/update"); + attr(button1, "name", "key"); + button1.value = "backspace"; + attr(button1, "class", "svelte-1pg2j5l"); + attr(div, "class", "keyboard svelte-1pg2j5l"); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + append_hydration(div, button0); + append_hydration(button0, t0); + append_hydration(div, t1); + append_hydration(div, button1); + append_hydration(button1, t2); + append_hydration(div, t3); + for (let i2 = 0; i2 < 3; i2 += 1) { + each_blocks[i2].m(div, null); + } + if (!mounted) { + dispose = listen(button1, "click", prevent_default( + /*update*/ + ctx[8] + )); + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty & /*submittable*/ + 64 && button0_disabled_value !== (button0_disabled_value = !/*submittable*/ + ctx2[6])) { + button0.disabled = button0_disabled_value; + } + if (dirty & /*submittable*/ + 64) { + toggle_class( + button0, + "selected", + /*submittable*/ + ctx2[6] + ); + } + if (dirty & /*classnames, data, i, description, update*/ + 301) { + each_value = ["qwertyuiop", "asdfghjkl", "zxcvbnm"]; + let i2; + for (i2 = 0; i2 < 3; i2 += 1) { + const child_ctx = get_each_context(ctx2, each_value, i2); + if (each_blocks[i2]) { + each_blocks[i2].p(child_ctx, dirty); + } else { + each_blocks[i2] = create_each_block(child_ctx); + each_blocks[i2].c(); + each_blocks[i2].m(div, null); + } + } + for (; i2 < 3; i2 += 1) { + each_blocks[i2].d(1); + } + } + }, + d(detaching) { + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + mounted = false; + dispose(); + } + }; +} +function create_if_block_1(ctx) { + let t0; + let button; + let t1_value = ( + /*won*/ + ctx[4] ? "you won :)" : `game over :(` + ); + let t1; + let t2; + let if_block = !/*won*/ + ctx[4] && /*data*/ + ctx[0].answer && create_if_block_2(ctx); + return { + c() { + if (if_block) + if_block.c(); + t0 = space(); + button = element("button"); + t1 = text(t1_value); + t2 = text(" play again?"); + this.h(); + }, + l(nodes) { + if (if_block) + if_block.l(nodes); + t0 = claim_space(nodes); + button = claim_element(nodes, "BUTTON", { + "data-key": true, + class: true, + formaction: true + }); + var button_nodes = children(button); + t1 = claim_text(button_nodes, t1_value); + t2 = claim_text(button_nodes, " play again?"); + button_nodes.forEach(detach); + this.h(); + }, + h() { + attr(button, "data-key", "enter"); + attr(button, "class", "restart selected svelte-1pg2j5l"); + attr(button, "formaction", "?/restart"); + }, + m(target, anchor) { + if (if_block) + if_block.m(target, anchor); + insert_hydration(target, t0, anchor); + insert_hydration(target, button, anchor); + append_hydration(button, t1); + append_hydration(button, t2); + }, + p(ctx2, dirty) { + if (!/*won*/ + ctx2[4] && /*data*/ + ctx2[0].answer) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block_2(ctx2); + if_block.c(); + if_block.m(t0.parentNode, t0); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + if (dirty & /*won*/ + 16 && t1_value !== (t1_value = /*won*/ + ctx2[4] ? "you won :)" : `game over :(`)) + set_data(t1, t1_value); + }, + d(detaching) { + if (if_block) + if_block.d(detaching); + if (detaching) + detach(t0); + if (detaching) + detach(button); + } + }; +} +function create_each_block_1(ctx) { + let button; + let t2; + let button_class_value; + let button_disabled_value; + let button_aria_label_value; + let mounted; + let dispose; + return { + c() { + button = element("button"); + t2 = text( + /*letter*/ + ctx[12] + ); + this.h(); + }, + l(nodes) { + button = claim_element(nodes, "BUTTON", { + "data-key": true, + class: true, + formaction: true, + name: true, + "aria-label": true + }); + var button_nodes = children(button); + t2 = claim_text( + button_nodes, + /*letter*/ + ctx[12] + ); + button_nodes.forEach(detach); + this.h(); + }, + h() { + attr( + button, + "data-key", + /*letter*/ + ctx[12] + ); + attr(button, "class", button_class_value = null_to_empty( + /*classnames*/ + ctx[2][ + /*letter*/ + ctx[12] + ] + ) + " svelte-1pg2j5l"); + button.disabled = button_disabled_value = /*data*/ + ctx[0].guesses[ + /*i*/ + ctx[3] + ].length === 5; + attr(button, "formaction", "?/update"); + attr(button, "name", "key"); + button.value = /*letter*/ + ctx[12]; + attr(button, "aria-label", button_aria_label_value = /*letter*/ + ctx[12] + " " + /*description*/ + (ctx[5][ + /*letter*/ + ctx[12] + ] || "")); + }, + m(target, anchor) { + insert_hydration(target, button, anchor); + append_hydration(button, t2); + if (!mounted) { + dispose = listen(button, "click", prevent_default( + /*update*/ + ctx[8] + )); + mounted = true; + } + }, + p(ctx2, dirty) { + if (dirty & /*classnames*/ + 4 && button_class_value !== (button_class_value = null_to_empty( + /*classnames*/ + ctx2[2][ + /*letter*/ + ctx2[12] + ] + ) + " svelte-1pg2j5l")) { + attr(button, "class", button_class_value); + } + if (dirty & /*data, i*/ + 9 && button_disabled_value !== (button_disabled_value = /*data*/ + ctx2[0].guesses[ + /*i*/ + ctx2[3] + ].length === 5)) { + button.disabled = button_disabled_value; + } + if (dirty & /*description*/ + 32 && button_aria_label_value !== (button_aria_label_value = /*letter*/ + ctx2[12] + " " + /*description*/ + (ctx2[5][ + /*letter*/ + ctx2[12] + ] || ""))) { + attr(button, "aria-label", button_aria_label_value); + } + }, + d(detaching) { + if (detaching) + detach(button); + mounted = false; + dispose(); + } + }; +} +function create_each_block(ctx) { + let div; + let t2; + let each_value_1 = ( + /*row*/ + ctx[9] + ); + let each_blocks = []; + for (let i2 = 0; i2 < each_value_1.length; i2 += 1) { + each_blocks[i2] = create_each_block_1(get_each_context_1(ctx, each_value_1, i2)); + } + return { + c() { + div = element("div"); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].c(); + } + t2 = space(); + this.h(); + }, + l(nodes) { + div = claim_element(nodes, "DIV", { class: true }); + var div_nodes = children(div); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].l(div_nodes); + } + t2 = claim_space(div_nodes); + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(div, "class", "row svelte-1pg2j5l"); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].m(div, null); + } + append_hydration(div, t2); + }, + p(ctx2, dirty) { + if (dirty & /*classnames, data, i, description, update*/ + 301) { + each_value_1 = /*row*/ + ctx2[9]; + let i2; + for (i2 = 0; i2 < each_value_1.length; i2 += 1) { + const child_ctx = get_each_context_1(ctx2, each_value_1, i2); + if (each_blocks[i2]) { + each_blocks[i2].p(child_ctx, dirty); + } else { + each_blocks[i2] = create_each_block_1(child_ctx); + each_blocks[i2].c(); + each_blocks[i2].m(div, t2); + } + } + for (; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].d(1); + } + each_blocks.length = each_value_1.length; + } + }, + d(detaching) { + if (detaching) + detach(div); + destroy_each(each_blocks, detaching); + } + }; +} +function create_if_block_2(ctx) { + let p2; + let t0; + let t1_value = ( + /*data*/ + ctx[0].answer + "" + ); + let t1; + let t2; + return { + c() { + p2 = element("p"); + t0 = text('the answer was "'); + t1 = text(t1_value); + t2 = text('"'); + }, + l(nodes) { + p2 = claim_element(nodes, "P", {}); + var p_nodes = children(p2); + t0 = claim_text(p_nodes, 'the answer was "'); + t1 = claim_text(p_nodes, t1_value); + t2 = claim_text(p_nodes, '"'); + p_nodes.forEach(detach); + }, + m(target, anchor) { + insert_hydration(target, p2, anchor); + append_hydration(p2, t0); + append_hydration(p2, t1); + append_hydration(p2, t2); + }, + p(ctx2, dirty) { + if (dirty & /*data*/ + 1 && t1_value !== (t1_value = /*data*/ + ctx2[0].answer + "")) + set_data(t1, t1_value); + }, + d(detaching) { + if (detaching) + detach(p2); + } + }; +} +function create_if_block(ctx) { + let div; + let confetti_action; + let mounted; + let dispose; + return { + c() { + div = element("div"); + this.h(); + }, + l(nodes) { + div = claim_element(nodes, "DIV", { style: true }); + children(div).forEach(detach); + this.h(); + }, + h() { + set_style(div, "position", "absolute"); + set_style(div, "left", "50%"); + set_style(div, "top", "30%"); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + if (!mounted) { + dispose = action_destroyer(confetti_action = t.call(null, div, { + particleCount: ( + /*$reduced_motion*/ + ctx[7] ? 0 : void 0 + ), + force: 0.7, + stageWidth: window.innerWidth, + stageHeight: window.innerHeight, + colors: ["#ff3e00", "#40b3ff", "#676778"] + })); + mounted = true; + } + }, + p(ctx2, dirty) { + if (confetti_action && is_function(confetti_action.update) && dirty & /*$reduced_motion*/ + 128) + confetti_action.update.call(null, { + particleCount: ( + /*$reduced_motion*/ + ctx2[7] ? 0 : void 0 + ), + force: 0.7, + stageWidth: window.innerWidth, + stageHeight: window.innerHeight, + colors: ["#ff3e00", "#40b3ff", "#676778"] + }); + }, + d(detaching) { + if (detaching) + detach(div); + mounted = false; + dispose(); + } + }; +} +function create_fragment(ctx) { + let meta; + let t0; + let h1; + let t1; + let t2; + let form_1; + let a2; + let t3; + let t4; + let div0; + let t5; + let div1; + let t6; + let if_block1_anchor; + let mounted; + let dispose; + let each_value_2 = Array(6); + let each_blocks = []; + for (let i2 = 0; i2 < each_value_2.length; i2 += 1) { + each_blocks[i2] = create_each_block_2(get_each_context_2(ctx, each_value_2, i2)); + } + function select_block_type_1(ctx2, dirty) { + if ( + /*won*/ + ctx2[4] || /*data*/ + ctx2[0].answers.length >= 6 + ) + return create_if_block_1; + return create_else_block; + } + let current_block_type = select_block_type_1(ctx); + let if_block0 = current_block_type(ctx); + let if_block1 = ( + /*won*/ + ctx[4] && create_if_block(ctx) + ); + return { + c() { + meta = element("meta"); + t0 = space(); + h1 = element("h1"); + t1 = text("Sverdle"); + t2 = space(); + form_1 = element("form"); + a2 = element("a"); + t3 = text("How to play"); + t4 = space(); + div0 = element("div"); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].c(); + } + t5 = space(); + div1 = element("div"); + if_block0.c(); + t6 = space(); + if (if_block1) + if_block1.c(); + if_block1_anchor = empty(); + this.h(); + }, + l(nodes) { + const head_nodes = head_selector("svelte-18lvto8", document_1.head); + meta = claim_element(head_nodes, "META", { name: true, content: true }); + head_nodes.forEach(detach); + t0 = claim_space(nodes); + h1 = claim_element(nodes, "H1", { class: true }); + var h1_nodes = children(h1); + t1 = claim_text(h1_nodes, "Sverdle"); + h1_nodes.forEach(detach); + t2 = claim_space(nodes); + form_1 = claim_element(nodes, "FORM", { method: true, action: true, class: true }); + var form_1_nodes = children(form_1); + a2 = claim_element(form_1_nodes, "A", { class: true, href: true }); + var a_nodes = children(a2); + t3 = claim_text(a_nodes, "How to play"); + a_nodes.forEach(detach); + t4 = claim_space(form_1_nodes); + div0 = claim_element(form_1_nodes, "DIV", { class: true }); + var div0_nodes = children(div0); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].l(div0_nodes); + } + div0_nodes.forEach(detach); + t5 = claim_space(form_1_nodes); + div1 = claim_element(form_1_nodes, "DIV", { class: true }); + var div1_nodes = children(div1); + if_block0.l(div1_nodes); + div1_nodes.forEach(detach); + form_1_nodes.forEach(detach); + t6 = claim_space(nodes); + if (if_block1) + if_block1.l(nodes); + if_block1_anchor = empty(); + this.h(); + }, + h() { + var _a; + document_1.title = "Sverdle"; + attr(meta, "name", "description"); + attr(meta, "content", "A Wordle clone written in SvelteKit"); + attr(h1, "class", "visually-hidden"); + attr(a2, "class", "how-to-play svelte-1pg2j5l"); + attr(a2, "href", "/sverdle/how-to-play"); + attr(div0, "class", "grid svelte-1pg2j5l"); + toggle_class(div0, "playing", !/*won*/ + ctx[4]); + toggle_class( + div0, + "bad-guess", + /*form*/ + (_a = ctx[1]) == null ? void 0 : _a.badGuess + ); + attr(div1, "class", "controls svelte-1pg2j5l"); + attr(form_1, "method", "POST"); + attr(form_1, "action", "?/enter"); + attr(form_1, "class", "svelte-1pg2j5l"); + }, + m(target, anchor) { + append_hydration(document_1.head, meta); + insert_hydration(target, t0, anchor); + insert_hydration(target, h1, anchor); + append_hydration(h1, t1); + insert_hydration(target, t2, anchor); + insert_hydration(target, form_1, anchor); + append_hydration(form_1, a2); + append_hydration(a2, t3); + append_hydration(form_1, t4); + append_hydration(form_1, div0); + for (let i2 = 0; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].m(div0, null); + } + append_hydration(form_1, t5); + append_hydration(form_1, div1); + if_block0.m(div1, null); + insert_hydration(target, t6, anchor); + if (if_block1) + if_block1.m(target, anchor); + insert_hydration(target, if_block1_anchor, anchor); + if (!mounted) { + dispose = [ + listen(window_1, "keydown", keydown), + action_destroyer(enhance.call(null, form_1, enhance_function)) + ]; + mounted = true; + } + }, + p(ctx2, [dirty]) { + var _a; + if (dirty & /*i, Array, data*/ + 9) { + each_value_2 = Array(6); + let i2; + for (i2 = 0; i2 < each_value_2.length; i2 += 1) { + const child_ctx = get_each_context_2(ctx2, each_value_2, i2); + if (each_blocks[i2]) { + each_blocks[i2].p(child_ctx, dirty); + } else { + each_blocks[i2] = create_each_block_2(child_ctx); + each_blocks[i2].c(); + each_blocks[i2].m(div0, null); + } + } + for (; i2 < each_blocks.length; i2 += 1) { + each_blocks[i2].d(1); + } + each_blocks.length = each_value_2.length; + } + if (dirty & /*won*/ + 16) { + toggle_class(div0, "playing", !/*won*/ + ctx2[4]); + } + if (dirty & /*form*/ + 2) { + toggle_class( + div0, + "bad-guess", + /*form*/ + (_a = ctx2[1]) == null ? void 0 : _a.badGuess + ); + } + if (current_block_type === (current_block_type = select_block_type_1(ctx2)) && if_block0) { + if_block0.p(ctx2, dirty); + } else { + if_block0.d(1); + if_block0 = current_block_type(ctx2); + if (if_block0) { + if_block0.c(); + if_block0.m(div1, null); + } + } + if ( + /*won*/ + ctx2[4] + ) { + if (if_block1) { + if_block1.p(ctx2, dirty); + } else { + if_block1 = create_if_block(ctx2); + if_block1.c(); + if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + }, + i: noop, + o: noop, + d(detaching) { + detach(meta); + if (detaching) + detach(t0); + if (detaching) + detach(h1); + if (detaching) + detach(t2); + if (detaching) + detach(form_1); + destroy_each(each_blocks, detaching); + if_block0.d(); + if (detaching) + detach(t6); + if (if_block1) + if_block1.d(detaching); + if (detaching) + detach(if_block1_anchor); + mounted = false; + run_all(dispose); + } + }; +} +function keydown(event) { + var _a; + if (event.metaKey) + return; + (_a = document.querySelector(`[data-key="${event.key}" i]`)) == null ? void 0 : _a.dispatchEvent(new MouseEvent("click", { cancelable: true })); +} +const enhance_function = () => { + return ({ update }) => { + update({ reset: false }); + }; +}; +function instance($$self, $$props, $$invalidate) { + let won; + let i2; + let submittable; + let $reduced_motion; + component_subscribe($$self, reduced_motion, ($$value) => $$invalidate(7, $reduced_motion = $$value)); + let { data } = $$props; + let { form } = $$props; + let classnames; + let description; + function update(event) { + const guess = data.guesses[i2]; + const key = event.target.getAttribute("data-key"); + if (key === "backspace") { + $$invalidate(0, data.guesses[i2] = guess.slice(0, -1), data); + if (form == null ? void 0 : form.badGuess) + $$invalidate(1, form.badGuess = false, form); + } else if (guess.length < 5) { + $$invalidate(0, data.guesses[i2] += key, data); + } + } + $$self.$$set = ($$props2) => { + if ("data" in $$props2) + $$invalidate(0, data = $$props2.data); + if ("form" in $$props2) + $$invalidate(1, form = $$props2.form); + }; + $$self.$$.update = () => { + var _a; + if ($$self.$$.dirty & /*data*/ + 1) { + $$invalidate(4, won = data.answers.at(-1) === "xxxxx"); + } + if ($$self.$$.dirty & /*won, data*/ + 17) { + $$invalidate(3, i2 = won ? -1 : data.answers.length); + } + if ($$self.$$.dirty & /*data, i*/ + 9) { + $$invalidate(6, submittable = ((_a = data.guesses[i2]) == null ? void 0 : _a.length) === 5); + } + if ($$self.$$.dirty & /*data, classnames*/ + 5) { + { + $$invalidate(2, classnames = {}); + $$invalidate(5, description = {}); + data.answers.forEach((answer, i22) => { + const guess = data.guesses[i22]; + for (let i3 = 0; i3 < 5; i3 += 1) { + const letter = guess[i3]; + if (answer[i3] === "x") { + $$invalidate(2, classnames[letter] = "exact", classnames); + $$invalidate(5, description[letter] = "correct", description); + } else if (!classnames[letter]) { + $$invalidate(2, classnames[letter] = answer[i3] === "c" ? "close" : "missing", classnames); + $$invalidate(5, description[letter] = answer[i3] === "c" ? "present" : "absent", description); + } + } + }); + } + } + }; + return [ + data, + form, + classnames, + i2, + won, + description, + submittable, + $reduced_motion, + update + ]; +} +class Page extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { data: 0, form: 1 }); + } +} +export { + Page as default +}; diff --git a/examples/electron-app/src/_app/immutable/components/pages/sverdle/how-to-play/_page.svelte-fb619894.js b/examples/electron-app/src/_app/immutable/components/pages/sverdle/how-to-play/_page.svelte-fb619894.js new file mode 100644 index 0000000..fc0e6eb --- /dev/null +++ b/examples/electron-app/src/_app/immutable/components/pages/sverdle/how-to-play/_page.svelte-fb619894.js @@ -0,0 +1,374 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, k as element, a as space, q as text, Q as head_selector, l as claim_element, h as detach, c as claim_space, m as children, r as claim_text, n as attr, G as append_hydration, b as insert_hydration, C as noop } from "../../../../chunks/index-d985765e.js"; +const _page_svelte_svelte_type_style_lang = ""; +function create_fragment(ctx) { + let meta; + let t0; + let div2; + let h1; + let t1; + let t2; + let p0; + let t3; + let a; + let t4; + let t5; + let t6; + let div0; + let span0; + let t7; + let t8; + let span1; + let t9; + let t10; + let span2; + let t11; + let t12; + let span3; + let t13; + let t14; + let span4; + let t15; + let t16; + let p1; + let t17; + let span5; + let t18; + let t19; + let span6; + let t20; + let t21; + let span7; + let t22; + let t23; + let t24; + let div1; + let span8; + let t25; + let t26; + let span9; + let t27; + let t28; + let span10; + let t29; + let t30; + let span11; + let t31; + let t32; + let span12; + let t33; + let t34; + let p2; + let t35; + let strong; + let t36; + let t37; + let t38; + let p3; + let t39; + let code; + let t40; + let t41; + return { + c() { + meta = element("meta"); + t0 = space(); + div2 = element("div"); + h1 = element("h1"); + t1 = text("How to play Sverdle"); + t2 = space(); + p0 = element("p"); + t3 = text("Sverdle is a clone of "); + a = element("a"); + t4 = text("Wordle"); + t5 = text(", the\n word guessing game. To play, enter a five-letter English word. For example:"); + t6 = space(); + div0 = element("div"); + span0 = element("span"); + t7 = text("r"); + t8 = space(); + span1 = element("span"); + t9 = text("i"); + t10 = space(); + span2 = element("span"); + t11 = text("t"); + t12 = space(); + span3 = element("span"); + t13 = text("z"); + t14 = space(); + span4 = element("span"); + t15 = text("y"); + t16 = space(); + p1 = element("p"); + t17 = text("The "); + span5 = element("span"); + t18 = text("y"); + t19 = text(" is in the right place. "); + span6 = element("span"); + t20 = text("r"); + t21 = text(" and\n "); + span7 = element("span"); + t22 = text("t"); + t23 = text("\n are the right letters, but in the wrong place. The other letters are wrong, and can be discarded.\n Let's make another guess:"); + t24 = space(); + div1 = element("div"); + span8 = element("span"); + t25 = text("p"); + t26 = space(); + span9 = element("span"); + t27 = text("a"); + t28 = space(); + span10 = element("span"); + t29 = text("r"); + t30 = space(); + span11 = element("span"); + t31 = text("t"); + t32 = space(); + span12 = element("span"); + t33 = text("y"); + t34 = space(); + p2 = element("p"); + t35 = text("This time we guessed right! You have "); + strong = element("strong"); + t36 = text("six"); + t37 = text(" guesses to get the word."); + t38 = space(); + p3 = element("p"); + t39 = text("Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it\n impossible to cheat. It uses "); + code = element("code"); + t40 = text("
"); + t41 = text(" and cookies to submit data, meaning you can\n even play with JavaScript disabled!"); + this.h(); + }, + l(nodes) { + const head_nodes = head_selector("svelte-1fqqyy5", document.head); + meta = claim_element(head_nodes, "META", { name: true, content: true }); + head_nodes.forEach(detach); + t0 = claim_space(nodes); + div2 = claim_element(nodes, "DIV", { class: true }); + var div2_nodes = children(div2); + h1 = claim_element(div2_nodes, "H1", {}); + var h1_nodes = children(h1); + t1 = claim_text(h1_nodes, "How to play Sverdle"); + h1_nodes.forEach(detach); + t2 = claim_space(div2_nodes); + p0 = claim_element(div2_nodes, "P", {}); + var p0_nodes = children(p0); + t3 = claim_text(p0_nodes, "Sverdle is a clone of "); + a = claim_element(p0_nodes, "A", { href: true }); + var a_nodes = children(a); + t4 = claim_text(a_nodes, "Wordle"); + a_nodes.forEach(detach); + t5 = claim_text(p0_nodes, ", the\n word guessing game. To play, enter a five-letter English word. For example:"); + p0_nodes.forEach(detach); + t6 = claim_space(div2_nodes); + div0 = claim_element(div2_nodes, "DIV", { class: true }); + var div0_nodes = children(div0); + span0 = claim_element(div0_nodes, "SPAN", { class: true }); + var span0_nodes = children(span0); + t7 = claim_text(span0_nodes, "r"); + span0_nodes.forEach(detach); + t8 = claim_space(div0_nodes); + span1 = claim_element(div0_nodes, "SPAN", { class: true }); + var span1_nodes = children(span1); + t9 = claim_text(span1_nodes, "i"); + span1_nodes.forEach(detach); + t10 = claim_space(div0_nodes); + span2 = claim_element(div0_nodes, "SPAN", { class: true }); + var span2_nodes = children(span2); + t11 = claim_text(span2_nodes, "t"); + span2_nodes.forEach(detach); + t12 = claim_space(div0_nodes); + span3 = claim_element(div0_nodes, "SPAN", { class: true }); + var span3_nodes = children(span3); + t13 = claim_text(span3_nodes, "z"); + span3_nodes.forEach(detach); + t14 = claim_space(div0_nodes); + span4 = claim_element(div0_nodes, "SPAN", { class: true }); + var span4_nodes = children(span4); + t15 = claim_text(span4_nodes, "y"); + span4_nodes.forEach(detach); + div0_nodes.forEach(detach); + t16 = claim_space(div2_nodes); + p1 = claim_element(div2_nodes, "P", { class: true }); + var p1_nodes = children(p1); + t17 = claim_text(p1_nodes, "The "); + span5 = claim_element(p1_nodes, "SPAN", { class: true }); + var span5_nodes = children(span5); + t18 = claim_text(span5_nodes, "y"); + span5_nodes.forEach(detach); + t19 = claim_text(p1_nodes, " is in the right place. "); + span6 = claim_element(p1_nodes, "SPAN", { class: true }); + var span6_nodes = children(span6); + t20 = claim_text(span6_nodes, "r"); + span6_nodes.forEach(detach); + t21 = claim_text(p1_nodes, " and\n "); + span7 = claim_element(p1_nodes, "SPAN", { class: true }); + var span7_nodes = children(span7); + t22 = claim_text(span7_nodes, "t"); + span7_nodes.forEach(detach); + t23 = claim_text(p1_nodes, "\n are the right letters, but in the wrong place. The other letters are wrong, and can be discarded.\n Let's make another guess:"); + p1_nodes.forEach(detach); + t24 = claim_space(div2_nodes); + div1 = claim_element(div2_nodes, "DIV", { class: true }); + var div1_nodes = children(div1); + span8 = claim_element(div1_nodes, "SPAN", { class: true }); + var span8_nodes = children(span8); + t25 = claim_text(span8_nodes, "p"); + span8_nodes.forEach(detach); + t26 = claim_space(div1_nodes); + span9 = claim_element(div1_nodes, "SPAN", { class: true }); + var span9_nodes = children(span9); + t27 = claim_text(span9_nodes, "a"); + span9_nodes.forEach(detach); + t28 = claim_space(div1_nodes); + span10 = claim_element(div1_nodes, "SPAN", { class: true }); + var span10_nodes = children(span10); + t29 = claim_text(span10_nodes, "r"); + span10_nodes.forEach(detach); + t30 = claim_space(div1_nodes); + span11 = claim_element(div1_nodes, "SPAN", { class: true }); + var span11_nodes = children(span11); + t31 = claim_text(span11_nodes, "t"); + span11_nodes.forEach(detach); + t32 = claim_space(div1_nodes); + span12 = claim_element(div1_nodes, "SPAN", { class: true }); + var span12_nodes = children(span12); + t33 = claim_text(span12_nodes, "y"); + span12_nodes.forEach(detach); + div1_nodes.forEach(detach); + t34 = claim_space(div2_nodes); + p2 = claim_element(div2_nodes, "P", {}); + var p2_nodes = children(p2); + t35 = claim_text(p2_nodes, "This time we guessed right! You have "); + strong = claim_element(p2_nodes, "STRONG", {}); + var strong_nodes = children(strong); + t36 = claim_text(strong_nodes, "six"); + strong_nodes.forEach(detach); + t37 = claim_text(p2_nodes, " guesses to get the word."); + p2_nodes.forEach(detach); + t38 = claim_space(div2_nodes); + p3 = claim_element(div2_nodes, "P", {}); + var p3_nodes = children(p3); + t39 = claim_text(p3_nodes, "Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it\n impossible to cheat. It uses "); + code = claim_element(p3_nodes, "CODE", {}); + var code_nodes = children(code); + t40 = claim_text(code_nodes, ""); + code_nodes.forEach(detach); + t41 = claim_text(p3_nodes, " and cookies to submit data, meaning you can\n even play with JavaScript disabled!"); + p3_nodes.forEach(detach); + div2_nodes.forEach(detach); + this.h(); + }, + h() { + document.title = "How to play Sverdle"; + attr(meta, "name", "description"); + attr(meta, "content", "How to play Sverdle"); + attr(a, "href", "https://www.nytimes.com/games/wordle/index.html"); + attr(span0, "class", "close svelte-1x5nq1n"); + attr(span1, "class", "missing svelte-1x5nq1n"); + attr(span2, "class", "close svelte-1x5nq1n"); + attr(span3, "class", "missing svelte-1x5nq1n"); + attr(span4, "class", "exact svelte-1x5nq1n"); + attr(div0, "class", "example svelte-1x5nq1n"); + attr(span5, "class", "exact svelte-1x5nq1n"); + attr(span6, "class", "close svelte-1x5nq1n"); + attr(span7, "class", "close svelte-1x5nq1n"); + attr(p1, "class", "svelte-1x5nq1n"); + attr(span8, "class", "exact svelte-1x5nq1n"); + attr(span9, "class", "exact svelte-1x5nq1n"); + attr(span10, "class", "exact svelte-1x5nq1n"); + attr(span11, "class", "exact svelte-1x5nq1n"); + attr(span12, "class", "exact svelte-1x5nq1n"); + attr(div1, "class", "example svelte-1x5nq1n"); + attr(div2, "class", "text-column"); + }, + m(target, anchor) { + append_hydration(document.head, meta); + insert_hydration(target, t0, anchor); + insert_hydration(target, div2, anchor); + append_hydration(div2, h1); + append_hydration(h1, t1); + append_hydration(div2, t2); + append_hydration(div2, p0); + append_hydration(p0, t3); + append_hydration(p0, a); + append_hydration(a, t4); + append_hydration(p0, t5); + append_hydration(div2, t6); + append_hydration(div2, div0); + append_hydration(div0, span0); + append_hydration(span0, t7); + append_hydration(div0, t8); + append_hydration(div0, span1); + append_hydration(span1, t9); + append_hydration(div0, t10); + append_hydration(div0, span2); + append_hydration(span2, t11); + append_hydration(div0, t12); + append_hydration(div0, span3); + append_hydration(span3, t13); + append_hydration(div0, t14); + append_hydration(div0, span4); + append_hydration(span4, t15); + append_hydration(div2, t16); + append_hydration(div2, p1); + append_hydration(p1, t17); + append_hydration(p1, span5); + append_hydration(span5, t18); + append_hydration(p1, t19); + append_hydration(p1, span6); + append_hydration(span6, t20); + append_hydration(p1, t21); + append_hydration(p1, span7); + append_hydration(span7, t22); + append_hydration(p1, t23); + append_hydration(div2, t24); + append_hydration(div2, div1); + append_hydration(div1, span8); + append_hydration(span8, t25); + append_hydration(div1, t26); + append_hydration(div1, span9); + append_hydration(span9, t27); + append_hydration(div1, t28); + append_hydration(div1, span10); + append_hydration(span10, t29); + append_hydration(div1, t30); + append_hydration(div1, span11); + append_hydration(span11, t31); + append_hydration(div1, t32); + append_hydration(div1, span12); + append_hydration(span12, t33); + append_hydration(div2, t34); + append_hydration(div2, p2); + append_hydration(p2, t35); + append_hydration(p2, strong); + append_hydration(strong, t36); + append_hydration(p2, t37); + append_hydration(div2, t38); + append_hydration(div2, p3); + append_hydration(p3, t39); + append_hydration(p3, code); + append_hydration(code, t40); + append_hydration(p3, t41); + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + detach(meta); + if (detaching) + detach(t0); + if (detaching) + detach(div2); + } + }; +} +class Page extends SvelteComponent { + constructor(options) { + super(); + init(this, options, null, create_fragment, safe_not_equal, {}); + } +} +export { + Page as default +}; diff --git a/examples/electron-app/src/_app/immutable/modules/pages/_page.ts-ed610ca4.js b/examples/electron-app/src/_app/immutable/modules/pages/_page.ts-ed610ca4.js new file mode 100644 index 0000000..71db82d --- /dev/null +++ b/examples/electron-app/src/_app/immutable/modules/pages/_page.ts-ed610ca4.js @@ -0,0 +1,4 @@ +import { p } from "../../chunks/_page-de0ef88a.js"; +export { + p as prerender +}; diff --git a/examples/electron-app/src/_app/immutable/modules/pages/about/_page.ts-6ba60706.js b/examples/electron-app/src/_app/immutable/modules/pages/about/_page.ts-6ba60706.js new file mode 100644 index 0000000..83057cb --- /dev/null +++ b/examples/electron-app/src/_app/immutable/modules/pages/about/_page.ts-6ba60706.js @@ -0,0 +1,6 @@ +import "../../../chunks/environment-57be8769.js"; +import { c, p } from "../../../chunks/_page-34b026b6.js"; +export { + c as csr, + p as prerender +}; diff --git a/examples/electron-app/src/_app/immutable/modules/pages/sverdle/how-to-play/_page.ts-72eb78cc.js b/examples/electron-app/src/_app/immutable/modules/pages/sverdle/how-to-play/_page.ts-72eb78cc.js new file mode 100644 index 0000000..13c67f6 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/modules/pages/sverdle/how-to-play/_page.ts-72eb78cc.js @@ -0,0 +1,6 @@ +import "../../../../chunks/environment-57be8769.js"; +import { c, p } from "../../../../chunks/_page-cbe3748d.js"; +export { + c as csr, + p as prerender +}; diff --git a/examples/electron-app/src/_app/immutable/start-5499181a.js b/examples/electron-app/src/_app/immutable/start-5499181a.js new file mode 100644 index 0000000..ef0b369 --- /dev/null +++ b/examples/electron-app/src/_app/immutable/start-5499181a.js @@ -0,0 +1,2259 @@ +import { S as SvelteComponent, i as init, s as safe_not_equal, a as space, e as empty, c as claim_space, b as insert_hydration, g as group_outros, t as transition_out, d as check_outros, f as transition_in, h as detach, j as afterUpdate, o as onMount, k as element, l as claim_element, m as children, n as attr, p as set_style, q as text, r as claim_text, u as set_data, v as binding_callbacks, w as construct_svelte_component, x as create_component, y as claim_component, z as mount_component, A as destroy_component, B as tick } from "./chunks/index-d985765e.js"; +import { S as SCROLL_KEY, a as SNAPSHOT_KEY, I as INDEX_KEY, g as get_base_uri, f as find_anchor, b as get_link_info, c as get_router_options, s as stores, i as is_external_url, d as scroll_state, e as base, P as PRELOAD_PRIORITIES, h as init$1, j as set_assets, k as set_version } from "./chunks/singletons-0c6ee057.js"; +import { u as unflatten } from "./chunks/parse-a9b5aeea.js"; +function normalize_path(path, trailing_slash) { + if (path === "/" || trailing_slash === "ignore") + return path; + if (trailing_slash === "never") { + return path.endsWith("/") ? path.slice(0, -1) : path; + } else if (trailing_slash === "always" && !path.endsWith("/")) { + return path + "/"; + } + return path; +} +function decode_pathname(pathname) { + return pathname.split("%25").map(decodeURI).join("%25"); +} +function decode_params(params) { + for (const key in params) { + params[key] = decodeURIComponent(params[key]); + } + return params; +} +const tracked_url_properties = ["href", "pathname", "search", "searchParams", "toString", "toJSON"]; +function make_trackable(url, callback) { + const tracked = new URL(url); + for (const property of tracked_url_properties) { + let value = tracked[property]; + Object.defineProperty(tracked, property, { + get() { + callback(); + return value; + }, + enumerable: true, + configurable: true + }); + } + disable_hash(tracked); + return tracked; +} +function disable_hash(url) { + Object.defineProperty(url, "hash", { + get() { + throw new Error( + "Cannot access event.url.hash. Consider using `$page.url.hash` inside a component instead" + ); + } + }); +} +const DATA_SUFFIX = "/__data.json"; +function add_data_suffix(pathname) { + return pathname.replace(/\/$/, "") + DATA_SUFFIX; +} +function get(key) { + try { + return JSON.parse(sessionStorage[key]); + } catch { + } +} +function set(key, value) { + const json = JSON.stringify(value); + try { + sessionStorage[key] = json; + } catch { + } +} +function hash(...values) { + let hash2 = 5381; + for (const value of values) { + if (typeof value === "string") { + let i = value.length; + while (i) + hash2 = hash2 * 33 ^ value.charCodeAt(--i); + } else if (ArrayBuffer.isView(value)) { + const buffer = new Uint8Array(value.buffer, value.byteOffset, value.byteLength); + let i = buffer.length; + while (i) + hash2 = hash2 * 33 ^ buffer[--i]; + } else { + throw new TypeError("value must be a string or TypedArray"); + } + } + return (hash2 >>> 0).toString(36); +} +const native_fetch = window.fetch; +{ + window.fetch = (input, init2) => { + const method = input instanceof Request ? input.method : (init2 == null ? void 0 : init2.method) || "GET"; + if (method !== "GET") { + cache.delete(build_selector(input)); + } + return native_fetch(input, init2); + }; +} +const cache = /* @__PURE__ */ new Map(); +function initial_fetch(resource, opts) { + const selector = build_selector(resource, opts); + const script = document.querySelector(selector); + if (script == null ? void 0 : script.textContent) { + const { body, ...init2 } = JSON.parse(script.textContent); + const ttl = script.getAttribute("data-ttl"); + if (ttl) + cache.set(selector, { body, init: init2, ttl: 1e3 * Number(ttl) }); + return Promise.resolve(new Response(body, init2)); + } + return native_fetch(resource, opts); +} +function subsequent_fetch(resource, resolved, opts) { + if (cache.size > 0) { + const selector = build_selector(resource, opts); + const cached = cache.get(selector); + if (cached) { + if (performance.now() < cached.ttl && ["default", "force-cache", "only-if-cached", void 0].includes(opts == null ? void 0 : opts.cache)) { + return new Response(cached.body, cached.init); + } + cache.delete(selector); + } + } + return native_fetch(resolved, opts); +} +function build_selector(resource, opts) { + const url = JSON.stringify(resource instanceof Request ? resource.url : resource); + let selector = `script[data-sveltekit-fetched][data-url=${url}]`; + if ((opts == null ? void 0 : opts.headers) || (opts == null ? void 0 : opts.body)) { + const values = []; + if (opts.headers) { + values.push([...new Headers(opts.headers)].join(",")); + } + if (opts.body && (typeof opts.body === "string" || ArrayBuffer.isView(opts.body))) { + values.push(opts.body); + } + selector += `[data-hash="${hash(...values)}"]`; + } + return selector; +} +const param_pattern = /^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/; +function parse_route_id(id) { + const params = []; + const pattern = id === "/" ? /^\/$/ : new RegExp( + `^${get_route_segments(id).map((segment) => { + const rest_match = /^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(segment); + if (rest_match) { + params.push({ + name: rest_match[1], + matcher: rest_match[2], + optional: false, + rest: true, + chained: true + }); + return "(?:/(.*))?"; + } + const optional_match = /^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(segment); + if (optional_match) { + params.push({ + name: optional_match[1], + matcher: optional_match[2], + optional: true, + rest: false, + chained: true + }); + return "(?:/([^/]+))?"; + } + if (!segment) { + return; + } + const parts = segment.split(/\[(.+?)\](?!\])/); + const result = parts.map((content, i) => { + if (i % 2) { + if (content.startsWith("x+")) { + return escape(String.fromCharCode(parseInt(content.slice(2), 16))); + } + if (content.startsWith("u+")) { + return escape( + String.fromCharCode( + ...content.slice(2).split("-").map((code) => parseInt(code, 16)) + ) + ); + } + const match = param_pattern.exec(content); + if (!match) { + throw new Error( + `Invalid param: ${content}. Params and matcher names can only have underscores and alphanumeric characters.` + ); + } + const [, is_optional, is_rest, name, matcher] = match; + params.push({ + name, + matcher, + optional: !!is_optional, + rest: !!is_rest, + chained: is_rest ? i === 1 && parts[0] === "" : false + }); + return is_rest ? "(.*?)" : is_optional ? "([^/]*)?" : "([^/]+?)"; + } + return escape(content); + }).join(""); + return "/" + result; + }).join("")}/?$` + ); + return { pattern, params }; +} +function affects_path(segment) { + return !/^\([^)]+\)$/.test(segment); +} +function get_route_segments(route) { + return route.slice(1).split("/").filter(affects_path); +} +function exec(match, params, matchers2) { + const result = {}; + const values = match.slice(1); + let buffered = 0; + for (let i = 0; i < params.length; i += 1) { + const param = params[i]; + const value = values[i - buffered]; + if (param.chained && param.rest && buffered) { + result[param.name] = values.slice(i - buffered, i + 1).filter((s) => s).join("/"); + buffered = 0; + continue; + } + if (value === void 0) { + if (param.rest) + result[param.name] = ""; + continue; + } + if (!param.matcher || matchers2[param.matcher](value)) { + result[param.name] = value; + continue; + } + if (param.optional && param.chained) { + buffered++; + continue; + } + return; + } + if (buffered) + return; + return result; +} +function escape(str) { + return str.normalize().replace(/[[\]]/g, "\\$&").replace(/%/g, "%25").replace(/\//g, "%2[Ff]").replace(/\?/g, "%3[Ff]").replace(/#/g, "%23").replace(/[.*+?^${}()|\\]/g, "\\$&"); +} +function parse(nodes2, server_loads2, dictionary2, matchers2) { + const layouts_with_server_load = new Set(server_loads2); + return Object.entries(dictionary2).map(([id, [leaf, layouts, errors]]) => { + const { pattern, params } = parse_route_id(id); + const route = { + id, + /** @param {string} path */ + exec: (path) => { + const match = pattern.exec(path); + if (match) + return exec(match, params, matchers2); + }, + errors: [1, ...errors || []].map((n) => nodes2[n]), + layouts: [0, ...layouts || []].map(create_layout_loader), + leaf: create_leaf_loader(leaf) + }; + route.errors.length = route.layouts.length = Math.max( + route.errors.length, + route.layouts.length + ); + return route; + }); + function create_leaf_loader(id) { + const uses_server_data = id < 0; + if (uses_server_data) + id = ~id; + return [uses_server_data, nodes2[id]]; + } + function create_layout_loader(id) { + return id === void 0 ? id : [layouts_with_server_load.has(id), nodes2[id]]; + } +} +function create_else_block(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + var switch_value = ( + /*constructors*/ + ctx[1][0] + ); + function switch_props(ctx2) { + let switch_instance_props = { + data: ( + /*data_0*/ + ctx2[3] + ), + form: ( + /*form*/ + ctx2[2] + ) + }; + return { props: switch_instance_props }; + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); + ctx[12](switch_instance); + } + return { + c() { + if (switch_instance) + create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + l(nodes2) { + if (switch_instance) + claim_component(switch_instance.$$.fragment, nodes2); + switch_instance_anchor = empty(); + }, + m(target, anchor) { + if (switch_instance) + mount_component(switch_instance, target, anchor); + insert_hydration(target, switch_instance_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + const switch_instance_changes = {}; + if (dirty & /*data_0*/ + 8) + switch_instance_changes.data = /*data_0*/ + ctx2[3]; + if (dirty & /*form*/ + 4) + switch_instance_changes.form = /*form*/ + ctx2[2]; + if (switch_value !== (switch_value = /*constructors*/ + ctx2[1][0])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + check_outros(); + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx2)); + ctx2[12](switch_instance); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i(local) { + if (current) + return; + if (switch_instance) + transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o(local) { + if (switch_instance) + transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d(detaching) { + ctx[12](null); + if (detaching) + detach(switch_instance_anchor); + if (switch_instance) + destroy_component(switch_instance, detaching); + } + }; +} +function create_if_block_2(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + var switch_value = ( + /*constructors*/ + ctx[1][0] + ); + function switch_props(ctx2) { + let switch_instance_props = { + data: ( + /*data_0*/ + ctx2[3] + ), + $$slots: { default: [create_default_slot] }, + $$scope: { ctx: ctx2 } + }; + return { props: switch_instance_props }; + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); + ctx[11](switch_instance); + } + return { + c() { + if (switch_instance) + create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + l(nodes2) { + if (switch_instance) + claim_component(switch_instance.$$.fragment, nodes2); + switch_instance_anchor = empty(); + }, + m(target, anchor) { + if (switch_instance) + mount_component(switch_instance, target, anchor); + insert_hydration(target, switch_instance_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + const switch_instance_changes = {}; + if (dirty & /*data_0*/ + 8) + switch_instance_changes.data = /*data_0*/ + ctx2[3]; + if (dirty & /*$$scope, constructors, data_1, form, components*/ + 8215) { + switch_instance_changes.$$scope = { dirty, ctx: ctx2 }; + } + if (switch_value !== (switch_value = /*constructors*/ + ctx2[1][0])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + check_outros(); + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx2)); + ctx2[11](switch_instance); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i(local) { + if (current) + return; + if (switch_instance) + transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o(local) { + if (switch_instance) + transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d(detaching) { + ctx[11](null); + if (detaching) + detach(switch_instance_anchor); + if (switch_instance) + destroy_component(switch_instance, detaching); + } + }; +} +function create_default_slot(ctx) { + let switch_instance; + let switch_instance_anchor; + let current; + var switch_value = ( + /*constructors*/ + ctx[1][1] + ); + function switch_props(ctx2) { + let switch_instance_props = { + data: ( + /*data_1*/ + ctx2[4] + ), + form: ( + /*form*/ + ctx2[2] + ) + }; + return { props: switch_instance_props }; + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); + ctx[10](switch_instance); + } + return { + c() { + if (switch_instance) + create_component(switch_instance.$$.fragment); + switch_instance_anchor = empty(); + }, + l(nodes2) { + if (switch_instance) + claim_component(switch_instance.$$.fragment, nodes2); + switch_instance_anchor = empty(); + }, + m(target, anchor) { + if (switch_instance) + mount_component(switch_instance, target, anchor); + insert_hydration(target, switch_instance_anchor, anchor); + current = true; + }, + p(ctx2, dirty) { + const switch_instance_changes = {}; + if (dirty & /*data_1*/ + 16) + switch_instance_changes.data = /*data_1*/ + ctx2[4]; + if (dirty & /*form*/ + 4) + switch_instance_changes.form = /*form*/ + ctx2[2]; + if (switch_value !== (switch_value = /*constructors*/ + ctx2[1][1])) { + if (switch_instance) { + group_outros(); + const old_component = switch_instance; + transition_out(old_component.$$.fragment, 1, 0, () => { + destroy_component(old_component, 1); + }); + check_outros(); + } + if (switch_value) { + switch_instance = construct_svelte_component(switch_value, switch_props(ctx2)); + ctx2[10](switch_instance); + create_component(switch_instance.$$.fragment); + transition_in(switch_instance.$$.fragment, 1); + mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); + } else { + switch_instance = null; + } + } else if (switch_value) { + switch_instance.$set(switch_instance_changes); + } + }, + i(local) { + if (current) + return; + if (switch_instance) + transition_in(switch_instance.$$.fragment, local); + current = true; + }, + o(local) { + if (switch_instance) + transition_out(switch_instance.$$.fragment, local); + current = false; + }, + d(detaching) { + ctx[10](null); + if (detaching) + detach(switch_instance_anchor); + if (switch_instance) + destroy_component(switch_instance, detaching); + } + }; +} +function create_if_block(ctx) { + let div; + let if_block = ( + /*navigated*/ + ctx[6] && create_if_block_1(ctx) + ); + return { + c() { + div = element("div"); + if (if_block) + if_block.c(); + this.h(); + }, + l(nodes2) { + div = claim_element(nodes2, "DIV", { + id: true, + "aria-live": true, + "aria-atomic": true, + style: true + }); + var div_nodes = children(div); + if (if_block) + if_block.l(div_nodes); + div_nodes.forEach(detach); + this.h(); + }, + h() { + attr(div, "id", "svelte-announcer"); + attr(div, "aria-live", "assertive"); + attr(div, "aria-atomic", "true"); + set_style(div, "position", "absolute"); + set_style(div, "left", "0"); + set_style(div, "top", "0"); + set_style(div, "clip", "rect(0 0 0 0)"); + set_style(div, "clip-path", "inset(50%)"); + set_style(div, "overflow", "hidden"); + set_style(div, "white-space", "nowrap"); + set_style(div, "width", "1px"); + set_style(div, "height", "1px"); + }, + m(target, anchor) { + insert_hydration(target, div, anchor); + if (if_block) + if_block.m(div, null); + }, + p(ctx2, dirty) { + if ( + /*navigated*/ + ctx2[6] + ) { + if (if_block) { + if_block.p(ctx2, dirty); + } else { + if_block = create_if_block_1(ctx2); + if_block.c(); + if_block.m(div, null); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (detaching) + detach(div); + if (if_block) + if_block.d(); + } + }; +} +function create_if_block_1(ctx) { + let t; + return { + c() { + t = text( + /*title*/ + ctx[7] + ); + }, + l(nodes2) { + t = claim_text( + nodes2, + /*title*/ + ctx[7] + ); + }, + m(target, anchor) { + insert_hydration(target, t, anchor); + }, + p(ctx2, dirty) { + if (dirty & /*title*/ + 128) + set_data( + t, + /*title*/ + ctx2[7] + ); + }, + d(detaching) { + if (detaching) + detach(t); + } + }; +} +function create_fragment(ctx) { + let current_block_type_index; + let if_block0; + let t; + let if_block1_anchor; + let current; + const if_block_creators = [create_if_block_2, create_else_block]; + const if_blocks = []; + function select_block_type(ctx2, dirty) { + if ( + /*constructors*/ + ctx2[1][1] + ) + return 0; + return 1; + } + current_block_type_index = select_block_type(ctx); + if_block0 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + let if_block1 = ( + /*mounted*/ + ctx[5] && create_if_block(ctx) + ); + return { + c() { + if_block0.c(); + t = space(); + if (if_block1) + if_block1.c(); + if_block1_anchor = empty(); + }, + l(nodes2) { + if_block0.l(nodes2); + t = claim_space(nodes2); + if (if_block1) + if_block1.l(nodes2); + if_block1_anchor = empty(); + }, + m(target, anchor) { + if_blocks[current_block_type_index].m(target, anchor); + insert_hydration(target, t, anchor); + if (if_block1) + if_block1.m(target, anchor); + insert_hydration(target, if_block1_anchor, anchor); + current = true; + }, + p(ctx2, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx2); + if (current_block_type_index === previous_block_index) { + if_blocks[current_block_type_index].p(ctx2, dirty); + } else { + group_outros(); + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); + check_outros(); + if_block0 = if_blocks[current_block_type_index]; + if (!if_block0) { + if_block0 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); + if_block0.c(); + } else { + if_block0.p(ctx2, dirty); + } + transition_in(if_block0, 1); + if_block0.m(t.parentNode, t); + } + if ( + /*mounted*/ + ctx2[5] + ) { + if (if_block1) { + if_block1.p(ctx2, dirty); + } else { + if_block1 = create_if_block(ctx2); + if_block1.c(); + if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + }, + i(local) { + if (current) + return; + transition_in(if_block0); + current = true; + }, + o(local) { + transition_out(if_block0); + current = false; + }, + d(detaching) { + if_blocks[current_block_type_index].d(detaching); + if (detaching) + detach(t); + if (if_block1) + if_block1.d(detaching); + if (detaching) + detach(if_block1_anchor); + } + }; +} +function instance($$self, $$props, $$invalidate) { + let { stores: stores2 } = $$props; + let { page } = $$props; + let { constructors } = $$props; + let { components = [] } = $$props; + let { form } = $$props; + let { data_0 = null } = $$props; + let { data_1 = null } = $$props; + afterUpdate(stores2.page.notify); + let mounted = false; + let navigated = false; + let title = null; + onMount(() => { + const unsubscribe = stores2.page.subscribe(() => { + if (mounted) { + $$invalidate(6, navigated = true); + $$invalidate(7, title = document.title || "untitled page"); + } + }); + $$invalidate(5, mounted = true); + return unsubscribe; + }); + function switch_instance_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + components[1] = $$value; + $$invalidate(0, components); + }); + } + function switch_instance_binding_1($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + components[0] = $$value; + $$invalidate(0, components); + }); + } + function switch_instance_binding_2($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + components[0] = $$value; + $$invalidate(0, components); + }); + } + $$self.$$set = ($$props2) => { + if ("stores" in $$props2) + $$invalidate(8, stores2 = $$props2.stores); + if ("page" in $$props2) + $$invalidate(9, page = $$props2.page); + if ("constructors" in $$props2) + $$invalidate(1, constructors = $$props2.constructors); + if ("components" in $$props2) + $$invalidate(0, components = $$props2.components); + if ("form" in $$props2) + $$invalidate(2, form = $$props2.form); + if ("data_0" in $$props2) + $$invalidate(3, data_0 = $$props2.data_0); + if ("data_1" in $$props2) + $$invalidate(4, data_1 = $$props2.data_1); + }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*stores, page*/ + 768) { + stores2.page.set(page); + } + }; + return [ + components, + constructors, + form, + data_0, + data_1, + mounted, + navigated, + title, + stores2, + page, + switch_instance_binding, + switch_instance_binding_1, + switch_instance_binding_2 + ]; +} +class Root extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { + stores: 8, + page: 9, + constructors: 1, + components: 0, + form: 2, + data_0: 3, + data_1: 4 + }); + } +} +const scriptRel = "modulepreload"; +const assetsURL = function(dep, importerUrl) { + return new URL(dep, importerUrl).href; +}; +const seen = {}; +const __vitePreload = function preload(baseModule, deps, importerUrl) { + if (!deps || deps.length === 0) { + return baseModule(); + } + const links = document.getElementsByTagName("link"); + return Promise.all(deps.map((dep) => { + dep = assetsURL(dep, importerUrl); + if (dep in seen) + return; + seen[dep] = true; + const isCss = dep.endsWith(".css"); + const cssSelector = isCss ? '[rel="stylesheet"]' : ""; + const isBaseRelative = !!importerUrl; + if (isBaseRelative) { + for (let i = links.length - 1; i >= 0; i--) { + const link2 = links[i]; + if (link2.href === dep && (!isCss || link2.rel === "stylesheet")) { + return; + } + } + } else if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { + return; + } + const link = document.createElement("link"); + link.rel = isCss ? "stylesheet" : scriptRel; + if (!isCss) { + link.as = "script"; + link.crossOrigin = ""; + } + link.href = dep; + document.head.appendChild(link); + if (isCss) { + return new Promise((res, rej) => { + link.addEventListener("load", res); + link.addEventListener("error", () => rej(new Error(`Unable to preload CSS for ${dep}`))); + }); + } + })).then(() => baseModule()); +}; +const matchers = {}; +const nodes = [ + () => __vitePreload(() => import("./chunks/0-f2cd2ce4.js"), true ? ["./chunks/0-f2cd2ce4.js","./components/pages/_layout.svelte-20a5d298.js","./chunks/index-d985765e.js","./chunks/stores-8cac4559.js","./chunks/singletons-0c6ee057.js","./chunks/index-bb582736.js","./assets/_layout-19af9c2d.css"] : void 0, import.meta.url), + () => __vitePreload(() => import("./chunks/1-429531b0.js"), true ? ["./chunks/1-429531b0.js","./components/error.svelte-673baa07.js","./chunks/index-d985765e.js","./chunks/stores-8cac4559.js","./chunks/singletons-0c6ee057.js","./chunks/index-bb582736.js"] : void 0, import.meta.url), + () => __vitePreload(() => import("./chunks/2-c7cfc074.js"), true ? ["./chunks/2-c7cfc074.js","./chunks/_page-de0ef88a.js","./components/pages/_page.svelte-8f3445c9.js","./chunks/index-d985765e.js","./chunks/index-bb582736.js","./assets/_page-08e4d5ca.css"] : void 0, import.meta.url), + () => __vitePreload(() => import("./chunks/3-44ff0c1d.js"), true ? ["./chunks/3-44ff0c1d.js","./chunks/_page-34b026b6.js","./chunks/environment-57be8769.js","./components/pages/about/_page.svelte-f31c9606.js","./chunks/index-d985765e.js"] : void 0, import.meta.url), + () => __vitePreload(() => import("./chunks/4-5dde9a39.js"), true ? ["./chunks/4-5dde9a39.js","./components/pages/sverdle/_page.svelte-aa322e66.js","./chunks/index-d985765e.js","./chunks/parse-a9b5aeea.js","./chunks/singletons-0c6ee057.js","./chunks/index-bb582736.js","./assets/_page-b0e588ca.css"] : void 0, import.meta.url), + () => __vitePreload(() => import("./chunks/5-9483b414.js"), true ? ["./chunks/5-9483b414.js","./chunks/_page-cbe3748d.js","./chunks/environment-57be8769.js","./components/pages/sverdle/how-to-play/_page.svelte-fb619894.js","./chunks/index-d985765e.js","./assets/_page-0e6c8ae6.css"] : void 0, import.meta.url) +]; +const server_loads = []; +const dictionary = { + "/": [2], + "/about": [3], + "/sverdle": [~4], + "/sverdle/how-to-play": [5] +}; +const hooks = { + handleError: ({ error }) => { + console.error(error); + } +}; +let HttpError = class HttpError2 { + /** + * @param {number} status + * @param {{message: string} extends App.Error ? (App.Error | string | undefined) : App.Error} body + */ + constructor(status, body) { + this.status = status; + if (typeof body === "string") { + this.body = { message: body }; + } else if (body) { + this.body = body; + } else { + this.body = { message: `Error: ${status}` }; + } + } + toString() { + return JSON.stringify(this.body); + } +}; +let Redirect = class Redirect2 { + /** + * @param {300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308} status + * @param {string} location + */ + constructor(status, location2) { + this.status = status; + this.location = location2; + } +}; +async function unwrap_promises(object) { + var _a; + for (const key in object) { + if (typeof ((_a = object[key]) == null ? void 0 : _a.then) === "function") { + return Object.fromEntries( + await Promise.all(Object.entries(object).map(async ([key2, value]) => [key2, await value])) + ); + } + } + return object; +} +function compact(arr) { + return arr.filter( + /** @returns {val is NonNullable} */ + (val) => val != null + ); +} +const routes = parse(nodes, server_loads, dictionary, matchers); +const default_layout_loader = nodes[0]; +const default_error_loader = nodes[1]; +default_layout_loader(); +default_error_loader(); +const scroll_positions = get(SCROLL_KEY) ?? {}; +const snapshots = get(SNAPSHOT_KEY) ?? {}; +function update_scroll_positions(index) { + scroll_positions[index] = scroll_state(); +} +function create_client({ target }) { + var _a; + const container = document.documentElement; + const invalidated = []; + const components = []; + let load_cache = null; + const callbacks = { + /** @type {Array<(navigation: import('types').BeforeNavigate) => void>} */ + before_navigate: [], + /** @type {Array<(navigation: import('types').AfterNavigate) => void>} */ + after_navigate: [] + }; + let current = { + branch: [], + error: null, + // @ts-ignore - we need the initial value to be null + url: null + }; + let hydrated = false; + let started = false; + let autoscroll = true; + let updating = false; + let navigating = false; + let hash_navigating = false; + let force_invalidation = false; + let root; + let current_history_index = (_a = history.state) == null ? void 0 : _a[INDEX_KEY]; + if (!current_history_index) { + current_history_index = Date.now(); + history.replaceState( + { ...history.state, [INDEX_KEY]: current_history_index }, + "", + location.href + ); + } + const scroll = scroll_positions[current_history_index]; + if (scroll) { + history.scrollRestoration = "manual"; + scrollTo(scroll.x, scroll.y); + } + let page; + let token; + let pending_invalidate; + async function invalidate() { + pending_invalidate = pending_invalidate || Promise.resolve(); + await pending_invalidate; + pending_invalidate = null; + const url = new URL(location.href); + const intent = get_navigation_intent(url, true); + load_cache = null; + await update(intent, url, []); + } + function capture_snapshot(index) { + if (components.some((c) => c == null ? void 0 : c.snapshot)) { + snapshots[index] = components.map((c) => { + var _a2; + return (_a2 = c == null ? void 0 : c.snapshot) == null ? void 0 : _a2.capture(); + }); + } + } + function restore_snapshot(index) { + var _a2; + (_a2 = snapshots[index]) == null ? void 0 : _a2.forEach((value, i) => { + var _a3, _b; + (_b = (_a3 = components[i]) == null ? void 0 : _a3.snapshot) == null ? void 0 : _b.restore(value); + }); + } + async function goto(url, { + noScroll = false, + replaceState = false, + keepFocus = false, + state = {}, + invalidateAll = false + }, redirect_chain, nav_token) { + if (typeof url === "string") { + url = new URL(url, get_base_uri(document)); + } + return navigate({ + url, + scroll: noScroll ? scroll_state() : null, + keepfocus: keepFocus, + redirect_chain, + details: { + state, + replaceState + }, + nav_token, + accepted: () => { + if (invalidateAll) { + force_invalidation = true; + } + }, + blocked: () => { + }, + type: "goto" + }); + } + async function preload_data(intent) { + load_cache = { + id: intent.id, + promise: load_route(intent).then((result) => { + if (result.type === "loaded" && result.state.error) { + load_cache = null; + } + return result; + }) + }; + return load_cache.promise; + } + async function preload_code(...pathnames) { + const matching = routes.filter((route) => pathnames.some((pathname) => route.exec(pathname))); + const promises = matching.map((r) => { + return Promise.all([...r.layouts, r.leaf].map((load) => load == null ? void 0 : load[1]())); + }); + await Promise.all(promises); + } + async function update(intent, url, redirect_chain, previous_history_index, opts, nav_token = {}, callback) { + var _a2, _b; + token = nav_token; + let navigation_result = intent && await load_route(intent); + if (!navigation_result) { + navigation_result = await server_fallback( + url, + { id: null }, + await handle_error(new Error(`Not found: ${url.pathname}`), { + url, + params: {}, + route: { id: null } + }), + 404 + ); + } + url = (intent == null ? void 0 : intent.url) || url; + if (token !== nav_token) + return false; + if (navigation_result.type === "redirect") { + if (redirect_chain.length > 10 || redirect_chain.includes(url.pathname)) { + navigation_result = await load_root_error_page({ + status: 500, + error: await handle_error(new Error("Redirect loop"), { + url, + params: {}, + route: { id: null } + }), + url, + route: { id: null } + }); + } else { + goto( + new URL(navigation_result.location, url).href, + {}, + [...redirect_chain, url.pathname], + nav_token + ); + return false; + } + } else if ( + /** @type {number} */ + ((_b = (_a2 = navigation_result.props) == null ? void 0 : _a2.page) == null ? void 0 : _b.status) >= 400 + ) { + const updated = await stores.updated.check(); + if (updated) { + await native_navigation(url); + } + } + invalidated.length = 0; + force_invalidation = false; + updating = true; + if (previous_history_index) { + update_scroll_positions(previous_history_index); + capture_snapshot(previous_history_index); + } + if (opts && opts.details) { + const { details } = opts; + const change = details.replaceState ? 0 : 1; + details.state[INDEX_KEY] = current_history_index += change; + history[details.replaceState ? "replaceState" : "pushState"](details.state, "", url); + if (!details.replaceState) { + let i = current_history_index + 1; + while (snapshots[i] || scroll_positions[i]) { + delete snapshots[i]; + delete scroll_positions[i]; + i += 1; + } + } + } + load_cache = null; + if (started) { + current = navigation_result.state; + if (navigation_result.props.page) { + navigation_result.props.page.url = url; + } + root.$set(navigation_result.props); + } else { + initialize(navigation_result); + } + if (opts) { + const { scroll: scroll2, keepfocus } = opts; + const { activeElement } = document; + await tick(); + const changed_focus = ( + // reset focus only if any manual focus management didn't override it + document.activeElement !== activeElement && // also refocus when activeElement is body already because the + // focus event might not have been fired on it yet + document.activeElement !== document.body + ); + if (!keepfocus && !changed_focus) { + await reset_focus(); + } + if (autoscroll) { + const deep_linked = url.hash && document.getElementById(decodeURIComponent(url.hash.slice(1))); + if (scroll2) { + scrollTo(scroll2.x, scroll2.y); + } else if (deep_linked) { + deep_linked.scrollIntoView(); + } else { + scrollTo(0, 0); + } + } + } else { + await tick(); + } + autoscroll = true; + if (navigation_result.props.page) { + page = navigation_result.props.page; + } + if (callback) + callback(); + updating = false; + } + function initialize(result) { + var _a2; + current = result.state; + const style = document.querySelector("style[data-sveltekit]"); + if (style) + style.remove(); + page = /** @type {import('types').Page} */ + result.props.page; + root = new Root({ + target, + props: { ...result.props, stores, components }, + hydrate: true + }); + restore_snapshot(current_history_index); + const navigation = { + from: null, + to: { + params: current.params, + route: { id: ((_a2 = current.route) == null ? void 0 : _a2.id) ?? null }, + url: new URL(location.href) + }, + willUnload: false, + type: "enter" + }; + callbacks.after_navigate.forEach((fn) => fn(navigation)); + started = true; + } + async function get_navigation_result_from_branch({ + url, + params, + branch, + status, + error, + route, + form + }) { + let slash = "never"; + for (const node of branch) { + if ((node == null ? void 0 : node.slash) !== void 0) + slash = node.slash; + } + url.pathname = normalize_path(url.pathname, slash); + url.search = url.search; + const result = { + type: "loaded", + state: { + url, + params, + branch, + error, + route + }, + props: { + // @ts-ignore Somehow it's getting SvelteComponent and SvelteComponentDev mixed up + constructors: compact(branch).map((branch_node) => branch_node.node.component) + } + }; + if (form !== void 0) { + result.props.form = form; + } + let data = {}; + let data_changed = !page; + let p = 0; + for (let i = 0; i < Math.max(branch.length, current.branch.length); i += 1) { + const node = branch[i]; + const prev = current.branch[i]; + if ((node == null ? void 0 : node.data) !== (prev == null ? void 0 : prev.data)) + data_changed = true; + if (!node) + continue; + data = { ...data, ...node.data }; + if (data_changed) { + result.props[`data_${p}`] = data; + } + p += 1; + } + const page_changed = !current.url || url.href !== current.url.href || current.error !== error || form !== void 0 && form !== page.form || data_changed; + if (page_changed) { + result.props.page = { + error, + params, + route: { + id: (route == null ? void 0 : route.id) ?? null + }, + status, + url: new URL(url), + form: form ?? null, + // The whole page store is updated, but this way the object reference stays the same + data: data_changed ? data : page.data + }; + } + return result; + } + async function load_node({ loader, parent, url, params, route, server_data_node }) { + var _a2, _b, _c; + let data = null; + const uses = { + dependencies: /* @__PURE__ */ new Set(), + params: /* @__PURE__ */ new Set(), + parent: false, + route: false, + url: false + }; + const node = await loader(); + if ((_a2 = node.universal) == null ? void 0 : _a2.load) { + let depends = function(...deps) { + for (const dep of deps) { + const { href } = new URL(dep, url); + uses.dependencies.add(href); + } + }; + const load_input = { + route: { + get id() { + uses.route = true; + return route.id; + } + }, + params: new Proxy(params, { + get: (target2, key) => { + uses.params.add( + /** @type {string} */ + key + ); + return target2[ + /** @type {string} */ + key + ]; + } + }), + data: (server_data_node == null ? void 0 : server_data_node.data) ?? null, + url: make_trackable(url, () => { + uses.url = true; + }), + async fetch(resource, init2) { + let requested; + if (resource instanceof Request) { + requested = resource.url; + init2 = { + // the request body must be consumed in memory until browsers + // implement streaming request bodies and/or the body getter + body: resource.method === "GET" || resource.method === "HEAD" ? void 0 : await resource.blob(), + cache: resource.cache, + credentials: resource.credentials, + headers: resource.headers, + integrity: resource.integrity, + keepalive: resource.keepalive, + method: resource.method, + mode: resource.mode, + redirect: resource.redirect, + referrer: resource.referrer, + referrerPolicy: resource.referrerPolicy, + signal: resource.signal, + ...init2 + }; + } else { + requested = resource; + } + const resolved = new URL(requested, url); + depends(resolved.href); + if (resolved.origin === url.origin) { + requested = resolved.href.slice(url.origin.length); + } + return started ? subsequent_fetch(requested, resolved.href, init2) : initial_fetch(requested, init2); + }, + setHeaders: () => { + }, + // noop + depends, + parent() { + uses.parent = true; + return parent(); + } + }; + { + data = await node.universal.load.call(null, load_input) ?? null; + } + data = data ? await unwrap_promises(data) : null; + } + return { + node, + loader, + server: server_data_node, + universal: ((_b = node.universal) == null ? void 0 : _b.load) ? { type: "data", data, uses } : null, + data: data ?? (server_data_node == null ? void 0 : server_data_node.data) ?? null, + slash: ((_c = node.universal) == null ? void 0 : _c.trailingSlash) ?? (server_data_node == null ? void 0 : server_data_node.slash) + }; + } + function has_changed(parent_changed, route_changed, url_changed, uses, params) { + if (force_invalidation) + return true; + if (!uses) + return false; + if (uses.parent && parent_changed) + return true; + if (uses.route && route_changed) + return true; + if (uses.url && url_changed) + return true; + for (const param of uses.params) { + if (params[param] !== current.params[param]) + return true; + } + for (const href of uses.dependencies) { + if (invalidated.some((fn) => fn(new URL(href)))) + return true; + } + return false; + } + function create_data_node(node, previous) { + if ((node == null ? void 0 : node.type) === "data") { + return { + type: "data", + data: node.data, + uses: { + dependencies: new Set(node.uses.dependencies ?? []), + params: new Set(node.uses.params ?? []), + parent: !!node.uses.parent, + route: !!node.uses.route, + url: !!node.uses.url + }, + slash: node.slash + }; + } else if ((node == null ? void 0 : node.type) === "skip") { + return previous ?? null; + } + return null; + } + async function load_route({ id, invalidating, url, params, route }) { + if ((load_cache == null ? void 0 : load_cache.id) === id) { + return load_cache.promise; + } + const { errors, layouts, leaf } = route; + const loaders = [...layouts, leaf]; + errors.forEach((loader) => loader == null ? void 0 : loader().catch(() => { + })); + loaders.forEach((loader) => loader == null ? void 0 : loader[1]().catch(() => { + })); + let server_data = null; + const url_changed = current.url ? id !== current.url.pathname + current.url.search : false; + const route_changed = current.route ? route.id !== current.route.id : false; + let parent_invalid = false; + const invalid_server_nodes = loaders.map((loader, i) => { + var _a2; + const previous = current.branch[i]; + const invalid = !!(loader == null ? void 0 : loader[0]) && ((previous == null ? void 0 : previous.loader) !== loader[1] || has_changed(parent_invalid, route_changed, url_changed, (_a2 = previous.server) == null ? void 0 : _a2.uses, params)); + if (invalid) { + parent_invalid = true; + } + return invalid; + }); + if (invalid_server_nodes.some(Boolean)) { + try { + server_data = await load_data(url, invalid_server_nodes); + } catch (error) { + return load_root_error_page({ + status: error instanceof HttpError ? error.status : 500, + error: await handle_error(error, { url, params, route: { id: route.id } }), + url, + route + }); + } + if (server_data.type === "redirect") { + return server_data; + } + } + const server_data_nodes = server_data == null ? void 0 : server_data.nodes; + let parent_changed = false; + const branch_promises = loaders.map(async (loader, i) => { + var _a2; + if (!loader) + return; + const previous = current.branch[i]; + const server_data_node = server_data_nodes == null ? void 0 : server_data_nodes[i]; + const valid = (!server_data_node || server_data_node.type === "skip") && loader[1] === (previous == null ? void 0 : previous.loader) && !has_changed(parent_changed, route_changed, url_changed, (_a2 = previous.universal) == null ? void 0 : _a2.uses, params); + if (valid) + return previous; + parent_changed = true; + if ((server_data_node == null ? void 0 : server_data_node.type) === "error") { + throw server_data_node; + } + return load_node({ + loader: loader[1], + url, + params, + route, + parent: async () => { + var _a3; + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, (_a3 = await branch_promises[j]) == null ? void 0 : _a3.data); + } + return data; + }, + server_data_node: create_data_node( + // server_data_node is undefined if it wasn't reloaded from the server; + // and if current loader uses server data, we want to reuse previous data. + server_data_node === void 0 && loader[0] ? { type: "skip" } : server_data_node ?? null, + loader[0] ? previous == null ? void 0 : previous.server : void 0 + ) + }); + }); + for (const p of branch_promises) + p.catch(() => { + }); + const branch = []; + for (let i = 0; i < loaders.length; i += 1) { + if (loaders[i]) { + try { + branch.push(await branch_promises[i]); + } catch (err) { + if (err instanceof Redirect) { + return { + type: "redirect", + location: err.location + }; + } + let status = 500; + let error; + if (server_data_nodes == null ? void 0 : server_data_nodes.includes( + /** @type {import('types').ServerErrorNode} */ + err + )) { + status = /** @type {import('types').ServerErrorNode} */ + err.status ?? status; + error = /** @type {import('types').ServerErrorNode} */ + err.error; + } else if (err instanceof HttpError) { + status = err.status; + error = err.body; + } else { + const updated = await stores.updated.check(); + if (updated) { + return await native_navigation(url); + } + error = await handle_error(err, { params, url, route: { id: route.id } }); + } + const error_load = await load_nearest_error_page(i, branch, errors); + if (error_load) { + return await get_navigation_result_from_branch({ + url, + params, + branch: branch.slice(0, error_load.idx).concat(error_load.node), + status, + error, + route + }); + } else { + return await server_fallback(url, { id: route.id }, error, status); + } + } + } else { + branch.push(void 0); + } + } + return await get_navigation_result_from_branch({ + url, + params, + branch, + status: 200, + error: null, + route, + // Reset `form` on navigation, but not invalidation + form: invalidating ? void 0 : null + }); + } + async function load_nearest_error_page(i, branch, errors) { + while (i--) { + if (errors[i]) { + let j = i; + while (!branch[j]) + j -= 1; + try { + return { + idx: j + 1, + node: { + node: await /** @type {import('types').CSRPageNodeLoader } */ + errors[i](), + loader: ( + /** @type {import('types').CSRPageNodeLoader } */ + errors[i] + ), + data: {}, + server: null, + universal: null + } + }; + } catch (e) { + continue; + } + } + } + } + async function load_root_error_page({ status, error, url, route }) { + const params = {}; + let server_data_node = null; + const default_layout_has_server_load = server_loads[0] === 0; + if (default_layout_has_server_load) { + try { + const server_data = await load_data(url, [true]); + if (server_data.type !== "data" || server_data.nodes[0] && server_data.nodes[0].type !== "data") { + throw 0; + } + server_data_node = server_data.nodes[0] ?? null; + } catch { + if (url.origin !== location.origin || url.pathname !== location.pathname || hydrated) { + await native_navigation(url); + } + } + } + const root_layout = await load_node({ + loader: default_layout_loader, + url, + params, + route, + parent: () => Promise.resolve({}), + server_data_node: create_data_node(server_data_node) + }); + const root_error = { + node: await default_error_loader(), + loader: default_error_loader, + universal: null, + server: null, + data: null + }; + return await get_navigation_result_from_branch({ + url, + params, + branch: [root_layout, root_error], + status, + error, + route: null + }); + } + function get_navigation_intent(url, invalidating) { + if (is_external_url(url, base)) + return; + const path = get_url_path(url); + for (const route of routes) { + const params = route.exec(path); + if (params) { + const id = url.pathname + url.search; + const intent = { id, invalidating, route, params: decode_params(params), url }; + return intent; + } + } + } + function get_url_path(url) { + return decode_pathname(url.pathname.slice(base.length) || "/"); + } + function before_navigate({ url, type, intent, delta }) { + var _a2, _b; + let should_block = false; + const navigation = { + from: { + params: current.params, + route: { id: ((_a2 = current.route) == null ? void 0 : _a2.id) ?? null }, + url: current.url + }, + to: { + params: (intent == null ? void 0 : intent.params) ?? null, + route: { id: ((_b = intent == null ? void 0 : intent.route) == null ? void 0 : _b.id) ?? null }, + url + }, + willUnload: !intent, + type + }; + if (delta !== void 0) { + navigation.delta = delta; + } + const cancellable = { + ...navigation, + cancel: () => { + should_block = true; + } + }; + if (!navigating) { + callbacks.before_navigate.forEach((fn) => fn(cancellable)); + } + return should_block ? null : navigation; + } + async function navigate({ + url, + scroll: scroll2, + keepfocus, + redirect_chain, + details, + type, + delta, + nav_token, + accepted, + blocked + }) { + const intent = get_navigation_intent(url, false); + const navigation = before_navigate({ url, type, delta, intent }); + if (!navigation) { + blocked(); + return; + } + const previous_history_index = current_history_index; + accepted(); + navigating = true; + if (started) { + stores.navigating.set(navigation); + } + await update( + intent, + url, + redirect_chain, + previous_history_index, + { + scroll: scroll2, + keepfocus, + details + }, + nav_token, + () => { + navigating = false; + callbacks.after_navigate.forEach( + (fn) => fn( + /** @type {import('types').AfterNavigate} */ + navigation + ) + ); + stores.navigating.set(null); + } + ); + } + async function server_fallback(url, route, error, status) { + if (url.origin === location.origin && url.pathname === location.pathname && !hydrated) { + return await load_root_error_page({ + status, + error, + url, + route + }); + } + return await native_navigation(url); + } + function native_navigation(url) { + location.href = url.href; + return new Promise(() => { + }); + } + function setup_preload() { + let mousemove_timeout; + container.addEventListener("mousemove", (event) => { + const target2 = ( + /** @type {Element} */ + event.target + ); + clearTimeout(mousemove_timeout); + mousemove_timeout = setTimeout(() => { + preload2(target2, 2); + }, 20); + }); + function tap(event) { + preload2( + /** @type {Element} */ + event.composedPath()[0], + 1 + ); + } + container.addEventListener("mousedown", tap); + container.addEventListener("touchstart", tap, { passive: true }); + const observer = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + preload_code( + get_url_path(new URL( + /** @type {HTMLAnchorElement} */ + entry.target.href + )) + ); + observer.unobserve(entry.target); + } + } + }, + { threshold: 0 } + ); + function preload2(element2, priority) { + const a = find_anchor(element2, container); + if (!a) + return; + const { url, external } = get_link_info(a, base); + if (external) + return; + const options = get_router_options(a); + if (!options.reload) { + if (priority <= options.preload_data) { + const intent = get_navigation_intent( + /** @type {URL} */ + url, + false + ); + if (intent) { + { + preload_data(intent); + } + } + } else if (priority <= options.preload_code) { + preload_code(get_url_path( + /** @type {URL} */ + url + )); + } + } + } + function after_navigate() { + observer.disconnect(); + for (const a of container.querySelectorAll("a")) { + const { url, external } = get_link_info(a, base); + if (external) + continue; + const options = get_router_options(a); + if (options.reload) + continue; + if (options.preload_code === PRELOAD_PRIORITIES.viewport) { + observer.observe(a); + } + if (options.preload_code === PRELOAD_PRIORITIES.eager) { + preload_code(get_url_path( + /** @type {URL} */ + url + )); + } + } + } + callbacks.after_navigate.push(after_navigate); + after_navigate(); + } + return { + after_navigate: (fn) => { + onMount(() => { + callbacks.after_navigate.push(fn); + return () => { + const i = callbacks.after_navigate.indexOf(fn); + callbacks.after_navigate.splice(i, 1); + }; + }); + }, + before_navigate: (fn) => { + onMount(() => { + callbacks.before_navigate.push(fn); + return () => { + const i = callbacks.before_navigate.indexOf(fn); + callbacks.before_navigate.splice(i, 1); + }; + }); + }, + disable_scroll_handling: () => { + if (updating || !started) { + autoscroll = false; + } + }, + goto: (href, opts = {}) => { + return goto(href, opts, []); + }, + invalidate: (resource) => { + if (typeof resource === "function") { + invalidated.push(resource); + } else { + const { href } = new URL(resource, location.href); + invalidated.push((url) => url.href === href); + } + return invalidate(); + }, + invalidateAll: () => { + force_invalidation = true; + return invalidate(); + }, + preload_data: async (href) => { + const url = new URL(href, get_base_uri(document)); + const intent = get_navigation_intent(url, false); + if (!intent) { + throw new Error(`Attempted to preload a URL that does not belong to this app: ${url}`); + } + await preload_data(intent); + }, + preload_code, + apply_action: async (result) => { + if (result.type === "error") { + const url = new URL(location.href); + const { branch, route } = current; + if (!route) + return; + const error_load = await load_nearest_error_page( + current.branch.length, + branch, + route.errors + ); + if (error_load) { + const navigation_result = await get_navigation_result_from_branch({ + url, + params: current.params, + branch: branch.slice(0, error_load.idx).concat(error_load.node), + status: result.status ?? 500, + error: result.error, + route + }); + current = navigation_result.state; + root.$set(navigation_result.props); + tick().then(reset_focus); + } + } else if (result.type === "redirect") { + goto(result.location, { invalidateAll: true }, []); + } else { + const props = { + form: result.data, + page: { ...page, form: result.data, status: result.status } + }; + root.$set(props); + if (result.type === "success") { + tick().then(reset_focus); + } + } + }, + _start_router: () => { + var _a2; + history.scrollRestoration = "manual"; + addEventListener("beforeunload", (e) => { + var _a3; + let should_block = false; + if (!navigating) { + const navigation = { + from: { + params: current.params, + route: { id: ((_a3 = current.route) == null ? void 0 : _a3.id) ?? null }, + url: current.url + }, + to: null, + willUnload: true, + type: "leave", + cancel: () => should_block = true + }; + callbacks.before_navigate.forEach((fn) => fn(navigation)); + } + if (should_block) { + e.preventDefault(); + e.returnValue = ""; + } else { + history.scrollRestoration = "auto"; + } + }); + addEventListener("visibilitychange", () => { + if (document.visibilityState === "hidden") { + update_scroll_positions(current_history_index); + set(SCROLL_KEY, scroll_positions); + capture_snapshot(current_history_index); + set(SNAPSHOT_KEY, snapshots); + } + }); + if (!((_a2 = navigator.connection) == null ? void 0 : _a2.saveData)) { + setup_preload(); + } + container.addEventListener("click", (event) => { + if (event.button || event.which !== 1) + return; + if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) + return; + if (event.defaultPrevented) + return; + const a = find_anchor( + /** @type {Element} */ + event.composedPath()[0], + container + ); + if (!a) + return; + const { url, external, target: target2 } = get_link_info(a, base); + if (!url) + return; + if (target2 === "_parent" || target2 === "_top") { + if (window.parent !== window) + return; + } else if (target2 && target2 !== "_self") { + return; + } + const options = get_router_options(a); + const is_svg_a_element = a instanceof SVGAElement; + if (!is_svg_a_element && url.protocol !== location.protocol && !(url.protocol === "https:" || url.protocol === "http:")) + return; + if (external || options.reload) { + const navigation = before_navigate({ url, type: "link" }); + if (!navigation) { + event.preventDefault(); + } + navigating = true; + return; + } + const [nonhash, hash2] = url.href.split("#"); + if (hash2 !== void 0 && nonhash === location.href.split("#")[0]) { + hash_navigating = true; + update_scroll_positions(current_history_index); + current.url = url; + stores.page.set({ ...page, url }); + stores.page.notify(); + return; + } + navigate({ + url, + scroll: options.noscroll ? scroll_state() : null, + keepfocus: false, + redirect_chain: [], + details: { + state: {}, + replaceState: url.href === location.href + }, + accepted: () => event.preventDefault(), + blocked: () => event.preventDefault(), + type: "link" + }); + }); + container.addEventListener("submit", (event) => { + if (event.defaultPrevented) + return; + const form = ( + /** @type {HTMLFormElement} */ + HTMLFormElement.prototype.cloneNode.call(event.target) + ); + const submitter = ( + /** @type {HTMLButtonElement | HTMLInputElement | null} */ + event.submitter + ); + const method = (submitter == null ? void 0 : submitter.formMethod) || form.method; + if (method !== "get") + return; + const url = new URL( + (submitter == null ? void 0 : submitter.hasAttribute("formaction")) && (submitter == null ? void 0 : submitter.formAction) || form.action + ); + if (is_external_url(url, base)) + return; + const event_form = ( + /** @type {HTMLFormElement} */ + event.target + ); + const { noscroll, reload } = get_router_options(event_form); + if (reload) + return; + event.preventDefault(); + event.stopPropagation(); + const data = new FormData(event_form); + const submitter_name = submitter == null ? void 0 : submitter.getAttribute("name"); + if (submitter_name) { + data.append(submitter_name, (submitter == null ? void 0 : submitter.getAttribute("value")) ?? ""); + } + url.search = new URLSearchParams(data).toString(); + navigate({ + url, + scroll: noscroll ? scroll_state() : null, + keepfocus: false, + redirect_chain: [], + details: { + state: {}, + replaceState: false + }, + nav_token: {}, + accepted: () => { + }, + blocked: () => { + }, + type: "form" + }); + }); + addEventListener("popstate", async (event) => { + var _a3; + if ((_a3 = event.state) == null ? void 0 : _a3[INDEX_KEY]) { + if (event.state[INDEX_KEY] === current_history_index) + return; + const scroll2 = scroll_positions[event.state[INDEX_KEY]]; + if (current.url.href.split("#")[0] === location.href.split("#")[0]) { + scroll_positions[current_history_index] = scroll_state(); + current_history_index = event.state[INDEX_KEY]; + scrollTo(scroll2.x, scroll2.y); + return; + } + const delta = event.state[INDEX_KEY] - current_history_index; + let blocked = false; + await navigate({ + url: new URL(location.href), + scroll: scroll2, + keepfocus: false, + redirect_chain: [], + details: null, + accepted: () => { + current_history_index = event.state[INDEX_KEY]; + }, + blocked: () => { + history.go(-delta); + blocked = true; + }, + type: "popstate", + delta + }); + if (!blocked) { + restore_snapshot(current_history_index); + } + } + }); + addEventListener("hashchange", () => { + if (hash_navigating) { + hash_navigating = false; + history.replaceState( + { ...history.state, [INDEX_KEY]: ++current_history_index }, + "", + location.href + ); + } + }); + for (const link of document.querySelectorAll("link")) { + if (link.rel === "icon") + link.href = link.href; + } + addEventListener("pageshow", (event) => { + if (event.persisted) { + stores.navigating.set(null); + } + }); + }, + _hydrate: async ({ + status = 200, + error, + node_ids, + params, + route, + data: server_data_nodes, + form + }) => { + hydrated = true; + const url = new URL(location.href); + { + ({ params = {}, route = { id: null } } = get_navigation_intent(url, false) || {}); + } + let result; + try { + const branch_promises = node_ids.map(async (n, i) => { + const server_data_node = server_data_nodes[i]; + return load_node({ + loader: nodes[n], + url, + params, + route, + parent: async () => { + const data = {}; + for (let j = 0; j < i; j += 1) { + Object.assign(data, (await branch_promises[j]).data); + } + return data; + }, + server_data_node: create_data_node(server_data_node) + }); + }); + result = await get_navigation_result_from_branch({ + url, + params, + branch: await Promise.all(branch_promises), + status, + error, + form, + route: routes.find(({ id }) => id === route.id) ?? null + }); + } catch (error2) { + if (error2 instanceof Redirect) { + await native_navigation(new URL(error2.location, location.href)); + return; + } + result = await load_root_error_page({ + status: error2 instanceof HttpError ? error2.status : 500, + error: await handle_error(error2, { url, params, route }), + url, + route + }); + } + initialize(result); + } + }; +} +async function load_data(url, invalid) { + var _a; + const data_url = new URL(url); + data_url.pathname = add_data_suffix(url.pathname); + data_url.searchParams.append( + "x-sveltekit-invalidated", + invalid.map((x) => x ? "1" : "").join("_") + ); + const res = await native_fetch(data_url.href); + const data = await res.json(); + if (!res.ok) { + throw new HttpError(res.status, data); + } + (_a = data.nodes) == null ? void 0 : _a.forEach((node) => { + if ((node == null ? void 0 : node.type) === "data") { + node.data = unflatten(node.data); + node.uses = { + dependencies: new Set(node.uses.dependencies ?? []), + params: new Set(node.uses.params ?? []), + parent: !!node.uses.parent, + route: !!node.uses.route, + url: !!node.uses.url + }; + } + }); + return data; +} +function handle_error(error, event) { + if (error instanceof HttpError) { + return error.body; + } + return hooks.handleError({ error, event }) ?? /** @type {any} */ + { message: event.route.id != null ? "Internal Error" : "Not Found" }; +} +function reset_focus() { + const autofocus = document.querySelector("[autofocus]"); + if (autofocus) { + autofocus.focus(); + } else { + const root = document.body; + const tabindex = root.getAttribute("tabindex"); + root.tabIndex = -1; + root.focus({ preventScroll: true }); + if (tabindex !== null) { + root.setAttribute("tabindex", tabindex); + } else { + root.removeAttribute("tabindex"); + } + return new Promise((resolve) => { + setTimeout(() => { + var _a; + resolve((_a = getSelection()) == null ? void 0 : _a.removeAllRanges()); + }); + }); + } +} +async function start({ assets, env, hydrate, target, version }) { + set_assets(assets); + set_version(version); + const client = create_client({ + target + }); + init$1({ client }); + if (hydrate) { + await client._hydrate(hydrate); + } else { + client.goto(location.href, { replaceState: true }); + } + client._start_router(); +} +export { + start +}; diff --git a/examples/electron-app/src/_app/version.json b/examples/electron-app/src/_app/version.json new file mode 100644 index 0000000..645515e --- /dev/null +++ b/examples/electron-app/src/_app/version.json @@ -0,0 +1 @@ +{"version":"1676135993796"} \ No newline at end of file diff --git a/examples/electron-app/src/about.html b/examples/electron-app/src/about.html new file mode 100644 index 0000000..1924aea --- /dev/null +++ b/examples/electron-app/src/about.html @@ -0,0 +1,49 @@ + + + + + + + + About + + +
+ + +
SvelteKit
+ + + +
GitHub
+
+ +
+ +

About this app

+ +

This is a SvelteKit app. You can make your own by typing the + following into your command line and following the prompts: +

+ +
npm create svelte@latest
+ +

The page you're looking at is purely static HTML, with no client-side interactivity needed. + Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening + the devtools network panel and reloading. +

+ +

The Sverdle page illustrates SvelteKit's data loading and form handling. Try + using it with JavaScript disabled! +

+ + +
+ +
+ + diff --git a/examples/electron-app/src/favicon.png b/examples/electron-app/src/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/examples/electron-app/src/favicon.png differ diff --git a/examples/electron-app/src/index.html b/examples/electron-app/src/index.html new file mode 100644 index 0000000..1c65c32 --- /dev/null +++ b/examples/electron-app/src/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + Home + + +
+ + +
SvelteKit
+ + + +
GitHub
+
+ +
+ +

+ Welcome + + to your new
SvelteKit app +

+ +

try editing src/routes/+page.svelte

+ +
+ +
+ 0
+ + +
+
+ + +
+ + + +
+ + diff --git a/examples/electron-app/src/index.js b/examples/electron-app/src/index.js new file mode 100644 index 0000000..f581a1a --- /dev/null +++ b/examples/electron-app/src/index.js @@ -0,0 +1,49 @@ +const { app, BrowserWindow } = require('electron'); +const path = require('path'); + +// Handle creating/removing shortcuts on Windows when installing/uninstalling. +if (require('electron-squirrel-startup')) { + app.quit(); +} + +const createWindow = () => { + // Create the browser window. + const mainWindow = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + }, + }); + + // and load the index.html of the app. + mainWindow.loadFile(path.join(__dirname, 'index.html')); + + // Open the DevTools. + mainWindow.webContents.openDevTools(); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and import them here. diff --git a/examples/electron-app/src/preload.js b/examples/electron-app/src/preload.js new file mode 100644 index 0000000..5e9d369 --- /dev/null +++ b/examples/electron-app/src/preload.js @@ -0,0 +1,2 @@ +// See the Electron documentation for details on how to use preload scripts: +// https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts diff --git a/examples/electron-app/src/robots.txt b/examples/electron-app/src/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/electron-app/src/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/electron-app/src/sverdle/how-to-play.html b/examples/electron-app/src/sverdle/how-to-play.html new file mode 100644 index 0000000..0251c4e --- /dev/null +++ b/examples/electron-app/src/sverdle/how-to-play.html @@ -0,0 +1,65 @@ + + + + + + + + + How to play Sverdle + + +
+ + +
SvelteKit
+ + + +
GitHub
+
+ +
+ +

How to play Sverdle

+ +

Sverdle is a clone of Wordle, the + word guessing game. To play, enter a five-letter English word. For example: +

+ +
r + i + t + z + y
+ +

The y is in the right place. r and + t + are the right letters, but in the wrong place. The other letters are wrong, and can be discarded. + Let's make another guess: +

+ +
p + a + r + t + y
+ +

This time we guessed right! You have six guesses to get the word.

+ +

Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it + impossible to cheat. It uses <form> and cookies to submit data, meaning you can + even play with JavaScript disabled! +

+
+ + +
+ +
+ + diff --git a/examples/sveltekit-app/.eslintignore b/examples/sveltekit-app/.eslintignore new file mode 100644 index 0000000..3897265 --- /dev/null +++ b/examples/sveltekit-app/.eslintignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/examples/sveltekit-app/.eslintrc.cjs b/examples/sveltekit-app/.eslintrc.cjs new file mode 100644 index 0000000..3ccf435 --- /dev/null +++ b/examples/sveltekit-app/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], + plugins: ['svelte3', '@typescript-eslint'], + ignorePatterns: ['*.cjs'], + overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], + settings: { + 'svelte3/typescript': () => require('typescript') + }, + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020 + }, + env: { + browser: true, + es2017: true, + node: true + } +}; diff --git a/examples/sveltekit-app/.gitignore b/examples/sveltekit-app/.gitignore new file mode 100644 index 0000000..8f6c617 --- /dev/null +++ b/examples/sveltekit-app/.gitignore @@ -0,0 +1,12 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +.vercel +.output +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/examples/sveltekit-app/.npmrc b/examples/sveltekit-app/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/examples/sveltekit-app/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/examples/sveltekit-app/.prettierignore b/examples/sveltekit-app/.prettierignore new file mode 100644 index 0000000..3897265 --- /dev/null +++ b/examples/sveltekit-app/.prettierignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/examples/sveltekit-app/.prettierrc b/examples/sveltekit-app/.prettierrc new file mode 100644 index 0000000..a77fdde --- /dev/null +++ b/examples/sveltekit-app/.prettierrc @@ -0,0 +1,9 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "pluginSearchDirs": ["."], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/examples/sveltekit-app/README.md b/examples/sveltekit-app/README.md new file mode 100644 index 0000000..5c91169 --- /dev/null +++ b/examples/sveltekit-app/README.md @@ -0,0 +1,38 @@ +# create-svelte + +Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npm create svelte@latest + +# create a new project in my-app +npm create svelte@latest my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. diff --git a/examples/sveltekit-app/package.json b/examples/sveltekit-app/package.json new file mode 100644 index 0000000..a5a6668 --- /dev/null +++ b/examples/sveltekit-app/package.json @@ -0,0 +1,34 @@ +{ + "name": "sveltekit-app", + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --plugin-search-dir . --check . && eslint .", + "format": "prettier --plugin-search-dir . --write ." + }, + "devDependencies": { + "@fontsource/fira-mono": "^4.5.10", + "@neoconfetti/svelte": "^1.0.0", + "@ptkdev/sveltekit-electron-adapter": "latest", + "@sveltejs/adapter-auto": "^2.0.0", + "@sveltejs/kit": "^1.5.0", + "@types/cookie": "^0.5.1", + "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/parser": "^5.45.0", + "eslint": "^8.28.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-svelte3": "^4.0.0", + "prettier": "^2.8.0", + "prettier-plugin-svelte": "^2.8.1", + "svelte": "^3.54.0", + "svelte-check": "^3.0.1", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "vite": "^4.0.0" + }, + "type": "module" +} diff --git a/examples/sveltekit-app/src/app.d.ts b/examples/sveltekit-app/src/app.d.ts new file mode 100644 index 0000000..f59b884 --- /dev/null +++ b/examples/sveltekit-app/src/app.d.ts @@ -0,0 +1,12 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface Platform {} + } +} + +export {}; diff --git a/examples/sveltekit-app/src/app.html b/examples/sveltekit-app/src/app.html new file mode 100644 index 0000000..effe0d0 --- /dev/null +++ b/examples/sveltekit-app/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/examples/sveltekit-app/src/lib/images/github.svg b/examples/sveltekit-app/src/lib/images/github.svg new file mode 100644 index 0000000..bc5d249 --- /dev/null +++ b/examples/sveltekit-app/src/lib/images/github.svg @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/examples/sveltekit-app/src/lib/images/svelte-logo.svg b/examples/sveltekit-app/src/lib/images/svelte-logo.svg new file mode 100644 index 0000000..49492a8 --- /dev/null +++ b/examples/sveltekit-app/src/lib/images/svelte-logo.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/examples/sveltekit-app/src/lib/images/svelte-welcome.png b/examples/sveltekit-app/src/lib/images/svelte-welcome.png new file mode 100644 index 0000000..fe7d2d6 Binary files /dev/null and b/examples/sveltekit-app/src/lib/images/svelte-welcome.png differ diff --git a/examples/sveltekit-app/src/lib/images/svelte-welcome.webp b/examples/sveltekit-app/src/lib/images/svelte-welcome.webp new file mode 100644 index 0000000..6ec1a28 Binary files /dev/null and b/examples/sveltekit-app/src/lib/images/svelte-welcome.webp differ diff --git a/examples/sveltekit-app/src/routes/+layout.svelte b/examples/sveltekit-app/src/routes/+layout.svelte new file mode 100644 index 0000000..9c7445f --- /dev/null +++ b/examples/sveltekit-app/src/routes/+layout.svelte @@ -0,0 +1,53 @@ + + +
+
+ +
+ +
+ + +
+ + diff --git a/examples/sveltekit-app/src/routes/+page.svelte b/examples/sveltekit-app/src/routes/+page.svelte new file mode 100644 index 0000000..97201ef --- /dev/null +++ b/examples/sveltekit-app/src/routes/+page.svelte @@ -0,0 +1,59 @@ + + + + Home + + + +
+

+ + + + Welcome + + + + to your new
SvelteKit app +

+ +

+ try editing src/routes/+page.svelte +

+ + +
+ + diff --git a/examples/sveltekit-app/src/routes/+page.ts b/examples/sveltekit-app/src/routes/+page.ts new file mode 100644 index 0000000..a72419a --- /dev/null +++ b/examples/sveltekit-app/src/routes/+page.ts @@ -0,0 +1,3 @@ +// since there's no dynamic data here, we can prerender +// it so that it gets served as a static asset in production +export const prerender = true; diff --git a/examples/sveltekit-app/src/routes/Counter.svelte b/examples/sveltekit-app/src/routes/Counter.svelte new file mode 100644 index 0000000..96ef556 --- /dev/null +++ b/examples/sveltekit-app/src/routes/Counter.svelte @@ -0,0 +1,102 @@ + + +
+ + +
+
+ + {Math.floor($displayed_count)} +
+
+ + +
+ + diff --git a/examples/sveltekit-app/src/routes/Header.svelte b/examples/sveltekit-app/src/routes/Header.svelte new file mode 100644 index 0000000..368b721 --- /dev/null +++ b/examples/sveltekit-app/src/routes/Header.svelte @@ -0,0 +1,129 @@ + + +
+
+ + SvelteKit + +
+ + + +
+ + GitHub + +
+
+ + diff --git a/examples/sveltekit-app/src/routes/about/+page.svelte b/examples/sveltekit-app/src/routes/about/+page.svelte new file mode 100644 index 0000000..7f7946d --- /dev/null +++ b/examples/sveltekit-app/src/routes/about/+page.svelte @@ -0,0 +1,26 @@ + + About + + + +
+

About this app

+ +

+ This is a SvelteKit app. You can make your own by typing the + following into your command line and following the prompts: +

+ +
npm create svelte@latest
+ +

+ The page you're looking at is purely static HTML, with no client-side interactivity needed. + Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening + the devtools network panel and reloading. +

+ +

+ The Sverdle page illustrates SvelteKit's data loading and form handling. Try + using it with JavaScript disabled! +

+
diff --git a/examples/sveltekit-app/src/routes/about/+page.ts b/examples/sveltekit-app/src/routes/about/+page.ts new file mode 100644 index 0000000..e739ef4 --- /dev/null +++ b/examples/sveltekit-app/src/routes/about/+page.ts @@ -0,0 +1,9 @@ +import { dev } from '$app/environment'; + +// we don't need any JS on this page, though we'll load +// it in dev so that we get hot module replacement +export const csr = dev; + +// since there's no dynamic data here, we can prerender +// it so that it gets served as a static asset in production +export const prerender = true; diff --git a/examples/sveltekit-app/src/routes/styles.css b/examples/sveltekit-app/src/routes/styles.css new file mode 100644 index 0000000..1441d94 --- /dev/null +++ b/examples/sveltekit-app/src/routes/styles.css @@ -0,0 +1,107 @@ +@import '@fontsource/fira-mono'; + +:root { + --font-body: Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, + Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + --font-mono: 'Fira Mono', monospace; + --color-bg-0: rgb(202, 216, 228); + --color-bg-1: hsl(209, 36%, 86%); + --color-bg-2: hsl(224, 44%, 95%); + --color-theme-1: #ff3e00; + --color-theme-2: #4075a6; + --color-text: rgba(0, 0, 0, 0.7); + --column-width: 42rem; + --column-margin-top: 4rem; + font-family: var(--font-body); + color: var(--color-text); +} + +body { + min-height: 100vh; + margin: 0; + background-attachment: fixed; + background-color: var(--color-bg-1); + background-size: 100vw 100vh; + background-image: radial-gradient( + 50% 50% at 50% 50%, + rgba(255, 255, 255, 0.75) 0%, + rgba(255, 255, 255, 0) 100% + ), + linear-gradient(180deg, var(--color-bg-0) 0%, var(--color-bg-1) 15%, var(--color-bg-2) 50%); +} + +h1, +h2, +p { + font-weight: 400; +} + +p { + line-height: 1.5; +} + +a { + color: var(--color-theme-1); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1 { + font-size: 2rem; + text-align: center; +} + +h2 { + font-size: 1rem; +} + +pre { + font-size: 16px; + font-family: var(--font-mono); + background-color: rgba(255, 255, 255, 0.45); + border-radius: 3px; + box-shadow: 2px 2px 6px rgb(255 255 255 / 25%); + padding: 0.5em; + overflow-x: auto; + color: var(--color-text); +} + +.text-column { + display: flex; + max-width: 48rem; + flex: 0.6; + flex-direction: column; + justify-content: center; + margin: 0 auto; +} + +input, +button { + font-size: inherit; + font-family: inherit; +} + +button:focus:not(:focus-visible) { + outline: none; +} + +@media (min-width: 720px) { + h1 { + font-size: 2.4rem; + } +} + +.visually-hidden { + border: 0; + clip: rect(0 0 0 0); + height: auto; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; + white-space: nowrap; +} diff --git a/examples/sveltekit-app/src/routes/sverdle/+page.server.ts b/examples/sveltekit-app/src/routes/sverdle/+page.server.ts new file mode 100644 index 0000000..113afaf --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/+page.server.ts @@ -0,0 +1,69 @@ +import { fail } from '@sveltejs/kit'; +import { Game } from './game'; +import type { PageServerLoad, Actions } from './$types'; + +export const load = (({ cookies }) => { + const game = new Game(cookies.get('sverdle')); + + return { + /** + * The player's guessed words so far + */ + guesses: game.guesses, + + /** + * An array of strings like '__x_c' corresponding to the guesses, where 'x' means + * an exact match, and 'c' means a close match (right letter, wrong place) + */ + answers: game.answers, + + /** + * The correct answer, revealed if the game is over + */ + answer: game.answers.length >= 6 ? game.answer : null + }; +}) satisfies PageServerLoad; + +export const actions = { + /** + * Modify game state in reaction to a keypress. If client-side JavaScript + * is available, this will happen in the browser instead of here + */ + update: async ({ request, cookies }) => { + const game = new Game(cookies.get('sverdle')); + + const data = await request.formData(); + const key = data.get('key'); + + const i = game.answers.length; + + if (key === 'backspace') { + game.guesses[i] = game.guesses[i].slice(0, -1); + } else { + game.guesses[i] += key; + } + + cookies.set('sverdle', game.toString()); + }, + + /** + * Modify game state in reaction to a guessed word. This logic always runs on + * the server, so that people can't cheat by peeking at the JavaScript + */ + enter: async ({ request, cookies }) => { + const game = new Game(cookies.get('sverdle')); + + const data = await request.formData(); + const guess = data.getAll('guess') as string[]; + + if (!game.enter(guess)) { + return fail(400, { badGuess: true }); + } + + cookies.set('sverdle', game.toString()); + }, + + restart: async ({ cookies }) => { + cookies.delete('sverdle'); + } +} satisfies Actions; diff --git a/examples/sveltekit-app/src/routes/sverdle/+page.svelte b/examples/sveltekit-app/src/routes/sverdle/+page.svelte new file mode 100644 index 0000000..157d8e4 --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/+page.svelte @@ -0,0 +1,406 @@ + + + + + + Sverdle + + + +

Sverdle

+ + { + // prevent default callback from resetting the form + return ({ update }) => { + update({ reset: false }); + }; + }} +> + How to play + +
+ {#each Array(6) as _, row} + {@const current = row === i} +

Row {row + 1}

+
+ {#each Array(5) as _, column} + {@const answer = data.answers[row]?.[column]} + {@const value = data.guesses[row]?.[column] ?? ''} + {@const selected = current && column === data.guesses[row].length} + {@const exact = answer === 'x'} + {@const close = answer === 'c'} + {@const missing = answer === '_'} +
+ {value} + + {#if exact} + (correct) + {:else if close} + (present) + {:else if missing} + (absent) + {:else} + empty + {/if} + + +
+ {/each} +
+ {/each} +
+ +
+ {#if won || data.answers.length >= 6} + {#if !won && data.answer} +

the answer was "{data.answer}"

+ {/if} + + {:else} +
+ + + + + {#each ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'] as row} +
+ {#each row as letter} + + {/each} +
+ {/each} +
+ {/if} +
+ + +{#if won} +
+{/if} + + diff --git a/examples/sveltekit-app/src/routes/sverdle/game.ts b/examples/sveltekit-app/src/routes/sverdle/game.ts new file mode 100644 index 0000000..72aef85 --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/game.ts @@ -0,0 +1,75 @@ +import { words, allowed } from './words.server'; + +export class Game { + index: number; + guesses: string[]; + answers: string[]; + answer: string; + + /** + * Create a game object from the player's cookie, or initialise a new game + */ + constructor(serialized: string | undefined = undefined) { + if (serialized) { + const [index, guesses, answers] = serialized.split('-'); + + this.index = +index; + this.guesses = guesses ? guesses.split(' ') : []; + this.answers = answers ? answers.split(' ') : []; + } else { + this.index = Math.floor(Math.random() * words.length); + this.guesses = ['', '', '', '', '', '']; + this.answers = []; + } + + this.answer = words[this.index]; + } + + /** + * Update game state based on a guess of a five-letter word. Returns + * true if the guess was valid, false otherwise + */ + enter(letters: string[]) { + const word = letters.join(''); + const valid = allowed.has(word); + + if (!valid) return false; + + this.guesses[this.answers.length] = word; + + const available = Array.from(this.answer); + const answer = Array(5).fill('_'); + + // first, find exact matches + for (let i = 0; i < 5; i += 1) { + if (letters[i] === available[i]) { + answer[i] = 'x'; + available[i] = ' '; + } + } + + // then find close matches (this has to happen + // in a second step, otherwise an early close + // match can prevent a later exact match) + for (let i = 0; i < 5; i += 1) { + if (answer[i] === '_') { + const index = available.indexOf(letters[i]); + if (index !== -1) { + answer[i] = 'c'; + available[index] = ' '; + } + } + } + + this.answers.push(answer.join('')); + + return true; + } + + /** + * Serialize game state so it can be set as a cookie + */ + toString() { + return `${this.index}-${this.guesses.join(' ')}-${this.answers.join(' ')}`; + } +} diff --git a/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.svelte b/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.svelte new file mode 100644 index 0000000..e8e2cec --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.svelte @@ -0,0 +1,95 @@ + + How to play Sverdle + + + +
+

How to play Sverdle

+ +

+ Sverdle is a clone of Wordle, the + word guessing game. To play, enter a five-letter English word. For example: +

+ +
+ r + i + t + z + y +
+ +

+ The y is in the right place. r and + t + are the right letters, but in the wrong place. The other letters are wrong, and can be discarded. + Let's make another guess: +

+ +
+ p + a + r + t + y +
+ +

This time we guessed right! You have six guesses to get the word.

+ +

+ Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it + impossible to cheat. It uses <form> and cookies to submit data, meaning you can + even play with JavaScript disabled! +

+
+ + diff --git a/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.ts b/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.ts new file mode 100644 index 0000000..e739ef4 --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/how-to-play/+page.ts @@ -0,0 +1,9 @@ +import { dev } from '$app/environment'; + +// we don't need any JS on this page, though we'll load +// it in dev so that we get hot module replacement +export const csr = dev; + +// since there's no dynamic data here, we can prerender +// it so that it gets served as a static asset in production +export const prerender = true; diff --git a/examples/sveltekit-app/src/routes/sverdle/reduced-motion.ts b/examples/sveltekit-app/src/routes/sverdle/reduced-motion.ts new file mode 100644 index 0000000..7a4e95e --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/reduced-motion.ts @@ -0,0 +1,23 @@ +import { readable } from 'svelte/store'; +import { browser } from '$app/environment'; + +const reduced_motion_query = '(prefers-reduced-motion: reduce)'; + +const get_initial_motion_preference = () => { + if (!browser) return false; + return window.matchMedia(reduced_motion_query).matches; +}; + +export const reduced_motion = readable(get_initial_motion_preference(), (set) => { + if (browser) { + const set_reduced_motion = (event: MediaQueryListEvent) => { + set(event.matches); + }; + const media_query_list = window.matchMedia(reduced_motion_query); + media_query_list.addEventListener('change', set_reduced_motion); + + return () => { + media_query_list.removeEventListener('change', set_reduced_motion); + }; + } +}); diff --git a/examples/sveltekit-app/src/routes/sverdle/words.server.ts b/examples/sveltekit-app/src/routes/sverdle/words.server.ts new file mode 100644 index 0000000..56082a3 --- /dev/null +++ b/examples/sveltekit-app/src/routes/sverdle/words.server.ts @@ -0,0 +1,12980 @@ +/** The list of possible words */ +export const words = [ + 'aback', + 'abase', + 'abate', + 'abbey', + 'abbot', + 'abhor', + 'abide', + 'abled', + 'abode', + 'abort', + 'about', + 'above', + 'abuse', + 'abyss', + 'acorn', + 'acrid', + 'actor', + 'acute', + 'adage', + 'adapt', + 'adept', + 'admin', + 'admit', + 'adobe', + 'adopt', + 'adore', + 'adorn', + 'adult', + 'affix', + 'afire', + 'afoot', + 'afoul', + 'after', + 'again', + 'agape', + 'agate', + 'agent', + 'agile', + 'aging', + 'aglow', + 'agony', + 'agora', + 'agree', + 'ahead', + 'aider', + 'aisle', + 'alarm', + 'album', + 'alert', + 'algae', + 'alibi', + 'alien', + 'align', + 'alike', + 'alive', + 'allay', + 'alley', + 'allot', + 'allow', + 'alloy', + 'aloft', + 'alone', + 'along', + 'aloof', + 'aloud', + 'alpha', + 'altar', + 'alter', + 'amass', + 'amaze', + 'amber', + 'amble', + 'amend', + 'amiss', + 'amity', + 'among', + 'ample', + 'amply', + 'amuse', + 'angel', + 'anger', + 'angle', + 'angry', + 'angst', + 'anime', + 'ankle', + 'annex', + 'annoy', + 'annul', + 'anode', + 'antic', + 'anvil', + 'aorta', + 'apart', + 'aphid', + 'aping', + 'apnea', + 'apple', + 'apply', + 'apron', + 'aptly', + 'arbor', + 'ardor', + 'arena', + 'argue', + 'arise', + 'armor', + 'aroma', + 'arose', + 'array', + 'arrow', + 'arson', + 'artsy', + 'ascot', + 'ashen', + 'aside', + 'askew', + 'assay', + 'asset', + 'atoll', + 'atone', + 'attic', + 'audio', + 'audit', + 'augur', + 'aunty', + 'avail', + 'avert', + 'avian', + 'avoid', + 'await', + 'awake', + 'award', + 'aware', + 'awash', + 'awful', + 'awoke', + 'axial', + 'axiom', + 'axion', + 'azure', + 'bacon', + 'badge', + 'badly', + 'bagel', + 'baggy', + 'baker', + 'baler', + 'balmy', + 'banal', + 'banjo', + 'barge', + 'baron', + 'basal', + 'basic', + 'basil', + 'basin', + 'basis', + 'baste', + 'batch', + 'bathe', + 'baton', + 'batty', + 'bawdy', + 'bayou', + 'beach', + 'beady', + 'beard', + 'beast', + 'beech', + 'beefy', + 'befit', + 'began', + 'begat', + 'beget', + 'begin', + 'begun', + 'being', + 'belch', + 'belie', + 'belle', + 'belly', + 'below', + 'bench', + 'beret', + 'berry', + 'berth', + 'beset', + 'betel', + 'bevel', + 'bezel', + 'bible', + 'bicep', + 'biddy', + 'bigot', + 'bilge', + 'billy', + 'binge', + 'bingo', + 'biome', + 'birch', + 'birth', + 'bison', + 'bitty', + 'black', + 'blade', + 'blame', + 'bland', + 'blank', + 'blare', + 'blast', + 'blaze', + 'bleak', + 'bleat', + 'bleed', + 'bleep', + 'blend', + 'bless', + 'blimp', + 'blind', + 'blink', + 'bliss', + 'blitz', + 'bloat', + 'block', + 'bloke', + 'blond', + 'blood', + 'bloom', + 'blown', + 'bluer', + 'bluff', + 'blunt', + 'blurb', + 'blurt', + 'blush', + 'board', + 'boast', + 'bobby', + 'boney', + 'bongo', + 'bonus', + 'booby', + 'boost', + 'booth', + 'booty', + 'booze', + 'boozy', + 'borax', + 'borne', + 'bosom', + 'bossy', + 'botch', + 'bough', + 'boule', + 'bound', + 'bowel', + 'boxer', + 'brace', + 'braid', + 'brain', + 'brake', + 'brand', + 'brash', + 'brass', + 'brave', + 'bravo', + 'brawl', + 'brawn', + 'bread', + 'break', + 'breed', + 'briar', + 'bribe', + 'brick', + 'bride', + 'brief', + 'brine', + 'bring', + 'brink', + 'briny', + 'brisk', + 'broad', + 'broil', + 'broke', + 'brood', + 'brook', + 'broom', + 'broth', + 'brown', + 'brunt', + 'brush', + 'brute', + 'buddy', + 'budge', + 'buggy', + 'bugle', + 'build', + 'built', + 'bulge', + 'bulky', + 'bully', + 'bunch', + 'bunny', + 'burly', + 'burnt', + 'burst', + 'bused', + 'bushy', + 'butch', + 'butte', + 'buxom', + 'buyer', + 'bylaw', + 'cabal', + 'cabby', + 'cabin', + 'cable', + 'cacao', + 'cache', + 'cacti', + 'caddy', + 'cadet', + 'cagey', + 'cairn', + 'camel', + 'cameo', + 'canal', + 'candy', + 'canny', + 'canoe', + 'canon', + 'caper', + 'caput', + 'carat', + 'cargo', + 'carol', + 'carry', + 'carve', + 'caste', + 'catch', + 'cater', + 'catty', + 'caulk', + 'cause', + 'cavil', + 'cease', + 'cedar', + 'cello', + 'chafe', + 'chaff', + 'chain', + 'chair', + 'chalk', + 'champ', + 'chant', + 'chaos', + 'chard', + 'charm', + 'chart', + 'chase', + 'chasm', + 'cheap', + 'cheat', + 'check', + 'cheek', + 'cheer', + 'chess', + 'chest', + 'chick', + 'chide', + 'chief', + 'child', + 'chili', + 'chill', + 'chime', + 'china', + 'chirp', + 'chock', + 'choir', + 'choke', + 'chord', + 'chore', + 'chose', + 'chuck', + 'chump', + 'chunk', + 'churn', + 'chute', + 'cider', + 'cigar', + 'cinch', + 'circa', + 'civic', + 'civil', + 'clack', + 'claim', + 'clamp', + 'clang', + 'clank', + 'clash', + 'clasp', + 'class', + 'clean', + 'clear', + 'cleat', + 'cleft', + 'clerk', + 'click', + 'cliff', + 'climb', + 'cling', + 'clink', + 'cloak', + 'clock', + 'clone', + 'close', + 'cloth', + 'cloud', + 'clout', + 'clove', + 'clown', + 'cluck', + 'clued', + 'clump', + 'clung', + 'coach', + 'coast', + 'cobra', + 'cocoa', + 'colon', + 'color', + 'comet', + 'comfy', + 'comic', + 'comma', + 'conch', + 'condo', + 'conic', + 'copse', + 'coral', + 'corer', + 'corny', + 'couch', + 'cough', + 'could', + 'count', + 'coupe', + 'court', + 'coven', + 'cover', + 'covet', + 'covey', + 'cower', + 'coyly', + 'crack', + 'craft', + 'cramp', + 'crane', + 'crank', + 'crash', + 'crass', + 'crate', + 'crave', + 'crawl', + 'craze', + 'crazy', + 'creak', + 'cream', + 'credo', + 'creed', + 'creek', + 'creep', + 'creme', + 'crepe', + 'crept', + 'cress', + 'crest', + 'crick', + 'cried', + 'crier', + 'crime', + 'crimp', + 'crisp', + 'croak', + 'crock', + 'crone', + 'crony', + 'crook', + 'cross', + 'croup', + 'crowd', + 'crown', + 'crude', + 'cruel', + 'crumb', + 'crump', + 'crush', + 'crust', + 'crypt', + 'cubic', + 'cumin', + 'curio', + 'curly', + 'curry', + 'curse', + 'curve', + 'curvy', + 'cutie', + 'cyber', + 'cycle', + 'cynic', + 'daddy', + 'daily', + 'dairy', + 'daisy', + 'dally', + 'dance', + 'dandy', + 'datum', + 'daunt', + 'dealt', + 'death', + 'debar', + 'debit', + 'debug', + 'debut', + 'decal', + 'decay', + 'decor', + 'decoy', + 'decry', + 'defer', + 'deign', + 'deity', + 'delay', + 'delta', + 'delve', + 'demon', + 'demur', + 'denim', + 'dense', + 'depot', + 'depth', + 'derby', + 'deter', + 'detox', + 'deuce', + 'devil', + 'diary', + 'dicey', + 'digit', + 'dilly', + 'dimly', + 'diner', + 'dingo', + 'dingy', + 'diode', + 'dirge', + 'dirty', + 'disco', + 'ditch', + 'ditto', + 'ditty', + 'diver', + 'dizzy', + 'dodge', + 'dodgy', + 'dogma', + 'doing', + 'dolly', + 'donor', + 'donut', + 'dopey', + 'doubt', + 'dough', + 'dowdy', + 'dowel', + 'downy', + 'dowry', + 'dozen', + 'draft', + 'drain', + 'drake', + 'drama', + 'drank', + 'drape', + 'drawl', + 'drawn', + 'dread', + 'dream', + 'dress', + 'dried', + 'drier', + 'drift', + 'drill', + 'drink', + 'drive', + 'droit', + 'droll', + 'drone', + 'drool', + 'droop', + 'dross', + 'drove', + 'drown', + 'druid', + 'drunk', + 'dryer', + 'dryly', + 'duchy', + 'dully', + 'dummy', + 'dumpy', + 'dunce', + 'dusky', + 'dusty', + 'dutch', + 'duvet', + 'dwarf', + 'dwell', + 'dwelt', + 'dying', + 'eager', + 'eagle', + 'early', + 'earth', + 'easel', + 'eaten', + 'eater', + 'ebony', + 'eclat', + 'edict', + 'edify', + 'eerie', + 'egret', + 'eight', + 'eject', + 'eking', + 'elate', + 'elbow', + 'elder', + 'elect', + 'elegy', + 'elfin', + 'elide', + 'elite', + 'elope', + 'elude', + 'email', + 'embed', + 'ember', + 'emcee', + 'empty', + 'enact', + 'endow', + 'enema', + 'enemy', + 'enjoy', + 'ennui', + 'ensue', + 'enter', + 'entry', + 'envoy', + 'epoch', + 'epoxy', + 'equal', + 'equip', + 'erase', + 'erect', + 'erode', + 'error', + 'erupt', + 'essay', + 'ester', + 'ether', + 'ethic', + 'ethos', + 'etude', + 'evade', + 'event', + 'every', + 'evict', + 'evoke', + 'exact', + 'exalt', + 'excel', + 'exert', + 'exile', + 'exist', + 'expel', + 'extol', + 'extra', + 'exult', + 'eying', + 'fable', + 'facet', + 'faint', + 'fairy', + 'faith', + 'false', + 'fancy', + 'fanny', + 'farce', + 'fatal', + 'fatty', + 'fault', + 'fauna', + 'favor', + 'feast', + 'fecal', + 'feign', + 'fella', + 'felon', + 'femme', + 'femur', + 'fence', + 'feral', + 'ferry', + 'fetal', + 'fetch', + 'fetid', + 'fetus', + 'fever', + 'fewer', + 'fiber', + 'fibre', + 'ficus', + 'field', + 'fiend', + 'fiery', + 'fifth', + 'fifty', + 'fight', + 'filer', + 'filet', + 'filly', + 'filmy', + 'filth', + 'final', + 'finch', + 'finer', + 'first', + 'fishy', + 'fixer', + 'fizzy', + 'fjord', + 'flack', + 'flail', + 'flair', + 'flake', + 'flaky', + 'flame', + 'flank', + 'flare', + 'flash', + 'flask', + 'fleck', + 'fleet', + 'flesh', + 'flick', + 'flier', + 'fling', + 'flint', + 'flirt', + 'float', + 'flock', + 'flood', + 'floor', + 'flora', + 'floss', + 'flour', + 'flout', + 'flown', + 'fluff', + 'fluid', + 'fluke', + 'flume', + 'flung', + 'flunk', + 'flush', + 'flute', + 'flyer', + 'foamy', + 'focal', + 'focus', + 'foggy', + 'foist', + 'folio', + 'folly', + 'foray', + 'force', + 'forge', + 'forgo', + 'forte', + 'forth', + 'forty', + 'forum', + 'found', + 'foyer', + 'frail', + 'frame', + 'frank', + 'fraud', + 'freak', + 'freed', + 'freer', + 'fresh', + 'friar', + 'fried', + 'frill', + 'frisk', + 'fritz', + 'frock', + 'frond', + 'front', + 'frost', + 'froth', + 'frown', + 'froze', + 'fruit', + 'fudge', + 'fugue', + 'fully', + 'fungi', + 'funky', + 'funny', + 'furor', + 'furry', + 'fussy', + 'fuzzy', + 'gaffe', + 'gaily', + 'gamer', + 'gamma', + 'gamut', + 'gassy', + 'gaudy', + 'gauge', + 'gaunt', + 'gauze', + 'gavel', + 'gawky', + 'gayer', + 'gayly', + 'gazer', + 'gecko', + 'geeky', + 'geese', + 'genie', + 'genre', + 'ghost', + 'ghoul', + 'giant', + 'giddy', + 'gipsy', + 'girly', + 'girth', + 'given', + 'giver', + 'glade', + 'gland', + 'glare', + 'glass', + 'glaze', + 'gleam', + 'glean', + 'glide', + 'glint', + 'gloat', + 'globe', + 'gloom', + 'glory', + 'gloss', + 'glove', + 'glyph', + 'gnash', + 'gnome', + 'godly', + 'going', + 'golem', + 'golly', + 'gonad', + 'goner', + 'goody', + 'gooey', + 'goofy', + 'goose', + 'gorge', + 'gouge', + 'gourd', + 'grace', + 'grade', + 'graft', + 'grail', + 'grain', + 'grand', + 'grant', + 'grape', + 'graph', + 'grasp', + 'grass', + 'grate', + 'grave', + 'gravy', + 'graze', + 'great', + 'greed', + 'green', + 'greet', + 'grief', + 'grill', + 'grime', + 'grimy', + 'grind', + 'gripe', + 'groan', + 'groin', + 'groom', + 'grope', + 'gross', + 'group', + 'grout', + 'grove', + 'growl', + 'grown', + 'gruel', + 'gruff', + 'grunt', + 'guard', + 'guava', + 'guess', + 'guest', + 'guide', + 'guild', + 'guile', + 'guilt', + 'guise', + 'gulch', + 'gully', + 'gumbo', + 'gummy', + 'guppy', + 'gusto', + 'gusty', + 'gypsy', + 'habit', + 'hairy', + 'halve', + 'handy', + 'happy', + 'hardy', + 'harem', + 'harpy', + 'harry', + 'harsh', + 'haste', + 'hasty', + 'hatch', + 'hater', + 'haunt', + 'haute', + 'haven', + 'havoc', + 'hazel', + 'heady', + 'heard', + 'heart', + 'heath', + 'heave', + 'heavy', + 'hedge', + 'hefty', + 'heist', + 'helix', + 'hello', + 'hence', + 'heron', + 'hilly', + 'hinge', + 'hippo', + 'hippy', + 'hitch', + 'hoard', + 'hobby', + 'hoist', + 'holly', + 'homer', + 'honey', + 'honor', + 'horde', + 'horny', + 'horse', + 'hotel', + 'hotly', + 'hound', + 'house', + 'hovel', + 'hover', + 'howdy', + 'human', + 'humid', + 'humor', + 'humph', + 'humus', + 'hunch', + 'hunky', + 'hurry', + 'husky', + 'hussy', + 'hutch', + 'hydro', + 'hyena', + 'hymen', + 'hyper', + 'icily', + 'icing', + 'ideal', + 'idiom', + 'idiot', + 'idler', + 'idyll', + 'igloo', + 'iliac', + 'image', + 'imbue', + 'impel', + 'imply', + 'inane', + 'inbox', + 'incur', + 'index', + 'inept', + 'inert', + 'infer', + 'ingot', + 'inlay', + 'inlet', + 'inner', + 'input', + 'inter', + 'intro', + 'ionic', + 'irate', + 'irony', + 'islet', + 'issue', + 'itchy', + 'ivory', + 'jaunt', + 'jazzy', + 'jelly', + 'jerky', + 'jetty', + 'jewel', + 'jiffy', + 'joint', + 'joist', + 'joker', + 'jolly', + 'joust', + 'judge', + 'juice', + 'juicy', + 'jumbo', + 'jumpy', + 'junta', + 'junto', + 'juror', + 'kappa', + 'karma', + 'kayak', + 'kebab', + 'khaki', + 'kinky', + 'kiosk', + 'kitty', + 'knack', + 'knave', + 'knead', + 'kneed', + 'kneel', + 'knelt', + 'knife', + 'knock', + 'knoll', + 'known', + 'koala', + 'krill', + 'label', + 'labor', + 'laden', + 'ladle', + 'lager', + 'lance', + 'lanky', + 'lapel', + 'lapse', + 'large', + 'larva', + 'lasso', + 'latch', + 'later', + 'lathe', + 'latte', + 'laugh', + 'layer', + 'leach', + 'leafy', + 'leaky', + 'leant', + 'leapt', + 'learn', + 'lease', + 'leash', + 'least', + 'leave', + 'ledge', + 'leech', + 'leery', + 'lefty', + 'legal', + 'leggy', + 'lemon', + 'lemur', + 'leper', + 'level', + 'lever', + 'libel', + 'liege', + 'light', + 'liken', + 'lilac', + 'limbo', + 'limit', + 'linen', + 'liner', + 'lingo', + 'lipid', + 'lithe', + 'liver', + 'livid', + 'llama', + 'loamy', + 'loath', + 'lobby', + 'local', + 'locus', + 'lodge', + 'lofty', + 'logic', + 'login', + 'loopy', + 'loose', + 'lorry', + 'loser', + 'louse', + 'lousy', + 'lover', + 'lower', + 'lowly', + 'loyal', + 'lucid', + 'lucky', + 'lumen', + 'lumpy', + 'lunar', + 'lunch', + 'lunge', + 'lupus', + 'lurch', + 'lurid', + 'lusty', + 'lying', + 'lymph', + 'lynch', + 'lyric', + 'macaw', + 'macho', + 'macro', + 'madam', + 'madly', + 'mafia', + 'magic', + 'magma', + 'maize', + 'major', + 'maker', + 'mambo', + 'mamma', + 'mammy', + 'manga', + 'mange', + 'mango', + 'mangy', + 'mania', + 'manic', + 'manly', + 'manor', + 'maple', + 'march', + 'marry', + 'marsh', + 'mason', + 'masse', + 'match', + 'matey', + 'mauve', + 'maxim', + 'maybe', + 'mayor', + 'mealy', + 'meant', + 'meaty', + 'mecca', + 'medal', + 'media', + 'medic', + 'melee', + 'melon', + 'mercy', + 'merge', + 'merit', + 'merry', + 'metal', + 'meter', + 'metro', + 'micro', + 'midge', + 'midst', + 'might', + 'milky', + 'mimic', + 'mince', + 'miner', + 'minim', + 'minor', + 'minty', + 'minus', + 'mirth', + 'miser', + 'missy', + 'mocha', + 'modal', + 'model', + 'modem', + 'mogul', + 'moist', + 'molar', + 'moldy', + 'money', + 'month', + 'moody', + 'moose', + 'moral', + 'moron', + 'morph', + 'mossy', + 'motel', + 'motif', + 'motor', + 'motto', + 'moult', + 'mound', + 'mount', + 'mourn', + 'mouse', + 'mouth', + 'mover', + 'movie', + 'mower', + 'mucky', + 'mucus', + 'muddy', + 'mulch', + 'mummy', + 'munch', + 'mural', + 'murky', + 'mushy', + 'music', + 'musky', + 'musty', + 'myrrh', + 'nadir', + 'naive', + 'nanny', + 'nasal', + 'nasty', + 'natal', + 'naval', + 'navel', + 'needy', + 'neigh', + 'nerdy', + 'nerve', + 'never', + 'newer', + 'newly', + 'nicer', + 'niche', + 'niece', + 'night', + 'ninja', + 'ninny', + 'ninth', + 'noble', + 'nobly', + 'noise', + 'noisy', + 'nomad', + 'noose', + 'north', + 'nosey', + 'notch', + 'novel', + 'nudge', + 'nurse', + 'nutty', + 'nylon', + 'nymph', + 'oaken', + 'obese', + 'occur', + 'ocean', + 'octal', + 'octet', + 'odder', + 'oddly', + 'offal', + 'offer', + 'often', + 'olden', + 'older', + 'olive', + 'ombre', + 'omega', + 'onion', + 'onset', + 'opera', + 'opine', + 'opium', + 'optic', + 'orbit', + 'order', + 'organ', + 'other', + 'otter', + 'ought', + 'ounce', + 'outdo', + 'outer', + 'outgo', + 'ovary', + 'ovate', + 'overt', + 'ovine', + 'ovoid', + 'owing', + 'owner', + 'oxide', + 'ozone', + 'paddy', + 'pagan', + 'paint', + 'paler', + 'palsy', + 'panel', + 'panic', + 'pansy', + 'papal', + 'paper', + 'parer', + 'parka', + 'parry', + 'parse', + 'party', + 'pasta', + 'paste', + 'pasty', + 'patch', + 'patio', + 'patsy', + 'patty', + 'pause', + 'payee', + 'payer', + 'peace', + 'peach', + 'pearl', + 'pecan', + 'pedal', + 'penal', + 'pence', + 'penne', + 'penny', + 'perch', + 'peril', + 'perky', + 'pesky', + 'pesto', + 'petal', + 'petty', + 'phase', + 'phone', + 'phony', + 'photo', + 'piano', + 'picky', + 'piece', + 'piety', + 'piggy', + 'pilot', + 'pinch', + 'piney', + 'pinky', + 'pinto', + 'piper', + 'pique', + 'pitch', + 'pithy', + 'pivot', + 'pixel', + 'pixie', + 'pizza', + 'place', + 'plaid', + 'plain', + 'plait', + 'plane', + 'plank', + 'plant', + 'plate', + 'plaza', + 'plead', + 'pleat', + 'plied', + 'plier', + 'pluck', + 'plumb', + 'plume', + 'plump', + 'plunk', + 'plush', + 'poesy', + 'point', + 'poise', + 'poker', + 'polar', + 'polka', + 'polyp', + 'pooch', + 'poppy', + 'porch', + 'poser', + 'posit', + 'posse', + 'pouch', + 'pound', + 'pouty', + 'power', + 'prank', + 'prawn', + 'preen', + 'press', + 'price', + 'prick', + 'pride', + 'pried', + 'prime', + 'primo', + 'print', + 'prior', + 'prism', + 'privy', + 'prize', + 'probe', + 'prone', + 'prong', + 'proof', + 'prose', + 'proud', + 'prove', + 'prowl', + 'proxy', + 'prude', + 'prune', + 'psalm', + 'pubic', + 'pudgy', + 'puffy', + 'pulpy', + 'pulse', + 'punch', + 'pupal', + 'pupil', + 'puppy', + 'puree', + 'purer', + 'purge', + 'purse', + 'pushy', + 'putty', + 'pygmy', + 'quack', + 'quail', + 'quake', + 'qualm', + 'quark', + 'quart', + 'quash', + 'quasi', + 'queen', + 'queer', + 'quell', + 'query', + 'quest', + 'queue', + 'quick', + 'quiet', + 'quill', + 'quilt', + 'quirk', + 'quite', + 'quota', + 'quote', + 'quoth', + 'rabbi', + 'rabid', + 'racer', + 'radar', + 'radii', + 'radio', + 'rainy', + 'raise', + 'rajah', + 'rally', + 'ralph', + 'ramen', + 'ranch', + 'randy', + 'range', + 'rapid', + 'rarer', + 'raspy', + 'ratio', + 'ratty', + 'raven', + 'rayon', + 'razor', + 'reach', + 'react', + 'ready', + 'realm', + 'rearm', + 'rebar', + 'rebel', + 'rebus', + 'rebut', + 'recap', + 'recur', + 'recut', + 'reedy', + 'refer', + 'refit', + 'regal', + 'rehab', + 'reign', + 'relax', + 'relay', + 'relic', + 'remit', + 'renal', + 'renew', + 'repay', + 'repel', + 'reply', + 'rerun', + 'reset', + 'resin', + 'retch', + 'retro', + 'retry', + 'reuse', + 'revel', + 'revue', + 'rhino', + 'rhyme', + 'rider', + 'ridge', + 'rifle', + 'right', + 'rigid', + 'rigor', + 'rinse', + 'ripen', + 'riper', + 'risen', + 'riser', + 'risky', + 'rival', + 'river', + 'rivet', + 'roach', + 'roast', + 'robin', + 'robot', + 'rocky', + 'rodeo', + 'roger', + 'rogue', + 'roomy', + 'roost', + 'rotor', + 'rouge', + 'rough', + 'round', + 'rouse', + 'route', + 'rover', + 'rowdy', + 'rower', + 'royal', + 'ruddy', + 'ruder', + 'rugby', + 'ruler', + 'rumba', + 'rumor', + 'rupee', + 'rural', + 'rusty', + 'sadly', + 'safer', + 'saint', + 'salad', + 'sally', + 'salon', + 'salsa', + 'salty', + 'salve', + 'salvo', + 'sandy', + 'saner', + 'sappy', + 'sassy', + 'satin', + 'satyr', + 'sauce', + 'saucy', + 'sauna', + 'saute', + 'savor', + 'savoy', + 'savvy', + 'scald', + 'scale', + 'scalp', + 'scaly', + 'scamp', + 'scant', + 'scare', + 'scarf', + 'scary', + 'scene', + 'scent', + 'scion', + 'scoff', + 'scold', + 'scone', + 'scoop', + 'scope', + 'score', + 'scorn', + 'scour', + 'scout', + 'scowl', + 'scram', + 'scrap', + 'scree', + 'screw', + 'scrub', + 'scrum', + 'scuba', + 'sedan', + 'seedy', + 'segue', + 'seize', + 'semen', + 'sense', + 'sepia', + 'serif', + 'serum', + 'serve', + 'setup', + 'seven', + 'sever', + 'sewer', + 'shack', + 'shade', + 'shady', + 'shaft', + 'shake', + 'shaky', + 'shale', + 'shall', + 'shalt', + 'shame', + 'shank', + 'shape', + 'shard', + 'share', + 'shark', + 'sharp', + 'shave', + 'shawl', + 'shear', + 'sheen', + 'sheep', + 'sheer', + 'sheet', + 'sheik', + 'shelf', + 'shell', + 'shied', + 'shift', + 'shine', + 'shiny', + 'shire', + 'shirk', + 'shirt', + 'shoal', + 'shock', + 'shone', + 'shook', + 'shoot', + 'shore', + 'shorn', + 'short', + 'shout', + 'shove', + 'shown', + 'showy', + 'shrew', + 'shrub', + 'shrug', + 'shuck', + 'shunt', + 'shush', + 'shyly', + 'siege', + 'sieve', + 'sight', + 'sigma', + 'silky', + 'silly', + 'since', + 'sinew', + 'singe', + 'siren', + 'sissy', + 'sixth', + 'sixty', + 'skate', + 'skier', + 'skiff', + 'skill', + 'skimp', + 'skirt', + 'skulk', + 'skull', + 'skunk', + 'slack', + 'slain', + 'slang', + 'slant', + 'slash', + 'slate', + 'slave', + 'sleek', + 'sleep', + 'sleet', + 'slept', + 'slice', + 'slick', + 'slide', + 'slime', + 'slimy', + 'sling', + 'slink', + 'sloop', + 'slope', + 'slosh', + 'sloth', + 'slump', + 'slung', + 'slunk', + 'slurp', + 'slush', + 'slyly', + 'smack', + 'small', + 'smart', + 'smash', + 'smear', + 'smell', + 'smelt', + 'smile', + 'smirk', + 'smite', + 'smith', + 'smock', + 'smoke', + 'smoky', + 'smote', + 'snack', + 'snail', + 'snake', + 'snaky', + 'snare', + 'snarl', + 'sneak', + 'sneer', + 'snide', + 'sniff', + 'snipe', + 'snoop', + 'snore', + 'snort', + 'snout', + 'snowy', + 'snuck', + 'snuff', + 'soapy', + 'sober', + 'soggy', + 'solar', + 'solid', + 'solve', + 'sonar', + 'sonic', + 'sooth', + 'sooty', + 'sorry', + 'sound', + 'south', + 'sower', + 'space', + 'spade', + 'spank', + 'spare', + 'spark', + 'spasm', + 'spawn', + 'speak', + 'spear', + 'speck', + 'speed', + 'spell', + 'spelt', + 'spend', + 'spent', + 'sperm', + 'spice', + 'spicy', + 'spied', + 'spiel', + 'spike', + 'spiky', + 'spill', + 'spilt', + 'spine', + 'spiny', + 'spire', + 'spite', + 'splat', + 'split', + 'spoil', + 'spoke', + 'spoof', + 'spook', + 'spool', + 'spoon', + 'spore', + 'sport', + 'spout', + 'spray', + 'spree', + 'sprig', + 'spunk', + 'spurn', + 'spurt', + 'squad', + 'squat', + 'squib', + 'stack', + 'staff', + 'stage', + 'staid', + 'stain', + 'stair', + 'stake', + 'stale', + 'stalk', + 'stall', + 'stamp', + 'stand', + 'stank', + 'stare', + 'stark', + 'start', + 'stash', + 'state', + 'stave', + 'stead', + 'steak', + 'steal', + 'steam', + 'steed', + 'steel', + 'steep', + 'steer', + 'stein', + 'stern', + 'stick', + 'stiff', + 'still', + 'stilt', + 'sting', + 'stink', + 'stint', + 'stock', + 'stoic', + 'stoke', + 'stole', + 'stomp', + 'stone', + 'stony', + 'stood', + 'stool', + 'stoop', + 'store', + 'stork', + 'storm', + 'story', + 'stout', + 'stove', + 'strap', + 'straw', + 'stray', + 'strip', + 'strut', + 'stuck', + 'study', + 'stuff', + 'stump', + 'stung', + 'stunk', + 'stunt', + 'style', + 'suave', + 'sugar', + 'suing', + 'suite', + 'sulky', + 'sully', + 'sumac', + 'sunny', + 'super', + 'surer', + 'surge', + 'surly', + 'sushi', + 'swami', + 'swamp', + 'swarm', + 'swash', + 'swath', + 'swear', + 'sweat', + 'sweep', + 'sweet', + 'swell', + 'swept', + 'swift', + 'swill', + 'swine', + 'swing', + 'swirl', + 'swish', + 'swoon', + 'swoop', + 'sword', + 'swore', + 'sworn', + 'swung', + 'synod', + 'syrup', + 'tabby', + 'table', + 'taboo', + 'tacit', + 'tacky', + 'taffy', + 'taint', + 'taken', + 'taker', + 'tally', + 'talon', + 'tamer', + 'tango', + 'tangy', + 'taper', + 'tapir', + 'tardy', + 'tarot', + 'taste', + 'tasty', + 'tatty', + 'taunt', + 'tawny', + 'teach', + 'teary', + 'tease', + 'teddy', + 'teeth', + 'tempo', + 'tenet', + 'tenor', + 'tense', + 'tenth', + 'tepee', + 'tepid', + 'terra', + 'terse', + 'testy', + 'thank', + 'theft', + 'their', + 'theme', + 'there', + 'these', + 'theta', + 'thick', + 'thief', + 'thigh', + 'thing', + 'think', + 'third', + 'thong', + 'thorn', + 'those', + 'three', + 'threw', + 'throb', + 'throw', + 'thrum', + 'thumb', + 'thump', + 'thyme', + 'tiara', + 'tibia', + 'tidal', + 'tiger', + 'tight', + 'tilde', + 'timer', + 'timid', + 'tipsy', + 'titan', + 'tithe', + 'title', + 'toast', + 'today', + 'toddy', + 'token', + 'tonal', + 'tonga', + 'tonic', + 'tooth', + 'topaz', + 'topic', + 'torch', + 'torso', + 'torus', + 'total', + 'totem', + 'touch', + 'tough', + 'towel', + 'tower', + 'toxic', + 'toxin', + 'trace', + 'track', + 'tract', + 'trade', + 'trail', + 'train', + 'trait', + 'tramp', + 'trash', + 'trawl', + 'tread', + 'treat', + 'trend', + 'triad', + 'trial', + 'tribe', + 'trice', + 'trick', + 'tried', + 'tripe', + 'trite', + 'troll', + 'troop', + 'trope', + 'trout', + 'trove', + 'truce', + 'truck', + 'truer', + 'truly', + 'trump', + 'trunk', + 'truss', + 'trust', + 'truth', + 'tryst', + 'tubal', + 'tuber', + 'tulip', + 'tulle', + 'tumor', + 'tunic', + 'turbo', + 'tutor', + 'twang', + 'tweak', + 'tweed', + 'tweet', + 'twice', + 'twine', + 'twirl', + 'twist', + 'twixt', + 'tying', + 'udder', + 'ulcer', + 'ultra', + 'umbra', + 'uncle', + 'uncut', + 'under', + 'undid', + 'undue', + 'unfed', + 'unfit', + 'unify', + 'union', + 'unite', + 'unity', + 'unlit', + 'unmet', + 'unset', + 'untie', + 'until', + 'unwed', + 'unzip', + 'upper', + 'upset', + 'urban', + 'urine', + 'usage', + 'usher', + 'using', + 'usual', + 'usurp', + 'utile', + 'utter', + 'vague', + 'valet', + 'valid', + 'valor', + 'value', + 'valve', + 'vapid', + 'vapor', + 'vault', + 'vaunt', + 'vegan', + 'venom', + 'venue', + 'verge', + 'verse', + 'verso', + 'verve', + 'vicar', + 'video', + 'vigil', + 'vigor', + 'villa', + 'vinyl', + 'viola', + 'viper', + 'viral', + 'virus', + 'visit', + 'visor', + 'vista', + 'vital', + 'vivid', + 'vixen', + 'vocal', + 'vodka', + 'vogue', + 'voice', + 'voila', + 'vomit', + 'voter', + 'vouch', + 'vowel', + 'vying', + 'wacky', + 'wafer', + 'wager', + 'wagon', + 'waist', + 'waive', + 'waltz', + 'warty', + 'waste', + 'watch', + 'water', + 'waver', + 'waxen', + 'weary', + 'weave', + 'wedge', + 'weedy', + 'weigh', + 'weird', + 'welch', + 'welsh', + 'wench', + 'whack', + 'whale', + 'wharf', + 'wheat', + 'wheel', + 'whelp', + 'where', + 'which', + 'whiff', + 'while', + 'whine', + 'whiny', + 'whirl', + 'whisk', + 'white', + 'whole', + 'whoop', + 'whose', + 'widen', + 'wider', + 'widow', + 'width', + 'wield', + 'wight', + 'willy', + 'wimpy', + 'wince', + 'winch', + 'windy', + 'wiser', + 'wispy', + 'witch', + 'witty', + 'woken', + 'woman', + 'women', + 'woody', + 'wooer', + 'wooly', + 'woozy', + 'wordy', + 'world', + 'worry', + 'worse', + 'worst', + 'worth', + 'would', + 'wound', + 'woven', + 'wrack', + 'wrath', + 'wreak', + 'wreck', + 'wrest', + 'wring', + 'wrist', + 'write', + 'wrong', + 'wrote', + 'wrung', + 'wryly', + 'yacht', + 'yearn', + 'yeast', + 'yield', + 'young', + 'youth', + 'zebra', + 'zesty', + 'zonal' +]; + +/** The list of valid guesses, of which the list of possible words is a subset */ +export const allowed = new Set([ + ...words, + 'aahed', + 'aalii', + 'aargh', + 'aarti', + 'abaca', + 'abaci', + 'abacs', + 'abaft', + 'abaka', + 'abamp', + 'aband', + 'abash', + 'abask', + 'abaya', + 'abbas', + 'abbed', + 'abbes', + 'abcee', + 'abeam', + 'abear', + 'abele', + 'abers', + 'abets', + 'abies', + 'abler', + 'ables', + 'ablet', + 'ablow', + 'abmho', + 'abohm', + 'aboil', + 'aboma', + 'aboon', + 'abord', + 'abore', + 'abram', + 'abray', + 'abrim', + 'abrin', + 'abris', + 'absey', + 'absit', + 'abuna', + 'abune', + 'abuts', + 'abuzz', + 'abyes', + 'abysm', + 'acais', + 'acari', + 'accas', + 'accoy', + 'acerb', + 'acers', + 'aceta', + 'achar', + 'ached', + 'aches', + 'achoo', + 'acids', + 'acidy', + 'acing', + 'acini', + 'ackee', + 'acker', + 'acmes', + 'acmic', + 'acned', + 'acnes', + 'acock', + 'acold', + 'acred', + 'acres', + 'acros', + 'acted', + 'actin', + 'acton', + 'acyls', + 'adaws', + 'adays', + 'adbot', + 'addax', + 'added', + 'adder', + 'addio', + 'addle', + 'adeem', + 'adhan', + 'adieu', + 'adios', + 'adits', + 'adman', + 'admen', + 'admix', + 'adobo', + 'adown', + 'adoze', + 'adrad', + 'adred', + 'adsum', + 'aduki', + 'adunc', + 'adust', + 'advew', + 'adyta', + 'adzed', + 'adzes', + 'aecia', + 'aedes', + 'aegis', + 'aeons', + 'aerie', + 'aeros', + 'aesir', + 'afald', + 'afara', + 'afars', + 'afear', + 'aflaj', + 'afore', + 'afrit', + 'afros', + 'agama', + 'agami', + 'agars', + 'agast', + 'agave', + 'agaze', + 'agene', + 'agers', + 'agger', + 'aggie', + 'aggri', + 'aggro', + 'aggry', + 'aghas', + 'agila', + 'agios', + 'agism', + 'agist', + 'agita', + 'aglee', + 'aglet', + 'agley', + 'agloo', + 'aglus', + 'agmas', + 'agoge', + 'agone', + 'agons', + 'agood', + 'agria', + 'agrin', + 'agros', + 'agued', + 'agues', + 'aguna', + 'aguti', + 'aheap', + 'ahent', + 'ahigh', + 'ahind', + 'ahing', + 'ahint', + 'ahold', + 'ahull', + 'ahuru', + 'aidas', + 'aided', + 'aides', + 'aidoi', + 'aidos', + 'aiery', + 'aigas', + 'aight', + 'ailed', + 'aimed', + 'aimer', + 'ainee', + 'ainga', + 'aioli', + 'aired', + 'airer', + 'airns', + 'airth', + 'airts', + 'aitch', + 'aitus', + 'aiver', + 'aiyee', + 'aizle', + 'ajies', + 'ajiva', + 'ajuga', + 'ajwan', + 'akees', + 'akela', + 'akene', + 'aking', + 'akita', + 'akkas', + 'alaap', + 'alack', + 'alamo', + 'aland', + 'alane', + 'alang', + 'alans', + 'alant', + 'alapa', + 'alaps', + 'alary', + 'alate', + 'alays', + 'albas', + 'albee', + 'alcid', + 'alcos', + 'aldea', + 'alder', + 'aldol', + 'aleck', + 'alecs', + 'alefs', + 'aleft', + 'aleph', + 'alews', + 'aleye', + 'alfas', + 'algal', + 'algas', + 'algid', + 'algin', + 'algor', + 'algum', + 'alias', + 'alifs', + 'aline', + 'alist', + 'aliya', + 'alkie', + 'alkos', + 'alkyd', + 'alkyl', + 'allee', + 'allel', + 'allis', + 'allod', + 'allyl', + 'almah', + 'almas', + 'almeh', + 'almes', + 'almud', + 'almug', + 'alods', + 'aloed', + 'aloes', + 'aloha', + 'aloin', + 'aloos', + 'alowe', + 'altho', + 'altos', + 'alula', + 'alums', + 'alure', + 'alvar', + 'alway', + 'amahs', + 'amain', + 'amate', + 'amaut', + 'amban', + 'ambit', + 'ambos', + 'ambry', + 'ameba', + 'ameer', + 'amene', + 'amens', + 'ament', + 'amias', + 'amice', + 'amici', + 'amide', + 'amido', + 'amids', + 'amies', + 'amiga', + 'amigo', + 'amine', + 'amino', + 'amins', + 'amirs', + 'amlas', + 'amman', + 'ammon', + 'ammos', + 'amnia', + 'amnic', + 'amnio', + 'amoks', + 'amole', + 'amort', + 'amour', + 'amove', + 'amowt', + 'amped', + 'ampul', + 'amrit', + 'amuck', + 'amyls', + 'anana', + 'anata', + 'ancho', + 'ancle', + 'ancon', + 'andro', + 'anear', + 'anele', + 'anent', + 'angas', + 'anglo', + 'anigh', + 'anile', + 'anils', + 'anima', + 'animi', + 'anion', + 'anise', + 'anker', + 'ankhs', + 'ankus', + 'anlas', + 'annal', + 'annas', + 'annat', + 'anoas', + 'anole', + 'anomy', + 'ansae', + 'antae', + 'antar', + 'antas', + 'anted', + 'antes', + 'antis', + 'antra', + 'antre', + 'antsy', + 'anura', + 'anyon', + 'apace', + 'apage', + 'apaid', + 'apayd', + 'apays', + 'apeak', + 'apeek', + 'apers', + 'apert', + 'apery', + 'apgar', + 'aphis', + 'apian', + 'apiol', + 'apish', + 'apism', + 'apode', + 'apods', + 'apoop', + 'aport', + 'appal', + 'appay', + 'appel', + 'appro', + 'appui', + 'appuy', + 'apres', + 'apses', + 'apsis', + 'apsos', + 'apted', + 'apter', + 'aquae', + 'aquas', + 'araba', + 'araks', + 'arame', + 'arars', + 'arbas', + 'arced', + 'archi', + 'arcos', + 'arcus', + 'ardeb', + 'ardri', + 'aread', + 'areae', + 'areal', + 'arear', + 'areas', + 'areca', + 'aredd', + 'arede', + 'arefy', + 'areic', + 'arene', + 'arepa', + 'arere', + 'arete', + 'arets', + 'arett', + 'argal', + 'argan', + 'argil', + 'argle', + 'argol', + 'argon', + 'argot', + 'argus', + 'arhat', + 'arias', + 'ariel', + 'ariki', + 'arils', + 'ariot', + 'arish', + 'arked', + 'arled', + 'arles', + 'armed', + 'armer', + 'armet', + 'armil', + 'arnas', + 'arnut', + 'aroba', + 'aroha', + 'aroid', + 'arpas', + 'arpen', + 'arrah', + 'arras', + 'arret', + 'arris', + 'arroz', + 'arsed', + 'arses', + 'arsey', + 'arsis', + 'artal', + 'artel', + 'artic', + 'artis', + 'aruhe', + 'arums', + 'arval', + 'arvee', + 'arvos', + 'aryls', + 'asana', + 'ascon', + 'ascus', + 'asdic', + 'ashed', + 'ashes', + 'ashet', + 'asked', + 'asker', + 'askoi', + 'askos', + 'aspen', + 'asper', + 'aspic', + 'aspie', + 'aspis', + 'aspro', + 'assai', + 'assam', + 'asses', + 'assez', + 'assot', + 'aster', + 'astir', + 'astun', + 'asura', + 'asway', + 'aswim', + 'asyla', + 'ataps', + 'ataxy', + 'atigi', + 'atilt', + 'atimy', + 'atlas', + 'atman', + 'atmas', + 'atmos', + 'atocs', + 'atoke', + 'atoks', + 'atoms', + 'atomy', + 'atony', + 'atopy', + 'atria', + 'atrip', + 'attap', + 'attar', + 'atuas', + 'audad', + 'auger', + 'aught', + 'aulas', + 'aulic', + 'auloi', + 'aulos', + 'aumil', + 'aunes', + 'aunts', + 'aurae', + 'aural', + 'aurar', + 'auras', + 'aurei', + 'aures', + 'auric', + 'auris', + 'aurum', + 'autos', + 'auxin', + 'avale', + 'avant', + 'avast', + 'avels', + 'avens', + 'avers', + 'avgas', + 'avine', + 'avion', + 'avise', + 'aviso', + 'avize', + 'avows', + 'avyze', + 'awarn', + 'awato', + 'awave', + 'aways', + 'awdls', + 'aweel', + 'aweto', + 'awing', + 'awmry', + 'awned', + 'awner', + 'awols', + 'awork', + 'axels', + 'axile', + 'axils', + 'axing', + 'axite', + 'axled', + 'axles', + 'axman', + 'axmen', + 'axoid', + 'axone', + 'axons', + 'ayahs', + 'ayaya', + 'ayelp', + 'aygre', + 'ayins', + 'ayont', + 'ayres', + 'ayrie', + 'azans', + 'azide', + 'azido', + 'azine', + 'azlon', + 'azoic', + 'azole', + 'azons', + 'azote', + 'azoth', + 'azuki', + 'azurn', + 'azury', + 'azygy', + 'azyme', + 'azyms', + 'baaed', + 'baals', + 'babas', + 'babel', + 'babes', + 'babka', + 'baboo', + 'babul', + 'babus', + 'bacca', + 'bacco', + 'baccy', + 'bacha', + 'bachs', + 'backs', + 'baddy', + 'baels', + 'baffs', + 'baffy', + 'bafts', + 'baghs', + 'bagie', + 'bahts', + 'bahus', + 'bahut', + 'bails', + 'bairn', + 'baisa', + 'baith', + 'baits', + 'baiza', + 'baize', + 'bajan', + 'bajra', + 'bajri', + 'bajus', + 'baked', + 'baken', + 'bakes', + 'bakra', + 'balas', + 'balds', + 'baldy', + 'baled', + 'bales', + 'balks', + 'balky', + 'balls', + 'bally', + 'balms', + 'baloo', + 'balsa', + 'balti', + 'balun', + 'balus', + 'bambi', + 'banak', + 'banco', + 'bancs', + 'banda', + 'bandh', + 'bands', + 'bandy', + 'baned', + 'banes', + 'bangs', + 'bania', + 'banks', + 'banns', + 'bants', + 'bantu', + 'banty', + 'banya', + 'bapus', + 'barbe', + 'barbs', + 'barby', + 'barca', + 'barde', + 'bardo', + 'bards', + 'bardy', + 'bared', + 'barer', + 'bares', + 'barfi', + 'barfs', + 'baric', + 'barks', + 'barky', + 'barms', + 'barmy', + 'barns', + 'barny', + 'barps', + 'barra', + 'barre', + 'barro', + 'barry', + 'barye', + 'basan', + 'based', + 'basen', + 'baser', + 'bases', + 'basho', + 'basij', + 'basks', + 'bason', + 'basse', + 'bassi', + 'basso', + 'bassy', + 'basta', + 'basti', + 'basto', + 'basts', + 'bated', + 'bates', + 'baths', + 'batik', + 'batta', + 'batts', + 'battu', + 'bauds', + 'bauks', + 'baulk', + 'baurs', + 'bavin', + 'bawds', + 'bawks', + 'bawls', + 'bawns', + 'bawrs', + 'bawty', + 'bayed', + 'bayer', + 'bayes', + 'bayle', + 'bayts', + 'bazar', + 'bazoo', + 'beads', + 'beaks', + 'beaky', + 'beals', + 'beams', + 'beamy', + 'beano', + 'beans', + 'beany', + 'beare', + 'bears', + 'beath', + 'beats', + 'beaty', + 'beaus', + 'beaut', + 'beaux', + 'bebop', + 'becap', + 'becke', + 'becks', + 'bedad', + 'bedel', + 'bedes', + 'bedew', + 'bedim', + 'bedye', + 'beedi', + 'beefs', + 'beeps', + 'beers', + 'beery', + 'beets', + 'befog', + 'begad', + 'begar', + 'begem', + 'begot', + 'begum', + 'beige', + 'beigy', + 'beins', + 'bekah', + 'belah', + 'belar', + 'belay', + 'belee', + 'belga', + 'bells', + 'belon', + 'belts', + 'bemad', + 'bemas', + 'bemix', + 'bemud', + 'bends', + 'bendy', + 'benes', + 'benet', + 'benga', + 'benis', + 'benne', + 'benni', + 'benny', + 'bento', + 'bents', + 'benty', + 'bepat', + 'beray', + 'beres', + 'bergs', + 'berko', + 'berks', + 'berme', + 'berms', + 'berob', + 'beryl', + 'besat', + 'besaw', + 'besee', + 'beses', + 'besit', + 'besom', + 'besot', + 'besti', + 'bests', + 'betas', + 'beted', + 'betes', + 'beths', + 'betid', + 'beton', + 'betta', + 'betty', + 'bever', + 'bevor', + 'bevue', + 'bevvy', + 'bewet', + 'bewig', + 'bezes', + 'bezil', + 'bezzy', + 'bhais', + 'bhaji', + 'bhang', + 'bhats', + 'bhels', + 'bhoot', + 'bhuna', + 'bhuts', + 'biach', + 'biali', + 'bialy', + 'bibbs', + 'bibes', + 'biccy', + 'bices', + 'bided', + 'bider', + 'bides', + 'bidet', + 'bidis', + 'bidon', + 'bield', + 'biers', + 'biffo', + 'biffs', + 'biffy', + 'bifid', + 'bigae', + 'biggs', + 'biggy', + 'bigha', + 'bight', + 'bigly', + 'bigos', + 'bijou', + 'biked', + 'biker', + 'bikes', + 'bikie', + 'bilbo', + 'bilby', + 'biled', + 'biles', + 'bilgy', + 'bilks', + 'bills', + 'bimah', + 'bimas', + 'bimbo', + 'binal', + 'bindi', + 'binds', + 'biner', + 'bines', + 'bings', + 'bingy', + 'binit', + 'binks', + 'bints', + 'biogs', + 'biont', + 'biota', + 'biped', + 'bipod', + 'birds', + 'birks', + 'birle', + 'birls', + 'biros', + 'birrs', + 'birse', + 'birsy', + 'bises', + 'bisks', + 'bisom', + 'bitch', + 'biter', + 'bites', + 'bitos', + 'bitou', + 'bitsy', + 'bitte', + 'bitts', + 'bivia', + 'bivvy', + 'bizes', + 'bizzo', + 'bizzy', + 'blabs', + 'blads', + 'blady', + 'blaer', + 'blaes', + 'blaff', + 'blags', + 'blahs', + 'blain', + 'blams', + 'blart', + 'blase', + 'blash', + 'blate', + 'blats', + 'blatt', + 'blaud', + 'blawn', + 'blaws', + 'blays', + 'blear', + 'blebs', + 'blech', + 'blees', + 'blent', + 'blert', + 'blest', + 'blets', + 'bleys', + 'blimy', + 'bling', + 'blini', + 'blins', + 'bliny', + 'blips', + 'blist', + 'blite', + 'blits', + 'blive', + 'blobs', + 'blocs', + 'blogs', + 'blook', + 'bloop', + 'blore', + 'blots', + 'blows', + 'blowy', + 'blubs', + 'blude', + 'bluds', + 'bludy', + 'blued', + 'blues', + 'bluet', + 'bluey', + 'bluid', + 'blume', + 'blunk', + 'blurs', + 'blype', + 'boabs', + 'boaks', + 'boars', + 'boart', + 'boats', + 'bobac', + 'bobak', + 'bobas', + 'bobol', + 'bobos', + 'bocca', + 'bocce', + 'bocci', + 'boche', + 'bocks', + 'boded', + 'bodes', + 'bodge', + 'bodhi', + 'bodle', + 'boeps', + 'boets', + 'boeuf', + 'boffo', + 'boffs', + 'bogan', + 'bogey', + 'boggy', + 'bogie', + 'bogle', + 'bogue', + 'bogus', + 'bohea', + 'bohos', + 'boils', + 'boing', + 'boink', + 'boite', + 'boked', + 'bokeh', + 'bokes', + 'bokos', + 'bolar', + 'bolas', + 'bolds', + 'boles', + 'bolix', + 'bolls', + 'bolos', + 'bolts', + 'bolus', + 'bomas', + 'bombe', + 'bombo', + 'bombs', + 'bonce', + 'bonds', + 'boned', + 'boner', + 'bones', + 'bongs', + 'bonie', + 'bonks', + 'bonne', + 'bonny', + 'bonza', + 'bonze', + 'booai', + 'booay', + 'boobs', + 'boody', + 'booed', + 'boofy', + 'boogy', + 'boohs', + 'books', + 'booky', + 'bools', + 'booms', + 'boomy', + 'boong', + 'boons', + 'boord', + 'boors', + 'boose', + 'boots', + 'boppy', + 'borak', + 'boral', + 'boras', + 'borde', + 'bords', + 'bored', + 'boree', + 'borel', + 'borer', + 'bores', + 'borgo', + 'boric', + 'borks', + 'borms', + 'borna', + 'boron', + 'borts', + 'borty', + 'bortz', + 'bosie', + 'bosks', + 'bosky', + 'boson', + 'bosun', + 'botas', + 'botel', + 'botes', + 'bothy', + 'botte', + 'botts', + 'botty', + 'bouge', + 'bouks', + 'boult', + 'bouns', + 'bourd', + 'bourg', + 'bourn', + 'bouse', + 'bousy', + 'bouts', + 'bovid', + 'bowat', + 'bowed', + 'bower', + 'bowes', + 'bowet', + 'bowie', + 'bowls', + 'bowne', + 'bowrs', + 'bowse', + 'boxed', + 'boxen', + 'boxes', + 'boxla', + 'boxty', + 'boyar', + 'boyau', + 'boyed', + 'boyfs', + 'boygs', + 'boyla', + 'boyos', + 'boysy', + 'bozos', + 'braai', + 'brach', + 'brack', + 'bract', + 'brads', + 'braes', + 'brags', + 'brail', + 'braks', + 'braky', + 'brame', + 'brane', + 'brank', + 'brans', + 'brant', + 'brast', + 'brats', + 'brava', + 'bravi', + 'braws', + 'braxy', + 'brays', + 'braza', + 'braze', + 'bream', + 'brede', + 'breds', + 'breem', + 'breer', + 'brees', + 'breid', + 'breis', + 'breme', + 'brens', + 'brent', + 'brere', + 'brers', + 'breve', + 'brews', + 'breys', + 'brier', + 'bries', + 'brigs', + 'briki', + 'briks', + 'brill', + 'brims', + 'brins', + 'brios', + 'brise', + 'briss', + 'brith', + 'brits', + 'britt', + 'brize', + 'broch', + 'brock', + 'brods', + 'brogh', + 'brogs', + 'brome', + 'bromo', + 'bronc', + 'brond', + 'brool', + 'broos', + 'brose', + 'brosy', + 'brows', + 'brugh', + 'bruin', + 'bruit', + 'brule', + 'brume', + 'brung', + 'brusk', + 'brust', + 'bruts', + 'buats', + 'buaze', + 'bubal', + 'bubas', + 'bubba', + 'bubbe', + 'bubby', + 'bubus', + 'buchu', + 'bucko', + 'bucks', + 'bucku', + 'budas', + 'budis', + 'budos', + 'buffa', + 'buffe', + 'buffi', + 'buffo', + 'buffs', + 'buffy', + 'bufos', + 'bufty', + 'buhls', + 'buhrs', + 'buiks', + 'buist', + 'bukes', + 'bulbs', + 'bulgy', + 'bulks', + 'bulla', + 'bulls', + 'bulse', + 'bumbo', + 'bumfs', + 'bumph', + 'bumps', + 'bumpy', + 'bunas', + 'bunce', + 'bunco', + 'bunde', + 'bundh', + 'bunds', + 'bundt', + 'bundu', + 'bundy', + 'bungs', + 'bungy', + 'bunia', + 'bunje', + 'bunjy', + 'bunko', + 'bunks', + 'bunns', + 'bunts', + 'bunty', + 'bunya', + 'buoys', + 'buppy', + 'buran', + 'buras', + 'burbs', + 'burds', + 'buret', + 'burfi', + 'burgh', + 'burgs', + 'burin', + 'burka', + 'burke', + 'burks', + 'burls', + 'burns', + 'buroo', + 'burps', + 'burqa', + 'burro', + 'burrs', + 'burry', + 'bursa', + 'burse', + 'busby', + 'buses', + 'busks', + 'busky', + 'bussu', + 'busti', + 'busts', + 'busty', + 'buteo', + 'butes', + 'butle', + 'butoh', + 'butts', + 'butty', + 'butut', + 'butyl', + 'buzzy', + 'bwana', + 'bwazi', + 'byded', + 'bydes', + 'byked', + 'bykes', + 'byres', + 'byrls', + 'byssi', + 'bytes', + 'byway', + 'caaed', + 'cabas', + 'caber', + 'cabob', + 'caboc', + 'cabre', + 'cacas', + 'cacks', + 'cacky', + 'cadee', + 'cades', + 'cadge', + 'cadgy', + 'cadie', + 'cadis', + 'cadre', + 'caeca', + 'caese', + 'cafes', + 'caffs', + 'caged', + 'cager', + 'cages', + 'cagot', + 'cahow', + 'caids', + 'cains', + 'caird', + 'cajon', + 'cajun', + 'caked', + 'cakes', + 'cakey', + 'calfs', + 'calid', + 'calif', + 'calix', + 'calks', + 'calla', + 'calls', + 'calms', + 'calmy', + 'calos', + 'calpa', + 'calps', + 'calve', + 'calyx', + 'caman', + 'camas', + 'cames', + 'camis', + 'camos', + 'campi', + 'campo', + 'camps', + 'campy', + 'camus', + 'caned', + 'caneh', + 'caner', + 'canes', + 'cangs', + 'canid', + 'canna', + 'canns', + 'canso', + 'canst', + 'canto', + 'cants', + 'canty', + 'capas', + 'caped', + 'capes', + 'capex', + 'caphs', + 'capiz', + 'caple', + 'capon', + 'capos', + 'capot', + 'capri', + 'capul', + 'carap', + 'carbo', + 'carbs', + 'carby', + 'cardi', + 'cards', + 'cardy', + 'cared', + 'carer', + 'cares', + 'caret', + 'carex', + 'carks', + 'carle', + 'carls', + 'carns', + 'carny', + 'carob', + 'carom', + 'caron', + 'carpi', + 'carps', + 'carrs', + 'carse', + 'carta', + 'carte', + 'carts', + 'carvy', + 'casas', + 'casco', + 'cased', + 'cases', + 'casks', + 'casky', + 'casts', + 'casus', + 'cates', + 'cauda', + 'cauks', + 'cauld', + 'cauls', + 'caums', + 'caups', + 'cauri', + 'causa', + 'cavas', + 'caved', + 'cavel', + 'caver', + 'caves', + 'cavie', + 'cawed', + 'cawks', + 'caxon', + 'ceaze', + 'cebid', + 'cecal', + 'cecum', + 'ceded', + 'ceder', + 'cedes', + 'cedis', + 'ceiba', + 'ceili', + 'ceils', + 'celeb', + 'cella', + 'celli', + 'cells', + 'celom', + 'celts', + 'cense', + 'cento', + 'cents', + 'centu', + 'ceorl', + 'cepes', + 'cerci', + 'cered', + 'ceres', + 'cerge', + 'ceria', + 'ceric', + 'cerne', + 'ceroc', + 'ceros', + 'certs', + 'certy', + 'cesse', + 'cesta', + 'cesti', + 'cetes', + 'cetyl', + 'cezve', + 'chace', + 'chack', + 'chaco', + 'chado', + 'chads', + 'chaft', + 'chais', + 'chals', + 'chams', + 'chana', + 'chang', + 'chank', + 'chape', + 'chaps', + 'chapt', + 'chara', + 'chare', + 'chark', + 'charr', + 'chars', + 'chary', + 'chats', + 'chave', + 'chavs', + 'chawk', + 'chaws', + 'chaya', + 'chays', + 'cheep', + 'chefs', + 'cheka', + 'chela', + 'chelp', + 'chemo', + 'chems', + 'chere', + 'chert', + 'cheth', + 'chevy', + 'chews', + 'chewy', + 'chiao', + 'chias', + 'chibs', + 'chica', + 'chich', + 'chico', + 'chics', + 'chiel', + 'chiks', + 'chile', + 'chimb', + 'chimo', + 'chimp', + 'chine', + 'ching', + 'chink', + 'chino', + 'chins', + 'chips', + 'chirk', + 'chirl', + 'chirm', + 'chiro', + 'chirr', + 'chirt', + 'chiru', + 'chits', + 'chive', + 'chivs', + 'chivy', + 'chizz', + 'choco', + 'chocs', + 'chode', + 'chogs', + 'choil', + 'choko', + 'choky', + 'chola', + 'choli', + 'cholo', + 'chomp', + 'chons', + 'choof', + 'chook', + 'choom', + 'choon', + 'chops', + 'chota', + 'chott', + 'chout', + 'choux', + 'chowk', + 'chows', + 'chubs', + 'chufa', + 'chuff', + 'chugs', + 'chums', + 'churl', + 'churr', + 'chuse', + 'chuts', + 'chyle', + 'chyme', + 'chynd', + 'cibol', + 'cided', + 'cides', + 'ciels', + 'ciggy', + 'cilia', + 'cills', + 'cimar', + 'cimex', + 'cinct', + 'cines', + 'cinqs', + 'cions', + 'cippi', + 'circs', + 'cires', + 'cirls', + 'cirri', + 'cisco', + 'cissy', + 'cists', + 'cital', + 'cited', + 'citer', + 'cites', + 'cives', + 'civet', + 'civie', + 'civvy', + 'clach', + 'clade', + 'clads', + 'claes', + 'clags', + 'clame', + 'clams', + 'clans', + 'claps', + 'clapt', + 'claro', + 'clart', + 'clary', + 'clast', + 'clats', + 'claut', + 'clave', + 'clavi', + 'claws', + 'clays', + 'cleck', + 'cleek', + 'cleep', + 'clefs', + 'clegs', + 'cleik', + 'clems', + 'clepe', + 'clept', + 'cleve', + 'clews', + 'clied', + 'clies', + 'clift', + 'clime', + 'cline', + 'clint', + 'clipe', + 'clips', + 'clipt', + 'clits', + 'cloam', + 'clods', + 'cloff', + 'clogs', + 'cloke', + 'clomb', + 'clomp', + 'clonk', + 'clons', + 'cloop', + 'cloot', + 'clops', + 'clote', + 'clots', + 'clour', + 'clous', + 'clows', + 'cloye', + 'cloys', + 'cloze', + 'clubs', + 'clues', + 'cluey', + 'clunk', + 'clype', + 'cnida', + 'coact', + 'coady', + 'coala', + 'coals', + 'coaly', + 'coapt', + 'coarb', + 'coate', + 'coati', + 'coats', + 'cobbs', + 'cobby', + 'cobia', + 'coble', + 'cobza', + 'cocas', + 'cocci', + 'cocco', + 'cocks', + 'cocky', + 'cocos', + 'codas', + 'codec', + 'coded', + 'coden', + 'coder', + 'codes', + 'codex', + 'codon', + 'coeds', + 'coffs', + 'cogie', + 'cogon', + 'cogue', + 'cohab', + 'cohen', + 'cohoe', + 'cohog', + 'cohos', + 'coifs', + 'coign', + 'coils', + 'coins', + 'coirs', + 'coits', + 'coked', + 'cokes', + 'colas', + 'colby', + 'colds', + 'coled', + 'coles', + 'coley', + 'colic', + 'colin', + 'colls', + 'colly', + 'colog', + 'colts', + 'colza', + 'comae', + 'comal', + 'comas', + 'combe', + 'combi', + 'combo', + 'combs', + 'comby', + 'comer', + 'comes', + 'comix', + 'commo', + 'comms', + 'commy', + 'compo', + 'comps', + 'compt', + 'comte', + 'comus', + 'coned', + 'cones', + 'coney', + 'confs', + 'conga', + 'conge', + 'congo', + 'conia', + 'conin', + 'conks', + 'conky', + 'conne', + 'conns', + 'conte', + 'conto', + 'conus', + 'convo', + 'cooch', + 'cooed', + 'cooee', + 'cooer', + 'cooey', + 'coofs', + 'cooks', + 'cooky', + 'cools', + 'cooly', + 'coomb', + 'cooms', + 'coomy', + 'coons', + 'coops', + 'coopt', + 'coost', + 'coots', + 'cooze', + 'copal', + 'copay', + 'coped', + 'copen', + 'coper', + 'copes', + 'coppy', + 'copra', + 'copsy', + 'coqui', + 'coram', + 'corbe', + 'corby', + 'cords', + 'cored', + 'cores', + 'corey', + 'corgi', + 'coria', + 'corks', + 'corky', + 'corms', + 'corni', + 'corno', + 'corns', + 'cornu', + 'corps', + 'corse', + 'corso', + 'cosec', + 'cosed', + 'coses', + 'coset', + 'cosey', + 'cosie', + 'costa', + 'coste', + 'costs', + 'cotan', + 'coted', + 'cotes', + 'coths', + 'cotta', + 'cotts', + 'coude', + 'coups', + 'courb', + 'courd', + 'coure', + 'cours', + 'couta', + 'couth', + 'coved', + 'coves', + 'covin', + 'cowal', + 'cowan', + 'cowed', + 'cowks', + 'cowls', + 'cowps', + 'cowry', + 'coxae', + 'coxal', + 'coxed', + 'coxes', + 'coxib', + 'coyau', + 'coyed', + 'coyer', + 'coypu', + 'cozed', + 'cozen', + 'cozes', + 'cozey', + 'cozie', + 'craal', + 'crabs', + 'crags', + 'craic', + 'craig', + 'crake', + 'crame', + 'crams', + 'crans', + 'crape', + 'craps', + 'crapy', + 'crare', + 'craws', + 'crays', + 'creds', + 'creel', + 'crees', + 'crems', + 'crena', + 'creps', + 'crepy', + 'crewe', + 'crews', + 'crias', + 'cribs', + 'cries', + 'crims', + 'crine', + 'crios', + 'cripe', + 'crips', + 'crise', + 'crith', + 'crits', + 'croci', + 'crocs', + 'croft', + 'crogs', + 'cromb', + 'crome', + 'cronk', + 'crons', + 'crool', + 'croon', + 'crops', + 'crore', + 'crost', + 'crout', + 'crows', + 'croze', + 'cruck', + 'crudo', + 'cruds', + 'crudy', + 'crues', + 'cruet', + 'cruft', + 'crunk', + 'cruor', + 'crura', + 'cruse', + 'crusy', + 'cruve', + 'crwth', + 'cryer', + 'ctene', + 'cubby', + 'cubeb', + 'cubed', + 'cuber', + 'cubes', + 'cubit', + 'cuddy', + 'cuffo', + 'cuffs', + 'cuifs', + 'cuing', + 'cuish', + 'cuits', + 'cukes', + 'culch', + 'culet', + 'culex', + 'culls', + 'cully', + 'culms', + 'culpa', + 'culti', + 'cults', + 'culty', + 'cumec', + 'cundy', + 'cunei', + 'cunit', + 'cunts', + 'cupel', + 'cupid', + 'cuppa', + 'cuppy', + 'curat', + 'curbs', + 'curch', + 'curds', + 'curdy', + 'cured', + 'curer', + 'cures', + 'curet', + 'curfs', + 'curia', + 'curie', + 'curli', + 'curls', + 'curns', + 'curny', + 'currs', + 'cursi', + 'curst', + 'cusec', + 'cushy', + 'cusks', + 'cusps', + 'cuspy', + 'cusso', + 'cusum', + 'cutch', + 'cuter', + 'cutes', + 'cutey', + 'cutin', + 'cutis', + 'cutto', + 'cutty', + 'cutup', + 'cuvee', + 'cuzes', + 'cwtch', + 'cyano', + 'cyans', + 'cycad', + 'cycas', + 'cyclo', + 'cyder', + 'cylix', + 'cymae', + 'cymar', + 'cymas', + 'cymes', + 'cymol', + 'cysts', + 'cytes', + 'cyton', + 'czars', + 'daals', + 'dabba', + 'daces', + 'dacha', + 'dacks', + 'dadah', + 'dadas', + 'dados', + 'daffs', + 'daffy', + 'dagga', + 'daggy', + 'dagos', + 'dahls', + 'daiko', + 'daine', + 'daint', + 'daker', + 'daled', + 'dales', + 'dalis', + 'dalle', + 'dalts', + 'daman', + 'damar', + 'dames', + 'damme', + 'damns', + 'damps', + 'dampy', + 'dancy', + 'dangs', + 'danio', + 'danks', + 'danny', + 'dants', + 'daraf', + 'darbs', + 'darcy', + 'dared', + 'darer', + 'dares', + 'darga', + 'dargs', + 'daric', + 'daris', + 'darks', + 'darky', + 'darns', + 'darre', + 'darts', + 'darzi', + 'dashi', + 'dashy', + 'datal', + 'dated', + 'dater', + 'dates', + 'datos', + 'datto', + 'daube', + 'daubs', + 'dauby', + 'dauds', + 'dault', + 'daurs', + 'dauts', + 'daven', + 'davit', + 'dawah', + 'dawds', + 'dawed', + 'dawen', + 'dawks', + 'dawns', + 'dawts', + 'dayan', + 'daych', + 'daynt', + 'dazed', + 'dazer', + 'dazes', + 'deads', + 'deair', + 'deals', + 'deans', + 'deare', + 'dearn', + 'dears', + 'deary', + 'deash', + 'deave', + 'deaws', + 'deawy', + 'debag', + 'debby', + 'debel', + 'debes', + 'debts', + 'debud', + 'debur', + 'debus', + 'debye', + 'decad', + 'decaf', + 'decan', + 'decko', + 'decks', + 'decos', + 'dedal', + 'deeds', + 'deedy', + 'deely', + 'deems', + 'deens', + 'deeps', + 'deere', + 'deers', + 'deets', + 'deeve', + 'deevs', + 'defat', + 'deffo', + 'defis', + 'defog', + 'degas', + 'degum', + 'degus', + 'deice', + 'deids', + 'deify', + 'deils', + 'deism', + 'deist', + 'deked', + 'dekes', + 'dekko', + 'deled', + 'deles', + 'delfs', + 'delft', + 'delis', + 'dells', + 'delly', + 'delos', + 'delph', + 'delts', + 'deman', + 'demes', + 'demic', + 'demit', + 'demob', + 'demoi', + 'demos', + 'dempt', + 'denar', + 'denay', + 'dench', + 'denes', + 'denet', + 'denis', + 'dents', + 'deoxy', + 'derat', + 'deray', + 'dered', + 'deres', + 'derig', + 'derma', + 'derms', + 'derns', + 'derny', + 'deros', + 'derro', + 'derry', + 'derth', + 'dervs', + 'desex', + 'deshi', + 'desis', + 'desks', + 'desse', + 'devas', + 'devel', + 'devis', + 'devon', + 'devos', + 'devot', + 'dewan', + 'dewar', + 'dewax', + 'dewed', + 'dexes', + 'dexie', + 'dhaba', + 'dhaks', + 'dhals', + 'dhikr', + 'dhobi', + 'dhole', + 'dholl', + 'dhols', + 'dhoti', + 'dhows', + 'dhuti', + 'diact', + 'dials', + 'diane', + 'diazo', + 'dibbs', + 'diced', + 'dicer', + 'dices', + 'dicht', + 'dicks', + 'dicky', + 'dicot', + 'dicta', + 'dicts', + 'dicty', + 'diddy', + 'didie', + 'didos', + 'didst', + 'diebs', + 'diels', + 'diene', + 'diets', + 'diffs', + 'dight', + 'dikas', + 'diked', + 'diker', + 'dikes', + 'dikey', + 'dildo', + 'dilli', + 'dills', + 'dimbo', + 'dimer', + 'dimes', + 'dimps', + 'dinar', + 'dined', + 'dines', + 'dinge', + 'dings', + 'dinic', + 'dinks', + 'dinky', + 'dinna', + 'dinos', + 'dints', + 'diols', + 'diota', + 'dippy', + 'dipso', + 'diram', + 'direr', + 'dirke', + 'dirks', + 'dirls', + 'dirts', + 'disas', + 'disci', + 'discs', + 'dishy', + 'disks', + 'disme', + 'dital', + 'ditas', + 'dited', + 'dites', + 'ditsy', + 'ditts', + 'ditzy', + 'divan', + 'divas', + 'dived', + 'dives', + 'divis', + 'divna', + 'divos', + 'divot', + 'divvy', + 'diwan', + 'dixie', + 'dixit', + 'diyas', + 'dizen', + 'djinn', + 'djins', + 'doabs', + 'doats', + 'dobby', + 'dobes', + 'dobie', + 'dobla', + 'dobra', + 'dobro', + 'docht', + 'docks', + 'docos', + 'docus', + 'doddy', + 'dodos', + 'doeks', + 'doers', + 'doest', + 'doeth', + 'doffs', + 'dogan', + 'doges', + 'dogey', + 'doggo', + 'doggy', + 'dogie', + 'dohyo', + 'doilt', + 'doily', + 'doits', + 'dojos', + 'dolce', + 'dolci', + 'doled', + 'doles', + 'dolia', + 'dolls', + 'dolma', + 'dolor', + 'dolos', + 'dolts', + 'domal', + 'domed', + 'domes', + 'domic', + 'donah', + 'donas', + 'donee', + 'doner', + 'donga', + 'dongs', + 'donko', + 'donna', + 'donne', + 'donny', + 'donsy', + 'doobs', + 'dooce', + 'doody', + 'dooks', + 'doole', + 'dools', + 'dooly', + 'dooms', + 'doomy', + 'doona', + 'doorn', + 'doors', + 'doozy', + 'dopas', + 'doped', + 'doper', + 'dopes', + 'dorad', + 'dorba', + 'dorbs', + 'doree', + 'dores', + 'doric', + 'doris', + 'dorks', + 'dorky', + 'dorms', + 'dormy', + 'dorps', + 'dorrs', + 'dorsa', + 'dorse', + 'dorts', + 'dorty', + 'dosai', + 'dosas', + 'dosed', + 'doseh', + 'doser', + 'doses', + 'dosha', + 'dotal', + 'doted', + 'doter', + 'dotes', + 'dotty', + 'douar', + 'douce', + 'doucs', + 'douks', + 'doula', + 'douma', + 'doums', + 'doups', + 'doura', + 'douse', + 'douts', + 'doved', + 'doven', + 'dover', + 'doves', + 'dovie', + 'dowar', + 'dowds', + 'dowed', + 'dower', + 'dowie', + 'dowle', + 'dowls', + 'dowly', + 'downa', + 'downs', + 'dowps', + 'dowse', + 'dowts', + 'doxed', + 'doxes', + 'doxie', + 'doyen', + 'doyly', + 'dozed', + 'dozer', + 'dozes', + 'drabs', + 'drack', + 'draco', + 'draff', + 'drags', + 'drail', + 'drams', + 'drant', + 'draps', + 'drats', + 'drave', + 'draws', + 'drays', + 'drear', + 'dreck', + 'dreed', + 'dreer', + 'drees', + 'dregs', + 'dreks', + 'drent', + 'drere', + 'drest', + 'dreys', + 'dribs', + 'drice', + 'dries', + 'drily', + 'drips', + 'dript', + 'droid', + 'droil', + 'droke', + 'drole', + 'drome', + 'drony', + 'droob', + 'droog', + 'drook', + 'drops', + 'dropt', + 'drouk', + 'drows', + 'drubs', + 'drugs', + 'drums', + 'drupe', + 'druse', + 'drusy', + 'druxy', + 'dryad', + 'dryas', + 'dsobo', + 'dsomo', + 'duads', + 'duals', + 'duans', + 'duars', + 'dubbo', + 'ducal', + 'ducat', + 'duces', + 'ducks', + 'ducky', + 'ducts', + 'duddy', + 'duded', + 'dudes', + 'duels', + 'duets', + 'duett', + 'duffs', + 'dufus', + 'duing', + 'duits', + 'dukas', + 'duked', + 'dukes', + 'dukka', + 'dulce', + 'dules', + 'dulia', + 'dulls', + 'dulse', + 'dumas', + 'dumbo', + 'dumbs', + 'dumka', + 'dumky', + 'dumps', + 'dunam', + 'dunch', + 'dunes', + 'dungs', + 'dungy', + 'dunks', + 'dunno', + 'dunny', + 'dunsh', + 'dunts', + 'duomi', + 'duomo', + 'duped', + 'duper', + 'dupes', + 'duple', + 'duply', + 'duppy', + 'dural', + 'duras', + 'dured', + 'dures', + 'durgy', + 'durns', + 'duroc', + 'duros', + 'duroy', + 'durra', + 'durrs', + 'durry', + 'durst', + 'durum', + 'durzi', + 'dusks', + 'dusts', + 'duxes', + 'dwaal', + 'dwale', + 'dwalm', + 'dwams', + 'dwang', + 'dwaum', + 'dweeb', + 'dwile', + 'dwine', + 'dyads', + 'dyers', + 'dyked', + 'dykes', + 'dykey', + 'dykon', + 'dynel', + 'dynes', + 'dzhos', + 'eagre', + 'ealed', + 'eales', + 'eaned', + 'eards', + 'eared', + 'earls', + 'earns', + 'earnt', + 'earst', + 'eased', + 'easer', + 'eases', + 'easle', + 'easts', + 'eathe', + 'eaved', + 'eaves', + 'ebbed', + 'ebbet', + 'ebons', + 'ebook', + 'ecads', + 'eched', + 'eches', + 'echos', + 'ecrus', + 'edema', + 'edged', + 'edger', + 'edges', + 'edile', + 'edits', + 'educe', + 'educt', + 'eejit', + 'eensy', + 'eeven', + 'eevns', + 'effed', + 'egads', + 'egers', + 'egest', + 'eggar', + 'egged', + 'egger', + 'egmas', + 'ehing', + 'eider', + 'eidos', + 'eigne', + 'eiked', + 'eikon', + 'eilds', + 'eisel', + 'ejido', + 'ekkas', + 'elain', + 'eland', + 'elans', + 'elchi', + 'eldin', + 'elemi', + 'elfed', + 'eliad', + 'elint', + 'elmen', + 'eloge', + 'elogy', + 'eloin', + 'elops', + 'elpee', + 'elsin', + 'elute', + 'elvan', + 'elven', + 'elver', + 'elves', + 'emacs', + 'embar', + 'embay', + 'embog', + 'embow', + 'embox', + 'embus', + 'emeer', + 'emend', + 'emerg', + 'emery', + 'emeus', + 'emics', + 'emirs', + 'emits', + 'emmas', + 'emmer', + 'emmet', + 'emmew', + 'emmys', + 'emoji', + 'emong', + 'emote', + 'emove', + 'empts', + 'emule', + 'emure', + 'emyde', + 'emyds', + 'enarm', + 'enate', + 'ended', + 'ender', + 'endew', + 'endue', + 'enews', + 'enfix', + 'eniac', + 'enlit', + 'enmew', + 'ennog', + 'enoki', + 'enols', + 'enorm', + 'enows', + 'enrol', + 'ensew', + 'ensky', + 'entia', + 'enure', + 'enurn', + 'envoi', + 'enzym', + 'eorls', + 'eosin', + 'epact', + 'epees', + 'ephah', + 'ephas', + 'ephod', + 'ephor', + 'epics', + 'epode', + 'epopt', + 'epris', + 'eques', + 'equid', + 'erbia', + 'erevs', + 'ergon', + 'ergos', + 'ergot', + 'erhus', + 'erica', + 'erick', + 'erics', + 'ering', + 'erned', + 'ernes', + 'erose', + 'erred', + 'erses', + 'eruct', + 'erugo', + 'eruvs', + 'erven', + 'ervil', + 'escar', + 'escot', + 'esile', + 'eskar', + 'esker', + 'esnes', + 'esses', + 'estoc', + 'estop', + 'estro', + 'etage', + 'etape', + 'etats', + 'etens', + 'ethal', + 'ethne', + 'ethyl', + 'etics', + 'etnas', + 'ettin', + 'ettle', + 'etuis', + 'etwee', + 'etyma', + 'eughs', + 'euked', + 'eupad', + 'euros', + 'eusol', + 'evens', + 'evert', + 'evets', + 'evhoe', + 'evils', + 'evite', + 'evohe', + 'ewers', + 'ewest', + 'ewhow', + 'ewked', + 'exams', + 'exeat', + 'execs', + 'exeem', + 'exeme', + 'exfil', + 'exies', + 'exine', + 'exing', + 'exits', + 'exode', + 'exome', + 'exons', + 'expat', + 'expos', + 'exude', + 'exuls', + 'exurb', + 'eyass', + 'eyers', + 'eyots', + 'eyras', + 'eyres', + 'eyrie', + 'eyrir', + 'ezine', + 'fabby', + 'faced', + 'facer', + 'faces', + 'facia', + 'facta', + 'facts', + 'faddy', + 'faded', + 'fader', + 'fades', + 'fadge', + 'fados', + 'faena', + 'faery', + 'faffs', + 'faffy', + 'faggy', + 'fagin', + 'fagot', + 'faiks', + 'fails', + 'faine', + 'fains', + 'fairs', + 'faked', + 'faker', + 'fakes', + 'fakey', + 'fakie', + 'fakir', + 'falaj', + 'falls', + 'famed', + 'fames', + 'fanal', + 'fands', + 'fanes', + 'fanga', + 'fango', + 'fangs', + 'fanks', + 'fanon', + 'fanos', + 'fanum', + 'faqir', + 'farad', + 'farci', + 'farcy', + 'fards', + 'fared', + 'farer', + 'fares', + 'farle', + 'farls', + 'farms', + 'faros', + 'farro', + 'farse', + 'farts', + 'fasci', + 'fasti', + 'fasts', + 'fated', + 'fates', + 'fatly', + 'fatso', + 'fatwa', + 'faugh', + 'fauld', + 'fauns', + 'faurd', + 'fauts', + 'fauve', + 'favas', + 'favel', + 'faver', + 'faves', + 'favus', + 'fawns', + 'fawny', + 'faxed', + 'faxes', + 'fayed', + 'fayer', + 'fayne', + 'fayre', + 'fazed', + 'fazes', + 'feals', + 'feare', + 'fears', + 'feart', + 'fease', + 'feats', + 'feaze', + 'feces', + 'fecht', + 'fecit', + 'fecks', + 'fedex', + 'feebs', + 'feeds', + 'feels', + 'feens', + 'feers', + 'feese', + 'feeze', + 'fehme', + 'feint', + 'feist', + 'felch', + 'felid', + 'fells', + 'felly', + 'felts', + 'felty', + 'femal', + 'femes', + 'femmy', + 'fends', + 'fendy', + 'fenis', + 'fenks', + 'fenny', + 'fents', + 'feods', + 'feoff', + 'ferer', + 'feres', + 'feria', + 'ferly', + 'fermi', + 'ferms', + 'ferns', + 'ferny', + 'fesse', + 'festa', + 'fests', + 'festy', + 'fetas', + 'feted', + 'fetes', + 'fetor', + 'fetta', + 'fetts', + 'fetwa', + 'feuar', + 'feuds', + 'feued', + 'feyed', + 'feyer', + 'feyly', + 'fezes', + 'fezzy', + 'fiars', + 'fiats', + 'fibro', + 'fices', + 'fiche', + 'fichu', + 'ficin', + 'ficos', + 'fides', + 'fidge', + 'fidos', + 'fiefs', + 'fient', + 'fiere', + 'fiers', + 'fiest', + 'fifed', + 'fifer', + 'fifes', + 'fifis', + 'figgy', + 'figos', + 'fiked', + 'fikes', + 'filar', + 'filch', + 'filed', + 'files', + 'filii', + 'filks', + 'fille', + 'fillo', + 'fills', + 'filmi', + 'films', + 'filos', + 'filum', + 'finca', + 'finds', + 'fined', + 'fines', + 'finis', + 'finks', + 'finny', + 'finos', + 'fiord', + 'fiqhs', + 'fique', + 'fired', + 'firer', + 'fires', + 'firie', + 'firks', + 'firms', + 'firns', + 'firry', + 'firth', + 'fiscs', + 'fisks', + 'fists', + 'fisty', + 'fitch', + 'fitly', + 'fitna', + 'fitte', + 'fitts', + 'fiver', + 'fives', + 'fixed', + 'fixes', + 'fixit', + 'fjeld', + 'flabs', + 'flaff', + 'flags', + 'flaks', + 'flamm', + 'flams', + 'flamy', + 'flane', + 'flans', + 'flaps', + 'flary', + 'flats', + 'flava', + 'flawn', + 'flaws', + 'flawy', + 'flaxy', + 'flays', + 'fleam', + 'fleas', + 'fleek', + 'fleer', + 'flees', + 'flegs', + 'fleme', + 'fleur', + 'flews', + 'flexi', + 'flexo', + 'fleys', + 'flics', + 'flied', + 'flies', + 'flimp', + 'flims', + 'flips', + 'flirs', + 'flisk', + 'flite', + 'flits', + 'flitt', + 'flobs', + 'flocs', + 'floes', + 'flogs', + 'flong', + 'flops', + 'flors', + 'flory', + 'flosh', + 'flota', + 'flote', + 'flows', + 'flubs', + 'flued', + 'flues', + 'fluey', + 'fluky', + 'flump', + 'fluor', + 'flurr', + 'fluty', + 'fluyt', + 'flyby', + 'flype', + 'flyte', + 'foals', + 'foams', + 'foehn', + 'fogey', + 'fogie', + 'fogle', + 'fogou', + 'fohns', + 'foids', + 'foils', + 'foins', + 'folds', + 'foley', + 'folia', + 'folic', + 'folie', + 'folks', + 'folky', + 'fomes', + 'fonda', + 'fonds', + 'fondu', + 'fones', + 'fonly', + 'fonts', + 'foods', + 'foody', + 'fools', + 'foots', + 'footy', + 'foram', + 'forbs', + 'forby', + 'fordo', + 'fords', + 'forel', + 'fores', + 'forex', + 'forks', + 'forky', + 'forme', + 'forms', + 'forts', + 'forza', + 'forze', + 'fossa', + 'fosse', + 'fouat', + 'fouds', + 'fouer', + 'fouet', + 'foule', + 'fouls', + 'fount', + 'fours', + 'fouth', + 'fovea', + 'fowls', + 'fowth', + 'foxed', + 'foxes', + 'foxie', + 'foyle', + 'foyne', + 'frabs', + 'frack', + 'fract', + 'frags', + 'fraim', + 'franc', + 'frape', + 'fraps', + 'frass', + 'frate', + 'frati', + 'frats', + 'fraus', + 'frays', + 'frees', + 'freet', + 'freit', + 'fremd', + 'frena', + 'freon', + 'frere', + 'frets', + 'fribs', + 'frier', + 'fries', + 'frigs', + 'frise', + 'frist', + 'frith', + 'frits', + 'fritt', + 'frize', + 'frizz', + 'froes', + 'frogs', + 'frons', + 'frore', + 'frorn', + 'frory', + 'frosh', + 'frows', + 'frowy', + 'frugs', + 'frump', + 'frush', + 'frust', + 'fryer', + 'fubar', + 'fubby', + 'fubsy', + 'fucks', + 'fucus', + 'fuddy', + 'fudgy', + 'fuels', + 'fuero', + 'fuffs', + 'fuffy', + 'fugal', + 'fuggy', + 'fugie', + 'fugio', + 'fugle', + 'fugly', + 'fugus', + 'fujis', + 'fulls', + 'fumed', + 'fumer', + 'fumes', + 'fumet', + 'fundi', + 'funds', + 'fundy', + 'fungo', + 'fungs', + 'funks', + 'fural', + 'furan', + 'furca', + 'furls', + 'furol', + 'furrs', + 'furth', + 'furze', + 'furzy', + 'fused', + 'fusee', + 'fusel', + 'fuses', + 'fusil', + 'fusks', + 'fusts', + 'fusty', + 'futon', + 'fuzed', + 'fuzee', + 'fuzes', + 'fuzil', + 'fyces', + 'fyked', + 'fykes', + 'fyles', + 'fyrds', + 'fytte', + 'gabba', + 'gabby', + 'gable', + 'gaddi', + 'gades', + 'gadge', + 'gadid', + 'gadis', + 'gadje', + 'gadjo', + 'gadso', + 'gaffs', + 'gaged', + 'gager', + 'gages', + 'gaids', + 'gains', + 'gairs', + 'gaita', + 'gaits', + 'gaitt', + 'gajos', + 'galah', + 'galas', + 'galax', + 'galea', + 'galed', + 'gales', + 'galls', + 'gally', + 'galop', + 'galut', + 'galvo', + 'gamas', + 'gamay', + 'gamba', + 'gambe', + 'gambo', + 'gambs', + 'gamed', + 'games', + 'gamey', + 'gamic', + 'gamin', + 'gamme', + 'gammy', + 'gamps', + 'ganch', + 'gandy', + 'ganef', + 'ganev', + 'gangs', + 'ganja', + 'ganof', + 'gants', + 'gaols', + 'gaped', + 'gaper', + 'gapes', + 'gapos', + 'gappy', + 'garbe', + 'garbo', + 'garbs', + 'garda', + 'gares', + 'garis', + 'garms', + 'garni', + 'garre', + 'garth', + 'garum', + 'gases', + 'gasps', + 'gaspy', + 'gasts', + 'gatch', + 'gated', + 'gater', + 'gates', + 'gaths', + 'gator', + 'gauch', + 'gaucy', + 'gauds', + 'gauje', + 'gault', + 'gaums', + 'gaumy', + 'gaups', + 'gaurs', + 'gauss', + 'gauzy', + 'gavot', + 'gawcy', + 'gawds', + 'gawks', + 'gawps', + 'gawsy', + 'gayal', + 'gazal', + 'gazar', + 'gazed', + 'gazes', + 'gazon', + 'gazoo', + 'geals', + 'geans', + 'geare', + 'gears', + 'geats', + 'gebur', + 'gecks', + 'geeks', + 'geeps', + 'geest', + 'geist', + 'geits', + 'gelds', + 'gelee', + 'gelid', + 'gelly', + 'gelts', + 'gemel', + 'gemma', + 'gemmy', + 'gemot', + 'genal', + 'genas', + 'genes', + 'genet', + 'genic', + 'genii', + 'genip', + 'genny', + 'genoa', + 'genom', + 'genro', + 'gents', + 'genty', + 'genua', + 'genus', + 'geode', + 'geoid', + 'gerah', + 'gerbe', + 'geres', + 'gerle', + 'germs', + 'germy', + 'gerne', + 'gesse', + 'gesso', + 'geste', + 'gests', + 'getas', + 'getup', + 'geums', + 'geyan', + 'geyer', + 'ghast', + 'ghats', + 'ghaut', + 'ghazi', + 'ghees', + 'ghest', + 'ghyll', + 'gibed', + 'gibel', + 'giber', + 'gibes', + 'gibli', + 'gibus', + 'gifts', + 'gigas', + 'gighe', + 'gigot', + 'gigue', + 'gilas', + 'gilds', + 'gilet', + 'gills', + 'gilly', + 'gilpy', + 'gilts', + 'gimel', + 'gimme', + 'gimps', + 'gimpy', + 'ginch', + 'ginge', + 'gings', + 'ginks', + 'ginny', + 'ginzo', + 'gipon', + 'gippo', + 'gippy', + 'girds', + 'girls', + 'girns', + 'giron', + 'giros', + 'girrs', + 'girsh', + 'girts', + 'gismo', + 'gisms', + 'gists', + 'gitch', + 'gites', + 'giust', + 'gived', + 'gives', + 'gizmo', + 'glace', + 'glads', + 'glady', + 'glaik', + 'glair', + 'glams', + 'glans', + 'glary', + 'glaum', + 'glaur', + 'glazy', + 'gleba', + 'glebe', + 'gleby', + 'glede', + 'gleds', + 'gleed', + 'gleek', + 'glees', + 'gleet', + 'gleis', + 'glens', + 'glent', + 'gleys', + 'glial', + 'glias', + 'glibs', + 'gliff', + 'glift', + 'glike', + 'glime', + 'glims', + 'glisk', + 'glits', + 'glitz', + 'gloam', + 'globi', + 'globs', + 'globy', + 'glode', + 'glogg', + 'gloms', + 'gloop', + 'glops', + 'glost', + 'glout', + 'glows', + 'gloze', + 'glued', + 'gluer', + 'glues', + 'gluey', + 'glugs', + 'glume', + 'glums', + 'gluon', + 'glute', + 'gluts', + 'gnarl', + 'gnarr', + 'gnars', + 'gnats', + 'gnawn', + 'gnaws', + 'gnows', + 'goads', + 'goafs', + 'goals', + 'goary', + 'goats', + 'goaty', + 'goban', + 'gobar', + 'gobbi', + 'gobbo', + 'gobby', + 'gobis', + 'gobos', + 'godet', + 'godso', + 'goels', + 'goers', + 'goest', + 'goeth', + 'goety', + 'gofer', + 'goffs', + 'gogga', + 'gogos', + 'goier', + 'gojis', + 'golds', + 'goldy', + 'goles', + 'golfs', + 'golpe', + 'golps', + 'gombo', + 'gomer', + 'gompa', + 'gonch', + 'gonef', + 'gongs', + 'gonia', + 'gonif', + 'gonks', + 'gonna', + 'gonof', + 'gonys', + 'gonzo', + 'gooby', + 'goods', + 'goofs', + 'googs', + 'gooks', + 'gooky', + 'goold', + 'gools', + 'gooly', + 'goons', + 'goony', + 'goops', + 'goopy', + 'goors', + 'goory', + 'goosy', + 'gopak', + 'gopik', + 'goral', + 'goras', + 'gored', + 'gores', + 'goris', + 'gorms', + 'gormy', + 'gorps', + 'gorse', + 'gorsy', + 'gosht', + 'gosse', + 'gotch', + 'goths', + 'gothy', + 'gotta', + 'gouch', + 'gouks', + 'goura', + 'gouts', + 'gouty', + 'gowan', + 'gowds', + 'gowfs', + 'gowks', + 'gowls', + 'gowns', + 'goxes', + 'goyim', + 'goyle', + 'graal', + 'grabs', + 'grads', + 'graff', + 'graip', + 'grama', + 'grame', + 'gramp', + 'grams', + 'grana', + 'grans', + 'grapy', + 'gravs', + 'grays', + 'grebe', + 'grebo', + 'grece', + 'greek', + 'grees', + 'grege', + 'grego', + 'grein', + 'grens', + 'grese', + 'greve', + 'grews', + 'greys', + 'grice', + 'gride', + 'grids', + 'griff', + 'grift', + 'grigs', + 'grike', + 'grins', + 'griot', + 'grips', + 'gript', + 'gripy', + 'grise', + 'grist', + 'grisy', + 'grith', + 'grits', + 'grize', + 'groat', + 'grody', + 'grogs', + 'groks', + 'groma', + 'grone', + 'groof', + 'grosz', + 'grots', + 'grouf', + 'grovy', + 'grows', + 'grrls', + 'grrrl', + 'grubs', + 'grued', + 'grues', + 'grufe', + 'grume', + 'grump', + 'grund', + 'gryce', + 'gryde', + 'gryke', + 'grype', + 'grypt', + 'guaco', + 'guana', + 'guano', + 'guans', + 'guars', + 'gucks', + 'gucky', + 'gudes', + 'guffs', + 'gugas', + 'guids', + 'guimp', + 'guiro', + 'gulag', + 'gular', + 'gulas', + 'gules', + 'gulet', + 'gulfs', + 'gulfy', + 'gulls', + 'gulph', + 'gulps', + 'gulpy', + 'gumma', + 'gummi', + 'gumps', + 'gundy', + 'gunge', + 'gungy', + 'gunks', + 'gunky', + 'gunny', + 'guqin', + 'gurdy', + 'gurge', + 'gurls', + 'gurly', + 'gurns', + 'gurry', + 'gursh', + 'gurus', + 'gushy', + 'gusla', + 'gusle', + 'gusli', + 'gussy', + 'gusts', + 'gutsy', + 'gutta', + 'gutty', + 'guyed', + 'guyle', + 'guyot', + 'guyse', + 'gwine', + 'gyals', + 'gyans', + 'gybed', + 'gybes', + 'gyeld', + 'gymps', + 'gynae', + 'gynie', + 'gynny', + 'gynos', + 'gyoza', + 'gypos', + 'gyppo', + 'gyppy', + 'gyral', + 'gyred', + 'gyres', + 'gyron', + 'gyros', + 'gyrus', + 'gytes', + 'gyved', + 'gyves', + 'haafs', + 'haars', + 'hable', + 'habus', + 'hacek', + 'hacks', + 'hadal', + 'haded', + 'hades', + 'hadji', + 'hadst', + 'haems', + 'haets', + 'haffs', + 'hafiz', + 'hafts', + 'haggs', + 'hahas', + 'haick', + 'haika', + 'haiks', + 'haiku', + 'hails', + 'haily', + 'hains', + 'haint', + 'hairs', + 'haith', + 'hajes', + 'hajis', + 'hajji', + 'hakam', + 'hakas', + 'hakea', + 'hakes', + 'hakim', + 'hakus', + 'halal', + 'haled', + 'haler', + 'hales', + 'halfa', + 'halfs', + 'halid', + 'hallo', + 'halls', + 'halma', + 'halms', + 'halon', + 'halos', + 'halse', + 'halts', + 'halva', + 'halwa', + 'hamal', + 'hamba', + 'hamed', + 'hames', + 'hammy', + 'hamza', + 'hanap', + 'hance', + 'hanch', + 'hands', + 'hangi', + 'hangs', + 'hanks', + 'hanky', + 'hansa', + 'hanse', + 'hants', + 'haole', + 'haoma', + 'hapax', + 'haply', + 'happi', + 'hapus', + 'haram', + 'hards', + 'hared', + 'hares', + 'harim', + 'harks', + 'harls', + 'harms', + 'harns', + 'haros', + 'harps', + 'harts', + 'hashy', + 'hasks', + 'hasps', + 'hasta', + 'hated', + 'hates', + 'hatha', + 'hauds', + 'haufs', + 'haugh', + 'hauld', + 'haulm', + 'hauls', + 'hault', + 'hauns', + 'hause', + 'haver', + 'haves', + 'hawed', + 'hawks', + 'hawms', + 'hawse', + 'hayed', + 'hayer', + 'hayey', + 'hayle', + 'hazan', + 'hazed', + 'hazer', + 'hazes', + 'heads', + 'heald', + 'heals', + 'heame', + 'heaps', + 'heapy', + 'heare', + 'hears', + 'heast', + 'heats', + 'heben', + 'hebes', + 'hecht', + 'hecks', + 'heder', + 'hedgy', + 'heeds', + 'heedy', + 'heels', + 'heeze', + 'hefte', + 'hefts', + 'heids', + 'heigh', + 'heils', + 'heirs', + 'hejab', + 'hejra', + 'heled', + 'heles', + 'helio', + 'hells', + 'helms', + 'helos', + 'helot', + 'helps', + 'helve', + 'hemal', + 'hemes', + 'hemic', + 'hemin', + 'hemps', + 'hempy', + 'hench', + 'hends', + 'henge', + 'henna', + 'henny', + 'henry', + 'hents', + 'hepar', + 'herbs', + 'herby', + 'herds', + 'heres', + 'herls', + 'herma', + 'herms', + 'herns', + 'heros', + 'herry', + 'herse', + 'hertz', + 'herye', + 'hesps', + 'hests', + 'hetes', + 'heths', + 'heuch', + 'heugh', + 'hevea', + 'hewed', + 'hewer', + 'hewgh', + 'hexad', + 'hexed', + 'hexer', + 'hexes', + 'hexyl', + 'heyed', + 'hiant', + 'hicks', + 'hided', + 'hider', + 'hides', + 'hiems', + 'highs', + 'hight', + 'hijab', + 'hijra', + 'hiked', + 'hiker', + 'hikes', + 'hikoi', + 'hilar', + 'hilch', + 'hillo', + 'hills', + 'hilts', + 'hilum', + 'hilus', + 'himbo', + 'hinau', + 'hinds', + 'hings', + 'hinky', + 'hinny', + 'hints', + 'hiois', + 'hiply', + 'hired', + 'hiree', + 'hirer', + 'hires', + 'hissy', + 'hists', + 'hithe', + 'hived', + 'hiver', + 'hives', + 'hizen', + 'hoaed', + 'hoagy', + 'hoars', + 'hoary', + 'hoast', + 'hobos', + 'hocks', + 'hocus', + 'hodad', + 'hodja', + 'hoers', + 'hogan', + 'hogen', + 'hoggs', + 'hoghs', + 'hohed', + 'hoick', + 'hoied', + 'hoiks', + 'hoing', + 'hoise', + 'hokas', + 'hoked', + 'hokes', + 'hokey', + 'hokis', + 'hokku', + 'hokum', + 'holds', + 'holed', + 'holes', + 'holey', + 'holks', + 'holla', + 'hollo', + 'holme', + 'holms', + 'holon', + 'holos', + 'holts', + 'homas', + 'homed', + 'homes', + 'homey', + 'homie', + 'homme', + 'homos', + 'honan', + 'honda', + 'honds', + 'honed', + 'honer', + 'hones', + 'hongi', + 'hongs', + 'honks', + 'honky', + 'hooch', + 'hoods', + 'hoody', + 'hooey', + 'hoofs', + 'hooka', + 'hooks', + 'hooky', + 'hooly', + 'hoons', + 'hoops', + 'hoord', + 'hoors', + 'hoosh', + 'hoots', + 'hooty', + 'hoove', + 'hopak', + 'hoped', + 'hoper', + 'hopes', + 'hoppy', + 'horah', + 'horal', + 'horas', + 'horis', + 'horks', + 'horme', + 'horns', + 'horst', + 'horsy', + 'hosed', + 'hosel', + 'hosen', + 'hoser', + 'hoses', + 'hosey', + 'hosta', + 'hosts', + 'hotch', + 'hoten', + 'hotty', + 'houff', + 'houfs', + 'hough', + 'houri', + 'hours', + 'houts', + 'hovea', + 'hoved', + 'hoven', + 'hoves', + 'howbe', + 'howes', + 'howff', + 'howfs', + 'howks', + 'howls', + 'howre', + 'howso', + 'hoxed', + 'hoxes', + 'hoyas', + 'hoyed', + 'hoyle', + 'hubby', + 'hucks', + 'hudna', + 'hudud', + 'huers', + 'huffs', + 'huffy', + 'huger', + 'huggy', + 'huhus', + 'huias', + 'hulas', + 'hules', + 'hulks', + 'hulky', + 'hullo', + 'hulls', + 'hully', + 'humas', + 'humfs', + 'humic', + 'humps', + 'humpy', + 'hunks', + 'hunts', + 'hurds', + 'hurls', + 'hurly', + 'hurra', + 'hurst', + 'hurts', + 'hushy', + 'husks', + 'husos', + 'hutia', + 'huzza', + 'huzzy', + 'hwyls', + 'hydra', + 'hyens', + 'hygge', + 'hying', + 'hykes', + 'hylas', + 'hyleg', + 'hyles', + 'hylic', + 'hymns', + 'hynde', + 'hyoid', + 'hyped', + 'hypes', + 'hypha', + 'hyphy', + 'hypos', + 'hyrax', + 'hyson', + 'hythe', + 'iambi', + 'iambs', + 'ibrik', + 'icers', + 'iched', + 'iches', + 'ichor', + 'icier', + 'icker', + 'ickle', + 'icons', + 'ictal', + 'ictic', + 'ictus', + 'idant', + 'ideas', + 'idees', + 'ident', + 'idled', + 'idles', + 'idola', + 'idols', + 'idyls', + 'iftar', + 'igapo', + 'igged', + 'iglus', + 'ihram', + 'ikans', + 'ikats', + 'ikons', + 'ileac', + 'ileal', + 'ileum', + 'ileus', + 'iliad', + 'ilial', + 'ilium', + 'iller', + 'illth', + 'imago', + 'imams', + 'imari', + 'imaum', + 'imbar', + 'imbed', + 'imide', + 'imido', + 'imids', + 'imine', + 'imino', + 'immew', + 'immit', + 'immix', + 'imped', + 'impis', + 'impot', + 'impro', + 'imshi', + 'imshy', + 'inapt', + 'inarm', + 'inbye', + 'incel', + 'incle', + 'incog', + 'incus', + 'incut', + 'indew', + 'india', + 'indie', + 'indol', + 'indow', + 'indri', + 'indue', + 'inerm', + 'infix', + 'infos', + 'infra', + 'ingan', + 'ingle', + 'inion', + 'inked', + 'inker', + 'inkle', + 'inned', + 'innit', + 'inorb', + 'inrun', + 'inset', + 'inspo', + 'intel', + 'intil', + 'intis', + 'intra', + 'inula', + 'inure', + 'inurn', + 'inust', + 'invar', + 'inwit', + 'iodic', + 'iodid', + 'iodin', + 'iotas', + 'ippon', + 'irade', + 'irids', + 'iring', + 'irked', + 'iroko', + 'irone', + 'irons', + 'isbas', + 'ishes', + 'isled', + 'isles', + 'isnae', + 'issei', + 'istle', + 'items', + 'ither', + 'ivied', + 'ivies', + 'ixias', + 'ixnay', + 'ixora', + 'ixtle', + 'izard', + 'izars', + 'izzat', + 'jaaps', + 'jabot', + 'jacal', + 'jacks', + 'jacky', + 'jaded', + 'jades', + 'jafas', + 'jaffa', + 'jagas', + 'jager', + 'jaggs', + 'jaggy', + 'jagir', + 'jagra', + 'jails', + 'jaker', + 'jakes', + 'jakey', + 'jalap', + 'jalop', + 'jambe', + 'jambo', + 'jambs', + 'jambu', + 'james', + 'jammy', + 'jamon', + 'janes', + 'janns', + 'janny', + 'janty', + 'japan', + 'japed', + 'japer', + 'japes', + 'jarks', + 'jarls', + 'jarps', + 'jarta', + 'jarul', + 'jasey', + 'jaspe', + 'jasps', + 'jatos', + 'jauks', + 'jaups', + 'javas', + 'javel', + 'jawan', + 'jawed', + 'jaxie', + 'jeans', + 'jeats', + 'jebel', + 'jedis', + 'jeels', + 'jeely', + 'jeeps', + 'jeers', + 'jeeze', + 'jefes', + 'jeffs', + 'jehad', + 'jehus', + 'jelab', + 'jello', + 'jells', + 'jembe', + 'jemmy', + 'jenny', + 'jeons', + 'jerid', + 'jerks', + 'jerry', + 'jesse', + 'jests', + 'jesus', + 'jetes', + 'jeton', + 'jeune', + 'jewed', + 'jewie', + 'jhala', + 'jiaos', + 'jibba', + 'jibbs', + 'jibed', + 'jiber', + 'jibes', + 'jiffs', + 'jiggy', + 'jigot', + 'jihad', + 'jills', + 'jilts', + 'jimmy', + 'jimpy', + 'jingo', + 'jinks', + 'jinne', + 'jinni', + 'jinns', + 'jirds', + 'jirga', + 'jirre', + 'jisms', + 'jived', + 'jiver', + 'jives', + 'jivey', + 'jnana', + 'jobed', + 'jobes', + 'jocko', + 'jocks', + 'jocky', + 'jocos', + 'jodel', + 'joeys', + 'johns', + 'joins', + 'joked', + 'jokes', + 'jokey', + 'jokol', + 'joled', + 'joles', + 'jolls', + 'jolts', + 'jolty', + 'jomon', + 'jomos', + 'jones', + 'jongs', + 'jonty', + 'jooks', + 'joram', + 'jorum', + 'jotas', + 'jotty', + 'jotun', + 'joual', + 'jougs', + 'jouks', + 'joule', + 'jours', + 'jowar', + 'jowed', + 'jowls', + 'jowly', + 'joyed', + 'jubas', + 'jubes', + 'jucos', + 'judas', + 'judgy', + 'judos', + 'jugal', + 'jugum', + 'jujus', + 'juked', + 'jukes', + 'jukus', + 'julep', + 'jumar', + 'jumby', + 'jumps', + 'junco', + 'junks', + 'junky', + 'jupes', + 'jupon', + 'jural', + 'jurat', + 'jurel', + 'jures', + 'justs', + 'jutes', + 'jutty', + 'juves', + 'juvie', + 'kaama', + 'kabab', + 'kabar', + 'kabob', + 'kacha', + 'kacks', + 'kadai', + 'kades', + 'kadis', + 'kafir', + 'kagos', + 'kagus', + 'kahal', + 'kaiak', + 'kaids', + 'kaies', + 'kaifs', + 'kaika', + 'kaiks', + 'kails', + 'kaims', + 'kaing', + 'kains', + 'kakas', + 'kakis', + 'kalam', + 'kales', + 'kalif', + 'kalis', + 'kalpa', + 'kamas', + 'kames', + 'kamik', + 'kamis', + 'kamme', + 'kanae', + 'kanas', + 'kandy', + 'kaneh', + 'kanes', + 'kanga', + 'kangs', + 'kanji', + 'kants', + 'kanzu', + 'kaons', + 'kapas', + 'kaphs', + 'kapok', + 'kapow', + 'kapus', + 'kaput', + 'karas', + 'karat', + 'karks', + 'karns', + 'karoo', + 'karos', + 'karri', + 'karst', + 'karsy', + 'karts', + 'karzy', + 'kasha', + 'kasme', + 'katal', + 'katas', + 'katis', + 'katti', + 'kaugh', + 'kauri', + 'kauru', + 'kaury', + 'kaval', + 'kavas', + 'kawas', + 'kawau', + 'kawed', + 'kayle', + 'kayos', + 'kazis', + 'kazoo', + 'kbars', + 'kebar', + 'kebob', + 'kecks', + 'kedge', + 'kedgy', + 'keech', + 'keefs', + 'keeks', + 'keels', + 'keema', + 'keeno', + 'keens', + 'keeps', + 'keets', + 'keeve', + 'kefir', + 'kehua', + 'keirs', + 'kelep', + 'kelim', + 'kells', + 'kelly', + 'kelps', + 'kelpy', + 'kelts', + 'kelty', + 'kembo', + 'kembs', + 'kemps', + 'kempt', + 'kempy', + 'kenaf', + 'kench', + 'kendo', + 'kenos', + 'kente', + 'kents', + 'kepis', + 'kerbs', + 'kerel', + 'kerfs', + 'kerky', + 'kerma', + 'kerne', + 'kerns', + 'keros', + 'kerry', + 'kerve', + 'kesar', + 'kests', + 'ketas', + 'ketch', + 'ketes', + 'ketol', + 'kevel', + 'kevil', + 'kexes', + 'keyed', + 'keyer', + 'khadi', + 'khafs', + 'khans', + 'khaph', + 'khats', + 'khaya', + 'khazi', + 'kheda', + 'kheth', + 'khets', + 'khoja', + 'khors', + 'khoum', + 'khuds', + 'kiaat', + 'kiack', + 'kiang', + 'kibbe', + 'kibbi', + 'kibei', + 'kibes', + 'kibla', + 'kicks', + 'kicky', + 'kiddo', + 'kiddy', + 'kidel', + 'kidge', + 'kiefs', + 'kiers', + 'kieve', + 'kievs', + 'kight', + 'kikes', + 'kikoi', + 'kiley', + 'kilim', + 'kills', + 'kilns', + 'kilos', + 'kilps', + 'kilts', + 'kilty', + 'kimbo', + 'kinas', + 'kinda', + 'kinds', + 'kindy', + 'kines', + 'kings', + 'kinin', + 'kinks', + 'kinos', + 'kiore', + 'kipes', + 'kippa', + 'kipps', + 'kirby', + 'kirks', + 'kirns', + 'kirri', + 'kisan', + 'kissy', + 'kists', + 'kited', + 'kiter', + 'kites', + 'kithe', + 'kiths', + 'kitul', + 'kivas', + 'kiwis', + 'klang', + 'klaps', + 'klett', + 'klick', + 'klieg', + 'kliks', + 'klong', + 'kloof', + 'kluge', + 'klutz', + 'knags', + 'knaps', + 'knarl', + 'knars', + 'knaur', + 'knawe', + 'knees', + 'knell', + 'knish', + 'knits', + 'knive', + 'knobs', + 'knops', + 'knosp', + 'knots', + 'knout', + 'knowe', + 'knows', + 'knubs', + 'knurl', + 'knurr', + 'knurs', + 'knuts', + 'koans', + 'koaps', + 'koban', + 'kobos', + 'koels', + 'koffs', + 'kofta', + 'kogal', + 'kohas', + 'kohen', + 'kohls', + 'koine', + 'kojis', + 'kokam', + 'kokas', + 'koker', + 'kokra', + 'kokum', + 'kolas', + 'kolos', + 'kombu', + 'konbu', + 'kondo', + 'konks', + 'kooks', + 'kooky', + 'koori', + 'kopek', + 'kophs', + 'kopje', + 'koppa', + 'korai', + 'koras', + 'korat', + 'kores', + 'korma', + 'koros', + 'korun', + 'korus', + 'koses', + 'kotch', + 'kotos', + 'kotow', + 'koura', + 'kraal', + 'krabs', + 'kraft', + 'krais', + 'krait', + 'krang', + 'krans', + 'kranz', + 'kraut', + 'krays', + 'kreep', + 'kreng', + 'krewe', + 'krona', + 'krone', + 'kroon', + 'krubi', + 'krunk', + 'ksars', + 'kubie', + 'kudos', + 'kudus', + 'kudzu', + 'kufis', + 'kugel', + 'kuias', + 'kukri', + 'kukus', + 'kulak', + 'kulan', + 'kulas', + 'kulfi', + 'kumis', + 'kumys', + 'kuris', + 'kurre', + 'kurta', + 'kurus', + 'kusso', + 'kutas', + 'kutch', + 'kutis', + 'kutus', + 'kuzus', + 'kvass', + 'kvell', + 'kwela', + 'kyack', + 'kyaks', + 'kyang', + 'kyars', + 'kyats', + 'kybos', + 'kydst', + 'kyles', + 'kylie', + 'kylin', + 'kylix', + 'kyloe', + 'kynde', + 'kynds', + 'kypes', + 'kyrie', + 'kytes', + 'kythe', + 'laari', + 'labda', + 'labia', + 'labis', + 'labra', + 'laced', + 'lacer', + 'laces', + 'lacet', + 'lacey', + 'lacks', + 'laddy', + 'laded', + 'lader', + 'lades', + 'laers', + 'laevo', + 'lagan', + 'lahal', + 'lahar', + 'laich', + 'laics', + 'laids', + 'laigh', + 'laika', + 'laiks', + 'laird', + 'lairs', + 'lairy', + 'laith', + 'laity', + 'laked', + 'laker', + 'lakes', + 'lakhs', + 'lakin', + 'laksa', + 'laldy', + 'lalls', + 'lamas', + 'lambs', + 'lamby', + 'lamed', + 'lamer', + 'lames', + 'lamia', + 'lammy', + 'lamps', + 'lanai', + 'lanas', + 'lanch', + 'lande', + 'lands', + 'lanes', + 'lanks', + 'lants', + 'lapin', + 'lapis', + 'lapje', + 'larch', + 'lards', + 'lardy', + 'laree', + 'lares', + 'largo', + 'laris', + 'larks', + 'larky', + 'larns', + 'larnt', + 'larum', + 'lased', + 'laser', + 'lases', + 'lassi', + 'lassu', + 'lassy', + 'lasts', + 'latah', + 'lated', + 'laten', + 'latex', + 'lathi', + 'laths', + 'lathy', + 'latke', + 'latus', + 'lauan', + 'lauch', + 'lauds', + 'laufs', + 'laund', + 'laura', + 'laval', + 'lavas', + 'laved', + 'laver', + 'laves', + 'lavra', + 'lavvy', + 'lawed', + 'lawer', + 'lawin', + 'lawks', + 'lawns', + 'lawny', + 'laxed', + 'laxer', + 'laxes', + 'laxly', + 'layed', + 'layin', + 'layup', + 'lazar', + 'lazed', + 'lazes', + 'lazos', + 'lazzi', + 'lazzo', + 'leads', + 'leady', + 'leafs', + 'leaks', + 'leams', + 'leans', + 'leany', + 'leaps', + 'leare', + 'lears', + 'leary', + 'leats', + 'leavy', + 'leaze', + 'leben', + 'leccy', + 'ledes', + 'ledgy', + 'ledum', + 'leear', + 'leeks', + 'leeps', + 'leers', + 'leese', + 'leets', + 'leeze', + 'lefte', + 'lefts', + 'leger', + 'leges', + 'legge', + 'leggo', + 'legit', + 'lehrs', + 'lehua', + 'leirs', + 'leish', + 'leman', + 'lemed', + 'lemel', + 'lemes', + 'lemma', + 'lemme', + 'lends', + 'lenes', + 'lengs', + 'lenis', + 'lenos', + 'lense', + 'lenti', + 'lento', + 'leone', + 'lepid', + 'lepra', + 'lepta', + 'lered', + 'leres', + 'lerps', + 'lesbo', + 'leses', + 'lests', + 'letch', + 'lethe', + 'letup', + 'leuch', + 'leuco', + 'leuds', + 'leugh', + 'levas', + 'levee', + 'leves', + 'levin', + 'levis', + 'lewis', + 'lexes', + 'lexis', + 'lezes', + 'lezza', + 'lezzy', + 'liana', + 'liane', + 'liang', + 'liard', + 'liars', + 'liart', + 'liber', + 'libra', + 'libri', + 'lichi', + 'licht', + 'licit', + 'licks', + 'lidar', + 'lidos', + 'liefs', + 'liens', + 'liers', + 'lieus', + 'lieve', + 'lifer', + 'lifes', + 'lifts', + 'ligan', + 'liger', + 'ligge', + 'ligne', + 'liked', + 'liker', + 'likes', + 'likin', + 'lills', + 'lilos', + 'lilts', + 'liman', + 'limas', + 'limax', + 'limba', + 'limbi', + 'limbs', + 'limby', + 'limed', + 'limen', + 'limes', + 'limey', + 'limma', + 'limns', + 'limos', + 'limpa', + 'limps', + 'linac', + 'linch', + 'linds', + 'lindy', + 'lined', + 'lines', + 'liney', + 'linga', + 'lings', + 'lingy', + 'linin', + 'links', + 'linky', + 'linns', + 'linny', + 'linos', + 'lints', + 'linty', + 'linum', + 'linux', + 'lions', + 'lipas', + 'lipes', + 'lipin', + 'lipos', + 'lippy', + 'liras', + 'lirks', + 'lirot', + 'lisks', + 'lisle', + 'lisps', + 'lists', + 'litai', + 'litas', + 'lited', + 'liter', + 'lites', + 'litho', + 'liths', + 'litre', + 'lived', + 'liven', + 'lives', + 'livor', + 'livre', + 'llano', + 'loach', + 'loads', + 'loafs', + 'loams', + 'loans', + 'loast', + 'loave', + 'lobar', + 'lobed', + 'lobes', + 'lobos', + 'lobus', + 'loche', + 'lochs', + 'locie', + 'locis', + 'locks', + 'locos', + 'locum', + 'loden', + 'lodes', + 'loess', + 'lofts', + 'logan', + 'loges', + 'loggy', + 'logia', + 'logie', + 'logoi', + 'logon', + 'logos', + 'lohan', + 'loids', + 'loins', + 'loipe', + 'loirs', + 'lokes', + 'lolls', + 'lolly', + 'lolog', + 'lomas', + 'lomed', + 'lomes', + 'loner', + 'longa', + 'longe', + 'longs', + 'looby', + 'looed', + 'looey', + 'loofa', + 'loofs', + 'looie', + 'looks', + 'looky', + 'looms', + 'loons', + 'loony', + 'loops', + 'loord', + 'loots', + 'loped', + 'loper', + 'lopes', + 'loppy', + 'loral', + 'loran', + 'lords', + 'lordy', + 'lorel', + 'lores', + 'loric', + 'loris', + 'losed', + 'losel', + 'losen', + 'loses', + 'lossy', + 'lotah', + 'lotas', + 'lotes', + 'lotic', + 'lotos', + 'lotsa', + 'lotta', + 'lotte', + 'lotto', + 'lotus', + 'loued', + 'lough', + 'louie', + 'louis', + 'louma', + 'lound', + 'louns', + 'loupe', + 'loups', + 'loure', + 'lours', + 'loury', + 'louts', + 'lovat', + 'loved', + 'loves', + 'lovey', + 'lovie', + 'lowan', + 'lowed', + 'lowes', + 'lownd', + 'lowne', + 'lowns', + 'lowps', + 'lowry', + 'lowse', + 'lowts', + 'loxed', + 'loxes', + 'lozen', + 'luach', + 'luaus', + 'lubed', + 'lubes', + 'lubra', + 'luces', + 'lucks', + 'lucre', + 'ludes', + 'ludic', + 'ludos', + 'luffa', + 'luffs', + 'luged', + 'luger', + 'luges', + 'lulls', + 'lulus', + 'lumas', + 'lumbi', + 'lumme', + 'lummy', + 'lumps', + 'lunas', + 'lunes', + 'lunet', + 'lungi', + 'lungs', + 'lunks', + 'lunts', + 'lupin', + 'lured', + 'lurer', + 'lures', + 'lurex', + 'lurgi', + 'lurgy', + 'lurks', + 'lurry', + 'lurve', + 'luser', + 'lushy', + 'lusks', + 'lusts', + 'lusus', + 'lutea', + 'luted', + 'luter', + 'lutes', + 'luvvy', + 'luxed', + 'luxer', + 'luxes', + 'lweis', + 'lyams', + 'lyard', + 'lyart', + 'lyase', + 'lycea', + 'lycee', + 'lycra', + 'lymes', + 'lynes', + 'lyres', + 'lysed', + 'lyses', + 'lysin', + 'lysis', + 'lysol', + 'lyssa', + 'lyted', + 'lytes', + 'lythe', + 'lytic', + 'lytta', + 'maaed', + 'maare', + 'maars', + 'mabes', + 'macas', + 'maced', + 'macer', + 'maces', + 'mache', + 'machi', + 'machs', + 'macks', + 'macle', + 'macon', + 'madge', + 'madid', + 'madre', + 'maerl', + 'mafic', + 'mages', + 'maggs', + 'magot', + 'magus', + 'mahoe', + 'mahua', + 'mahwa', + 'maids', + 'maiko', + 'maiks', + 'maile', + 'maill', + 'mails', + 'maims', + 'mains', + 'maire', + 'mairs', + 'maise', + 'maist', + 'makar', + 'makes', + 'makis', + 'makos', + 'malam', + 'malar', + 'malas', + 'malax', + 'males', + 'malic', + 'malik', + 'malis', + 'malls', + 'malms', + 'malmy', + 'malts', + 'malty', + 'malus', + 'malva', + 'malwa', + 'mamas', + 'mamba', + 'mamee', + 'mamey', + 'mamie', + 'manas', + 'manat', + 'mandi', + 'maneb', + 'maned', + 'maneh', + 'manes', + 'manet', + 'mangs', + 'manis', + 'manky', + 'manna', + 'manos', + 'manse', + 'manta', + 'manto', + 'manty', + 'manul', + 'manus', + 'mapau', + 'maqui', + 'marae', + 'marah', + 'maras', + 'marcs', + 'mardy', + 'mares', + 'marge', + 'margs', + 'maria', + 'marid', + 'marka', + 'marks', + 'marle', + 'marls', + 'marly', + 'marms', + 'maron', + 'maror', + 'marra', + 'marri', + 'marse', + 'marts', + 'marvy', + 'masas', + 'mased', + 'maser', + 'mases', + 'mashy', + 'masks', + 'massa', + 'massy', + 'masts', + 'masty', + 'masus', + 'matai', + 'mated', + 'mater', + 'mates', + 'maths', + 'matin', + 'matlo', + 'matte', + 'matts', + 'matza', + 'matzo', + 'mauby', + 'mauds', + 'mauls', + 'maund', + 'mauri', + 'mausy', + 'mauts', + 'mauzy', + 'maven', + 'mavie', + 'mavin', + 'mavis', + 'mawed', + 'mawks', + 'mawky', + 'mawns', + 'mawrs', + 'maxed', + 'maxes', + 'maxis', + 'mayan', + 'mayas', + 'mayed', + 'mayos', + 'mayst', + 'mazed', + 'mazer', + 'mazes', + 'mazey', + 'mazut', + 'mbira', + 'meads', + 'meals', + 'meane', + 'means', + 'meany', + 'meare', + 'mease', + 'meath', + 'meats', + 'mebos', + 'mechs', + 'mecks', + 'medii', + 'medle', + 'meeds', + 'meers', + 'meets', + 'meffs', + 'meins', + 'meint', + 'meiny', + 'meith', + 'mekka', + 'melas', + 'melba', + 'melds', + 'melic', + 'melik', + 'mells', + 'melts', + 'melty', + 'memes', + 'memos', + 'menad', + 'mends', + 'mened', + 'menes', + 'menge', + 'mengs', + 'mensa', + 'mense', + 'mensh', + 'menta', + 'mento', + 'menus', + 'meous', + 'meows', + 'merch', + 'mercs', + 'merde', + 'mered', + 'merel', + 'merer', + 'meres', + 'meril', + 'meris', + 'merks', + 'merle', + 'merls', + 'merse', + 'mesal', + 'mesas', + 'mesel', + 'meses', + 'meshy', + 'mesic', + 'mesne', + 'meson', + 'messy', + 'mesto', + 'meted', + 'metes', + 'metho', + 'meths', + 'metic', + 'metif', + 'metis', + 'metol', + 'metre', + 'meuse', + 'meved', + 'meves', + 'mewed', + 'mewls', + 'meynt', + 'mezes', + 'mezze', + 'mezzo', + 'mhorr', + 'miaou', + 'miaow', + 'miasm', + 'miaul', + 'micas', + 'miche', + 'micht', + 'micks', + 'micky', + 'micos', + 'micra', + 'middy', + 'midgy', + 'midis', + 'miens', + 'mieve', + 'miffs', + 'miffy', + 'mifty', + 'miggs', + 'mihas', + 'mihis', + 'miked', + 'mikes', + 'mikra', + 'mikva', + 'milch', + 'milds', + 'miler', + 'miles', + 'milfs', + 'milia', + 'milko', + 'milks', + 'mille', + 'mills', + 'milor', + 'milos', + 'milpa', + 'milts', + 'milty', + 'miltz', + 'mimed', + 'mimeo', + 'mimer', + 'mimes', + 'mimsy', + 'minae', + 'minar', + 'minas', + 'mincy', + 'minds', + 'mined', + 'mines', + 'minge', + 'mings', + 'mingy', + 'minis', + 'minke', + 'minks', + 'minny', + 'minos', + 'mints', + 'mired', + 'mires', + 'mirex', + 'mirid', + 'mirin', + 'mirks', + 'mirky', + 'mirly', + 'miros', + 'mirvs', + 'mirza', + 'misch', + 'misdo', + 'mises', + 'misgo', + 'misos', + 'missa', + 'mists', + 'misty', + 'mitch', + 'miter', + 'mites', + 'mitis', + 'mitre', + 'mitts', + 'mixed', + 'mixen', + 'mixer', + 'mixes', + 'mixte', + 'mixup', + 'mizen', + 'mizzy', + 'mneme', + 'moans', + 'moats', + 'mobby', + 'mobes', + 'mobey', + 'mobie', + 'moble', + 'mochi', + 'mochs', + 'mochy', + 'mocks', + 'moder', + 'modes', + 'modge', + 'modii', + 'modus', + 'moers', + 'mofos', + 'moggy', + 'mohel', + 'mohos', + 'mohrs', + 'mohua', + 'mohur', + 'moile', + 'moils', + 'moira', + 'moire', + 'moits', + 'mojos', + 'mokes', + 'mokis', + 'mokos', + 'molal', + 'molas', + 'molds', + 'moled', + 'moles', + 'molla', + 'molls', + 'molly', + 'molto', + 'molts', + 'molys', + 'momes', + 'momma', + 'mommy', + 'momus', + 'monad', + 'monal', + 'monas', + 'monde', + 'mondo', + 'moner', + 'mongo', + 'mongs', + 'monic', + 'monie', + 'monks', + 'monos', + 'monte', + 'monty', + 'moobs', + 'mooch', + 'moods', + 'mooed', + 'mooks', + 'moola', + 'mooli', + 'mools', + 'mooly', + 'moong', + 'moons', + 'moony', + 'moops', + 'moors', + 'moory', + 'moots', + 'moove', + 'moped', + 'moper', + 'mopes', + 'mopey', + 'moppy', + 'mopsy', + 'mopus', + 'morae', + 'moras', + 'morat', + 'moray', + 'morel', + 'mores', + 'moria', + 'morne', + 'morns', + 'morra', + 'morro', + 'morse', + 'morts', + 'mosed', + 'moses', + 'mosey', + 'mosks', + 'mosso', + 'moste', + 'mosts', + 'moted', + 'moten', + 'motes', + 'motet', + 'motey', + 'moths', + 'mothy', + 'motis', + 'motte', + 'motts', + 'motty', + 'motus', + 'motza', + 'mouch', + 'moues', + 'mould', + 'mouls', + 'moups', + 'moust', + 'mousy', + 'moved', + 'moves', + 'mowas', + 'mowed', + 'mowra', + 'moxas', + 'moxie', + 'moyas', + 'moyle', + 'moyls', + 'mozed', + 'mozes', + 'mozos', + 'mpret', + 'mucho', + 'mucic', + 'mucid', + 'mucin', + 'mucks', + 'mucor', + 'mucro', + 'mudge', + 'mudir', + 'mudra', + 'muffs', + 'mufti', + 'mugga', + 'muggs', + 'muggy', + 'muhly', + 'muids', + 'muils', + 'muirs', + 'muist', + 'mujik', + 'mulct', + 'muled', + 'mules', + 'muley', + 'mulga', + 'mulie', + 'mulla', + 'mulls', + 'mulse', + 'mulsh', + 'mumms', + 'mumps', + 'mumsy', + 'mumus', + 'munga', + 'munge', + 'mungo', + 'mungs', + 'munis', + 'munts', + 'muntu', + 'muons', + 'muras', + 'mured', + 'mures', + 'murex', + 'murid', + 'murks', + 'murls', + 'murly', + 'murra', + 'murre', + 'murri', + 'murrs', + 'murry', + 'murti', + 'murva', + 'musar', + 'musca', + 'mused', + 'muser', + 'muses', + 'muset', + 'musha', + 'musit', + 'musks', + 'musos', + 'musse', + 'mussy', + 'musth', + 'musts', + 'mutch', + 'muted', + 'muter', + 'mutes', + 'mutha', + 'mutis', + 'muton', + 'mutts', + 'muxed', + 'muxes', + 'muzak', + 'muzzy', + 'mvule', + 'myall', + 'mylar', + 'mynah', + 'mynas', + 'myoid', + 'myoma', + 'myope', + 'myops', + 'myopy', + 'mysid', + 'mythi', + 'myths', + 'mythy', + 'myxos', + 'mzees', + 'naams', + 'naans', + 'nabes', + 'nabis', + 'nabks', + 'nabla', + 'nabob', + 'nache', + 'nacho', + 'nacre', + 'nadas', + 'naeve', + 'naevi', + 'naffs', + 'nagas', + 'naggy', + 'nagor', + 'nahal', + 'naiad', + 'naifs', + 'naiks', + 'nails', + 'naira', + 'nairu', + 'naked', + 'naker', + 'nakfa', + 'nalas', + 'naled', + 'nalla', + 'named', + 'namer', + 'names', + 'namma', + 'namus', + 'nanas', + 'nance', + 'nancy', + 'nandu', + 'nanna', + 'nanos', + 'nanua', + 'napas', + 'naped', + 'napes', + 'napoo', + 'nappa', + 'nappe', + 'nappy', + 'naras', + 'narco', + 'narcs', + 'nards', + 'nares', + 'naric', + 'naris', + 'narks', + 'narky', + 'narre', + 'nashi', + 'natch', + 'nates', + 'natis', + 'natty', + 'nauch', + 'naunt', + 'navar', + 'naves', + 'navew', + 'navvy', + 'nawab', + 'nazes', + 'nazir', + 'nazis', + 'nduja', + 'neafe', + 'neals', + 'neaps', + 'nears', + 'neath', + 'neats', + 'nebek', + 'nebel', + 'necks', + 'neddy', + 'needs', + 'neeld', + 'neele', + 'neemb', + 'neems', + 'neeps', + 'neese', + 'neeze', + 'negro', + 'negus', + 'neifs', + 'neist', + 'neive', + 'nelis', + 'nelly', + 'nemas', + 'nemns', + 'nempt', + 'nenes', + 'neons', + 'neper', + 'nepit', + 'neral', + 'nerds', + 'nerka', + 'nerks', + 'nerol', + 'nerts', + 'nertz', + 'nervy', + 'nests', + 'netes', + 'netop', + 'netts', + 'netty', + 'neuks', + 'neume', + 'neums', + 'nevel', + 'neves', + 'nevus', + 'newbs', + 'newed', + 'newel', + 'newie', + 'newsy', + 'newts', + 'nexts', + 'nexus', + 'ngaio', + 'ngana', + 'ngati', + 'ngoma', + 'ngwee', + 'nicad', + 'nicht', + 'nicks', + 'nicol', + 'nidal', + 'nided', + 'nides', + 'nidor', + 'nidus', + 'niefs', + 'nieve', + 'nifes', + 'niffs', + 'niffy', + 'nifty', + 'niger', + 'nighs', + 'nihil', + 'nikab', + 'nikah', + 'nikau', + 'nills', + 'nimbi', + 'nimbs', + 'nimps', + 'niner', + 'nines', + 'ninon', + 'nipas', + 'nippy', + 'niqab', + 'nirls', + 'nirly', + 'nisei', + 'nisse', + 'nisus', + 'niter', + 'nites', + 'nitid', + 'niton', + 'nitre', + 'nitro', + 'nitry', + 'nitty', + 'nival', + 'nixed', + 'nixer', + 'nixes', + 'nixie', + 'nizam', + 'nkosi', + 'noahs', + 'nobby', + 'nocks', + 'nodal', + 'noddy', + 'nodes', + 'nodus', + 'noels', + 'noggs', + 'nohow', + 'noils', + 'noily', + 'noint', + 'noirs', + 'noles', + 'nolls', + 'nolos', + 'nomas', + 'nomen', + 'nomes', + 'nomic', + 'nomoi', + 'nomos', + 'nonas', + 'nonce', + 'nones', + 'nonet', + 'nongs', + 'nonis', + 'nonny', + 'nonyl', + 'noobs', + 'nooit', + 'nooks', + 'nooky', + 'noons', + 'noops', + 'nopal', + 'noria', + 'noris', + 'norks', + 'norma', + 'norms', + 'nosed', + 'noser', + 'noses', + 'notal', + 'noted', + 'noter', + 'notes', + 'notum', + 'nould', + 'noule', + 'nouls', + 'nouns', + 'nouny', + 'noups', + 'novae', + 'novas', + 'novum', + 'noway', + 'nowed', + 'nowls', + 'nowts', + 'nowty', + 'noxal', + 'noxes', + 'noyau', + 'noyed', + 'noyes', + 'nubby', + 'nubia', + 'nucha', + 'nuddy', + 'nuder', + 'nudes', + 'nudie', + 'nudzh', + 'nuffs', + 'nugae', + 'nuked', + 'nukes', + 'nulla', + 'nulls', + 'numbs', + 'numen', + 'nummy', + 'nunny', + 'nurds', + 'nurdy', + 'nurls', + 'nurrs', + 'nutso', + 'nutsy', + 'nyaff', + 'nyala', + 'nying', + 'nyssa', + 'oaked', + 'oaker', + 'oakum', + 'oared', + 'oases', + 'oasis', + 'oasts', + 'oaten', + 'oater', + 'oaths', + 'oaves', + 'obang', + 'obeah', + 'obeli', + 'obeys', + 'obias', + 'obied', + 'obiit', + 'obits', + 'objet', + 'oboes', + 'obole', + 'oboli', + 'obols', + 'occam', + 'ocher', + 'oches', + 'ochre', + 'ochry', + 'ocker', + 'ocrea', + 'octad', + 'octan', + 'octas', + 'octyl', + 'oculi', + 'odahs', + 'odals', + 'odeon', + 'odeum', + 'odism', + 'odist', + 'odium', + 'odors', + 'odour', + 'odyle', + 'odyls', + 'ofays', + 'offed', + 'offie', + 'oflag', + 'ofter', + 'ogams', + 'ogeed', + 'ogees', + 'oggin', + 'ogham', + 'ogive', + 'ogled', + 'ogler', + 'ogles', + 'ogmic', + 'ogres', + 'ohias', + 'ohing', + 'ohmic', + 'ohone', + 'oidia', + 'oiled', + 'oiler', + 'oinks', + 'oints', + 'ojime', + 'okapi', + 'okays', + 'okehs', + 'okras', + 'oktas', + 'oldie', + 'oleic', + 'olein', + 'olent', + 'oleos', + 'oleum', + 'olios', + 'ollas', + 'ollav', + 'oller', + 'ollie', + 'ology', + 'olpae', + 'olpes', + 'omasa', + 'omber', + 'ombus', + 'omens', + 'omers', + 'omits', + 'omlah', + 'omovs', + 'omrah', + 'oncer', + 'onces', + 'oncet', + 'oncus', + 'onely', + 'oners', + 'onery', + 'onium', + 'onkus', + 'onlay', + 'onned', + 'ontic', + 'oobit', + 'oohed', + 'oomph', + 'oonts', + 'ooped', + 'oorie', + 'ooses', + 'ootid', + 'oozed', + 'oozes', + 'opahs', + 'opals', + 'opens', + 'opepe', + 'oping', + 'oppos', + 'opsin', + 'opted', + 'opter', + 'orach', + 'oracy', + 'orals', + 'orang', + 'orant', + 'orate', + 'orbed', + 'orcas', + 'orcin', + 'ordos', + 'oread', + 'orfes', + 'orgia', + 'orgic', + 'orgue', + 'oribi', + 'oriel', + 'orixa', + 'orles', + 'orlon', + 'orlop', + 'ormer', + 'ornis', + 'orpin', + 'orris', + 'ortho', + 'orval', + 'orzos', + 'oscar', + 'oshac', + 'osier', + 'osmic', + 'osmol', + 'ossia', + 'ostia', + 'otaku', + 'otary', + 'ottar', + 'ottos', + 'oubit', + 'oucht', + 'ouens', + 'ouija', + 'oulks', + 'oumas', + 'oundy', + 'oupas', + 'ouped', + 'ouphe', + 'ouphs', + 'ourie', + 'ousel', + 'ousts', + 'outby', + 'outed', + 'outre', + 'outro', + 'outta', + 'ouzel', + 'ouzos', + 'ovals', + 'ovels', + 'ovens', + 'overs', + 'ovist', + 'ovoli', + 'ovolo', + 'ovule', + 'owche', + 'owies', + 'owled', + 'owler', + 'owlet', + 'owned', + 'owres', + 'owrie', + 'owsen', + 'oxbow', + 'oxers', + 'oxeye', + 'oxids', + 'oxies', + 'oxime', + 'oxims', + 'oxlip', + 'oxter', + 'oyers', + 'ozeki', + 'ozzie', + 'paals', + 'paans', + 'pacas', + 'paced', + 'pacer', + 'paces', + 'pacey', + 'pacha', + 'packs', + 'pacos', + 'pacta', + 'pacts', + 'padis', + 'padle', + 'padma', + 'padre', + 'padri', + 'paean', + 'paedo', + 'paeon', + 'paged', + 'pager', + 'pages', + 'pagle', + 'pagod', + 'pagri', + 'paiks', + 'pails', + 'pains', + 'paire', + 'pairs', + 'paisa', + 'paise', + 'pakka', + 'palas', + 'palay', + 'palea', + 'paled', + 'pales', + 'palet', + 'palis', + 'palki', + 'palla', + 'palls', + 'pally', + 'palms', + 'palmy', + 'palpi', + 'palps', + 'palsa', + 'pampa', + 'panax', + 'pance', + 'panda', + 'pands', + 'pandy', + 'paned', + 'panes', + 'panga', + 'pangs', + 'panim', + 'panko', + 'panne', + 'panni', + 'panto', + 'pants', + 'panty', + 'paoli', + 'paolo', + 'papas', + 'papaw', + 'papes', + 'pappi', + 'pappy', + 'parae', + 'paras', + 'parch', + 'pardi', + 'pards', + 'pardy', + 'pared', + 'paren', + 'pareo', + 'pares', + 'pareu', + 'parev', + 'parge', + 'pargo', + 'paris', + 'parki', + 'parks', + 'parky', + 'parle', + 'parly', + 'parma', + 'parol', + 'parps', + 'parra', + 'parrs', + 'parti', + 'parts', + 'parve', + 'parvo', + 'paseo', + 'pases', + 'pasha', + 'pashm', + 'paska', + 'paspy', + 'passe', + 'pasts', + 'pated', + 'paten', + 'pater', + 'pates', + 'paths', + 'patin', + 'patka', + 'patly', + 'patte', + 'patus', + 'pauas', + 'pauls', + 'pavan', + 'paved', + 'paven', + 'paver', + 'paves', + 'pavid', + 'pavin', + 'pavis', + 'pawas', + 'pawaw', + 'pawed', + 'pawer', + 'pawks', + 'pawky', + 'pawls', + 'pawns', + 'paxes', + 'payed', + 'payor', + 'paysd', + 'peage', + 'peags', + 'peaks', + 'peaky', + 'peals', + 'peans', + 'peare', + 'pears', + 'peart', + 'pease', + 'peats', + 'peaty', + 'peavy', + 'peaze', + 'pebas', + 'pechs', + 'pecke', + 'pecks', + 'pecky', + 'pedes', + 'pedis', + 'pedro', + 'peece', + 'peeks', + 'peels', + 'peens', + 'peeoy', + 'peepe', + 'peeps', + 'peers', + 'peery', + 'peeve', + 'peggy', + 'peghs', + 'peins', + 'peise', + 'peize', + 'pekan', + 'pekes', + 'pekin', + 'pekoe', + 'pelas', + 'pelau', + 'peles', + 'pelfs', + 'pells', + 'pelma', + 'pelon', + 'pelta', + 'pelts', + 'pends', + 'pendu', + 'pened', + 'penes', + 'pengo', + 'penie', + 'penis', + 'penks', + 'penna', + 'penni', + 'pents', + 'peons', + 'peony', + 'pepla', + 'pepos', + 'peppy', + 'pepsi', + 'perai', + 'perce', + 'percs', + 'perdu', + 'perdy', + 'perea', + 'peres', + 'peris', + 'perks', + 'perms', + 'perns', + 'perog', + 'perps', + 'perry', + 'perse', + 'perst', + 'perts', + 'perve', + 'pervo', + 'pervs', + 'pervy', + 'pesos', + 'pests', + 'pesty', + 'petar', + 'peter', + 'petit', + 'petre', + 'petri', + 'petti', + 'petto', + 'pewee', + 'pewit', + 'peyse', + 'phage', + 'phang', + 'phare', + 'pharm', + 'pheer', + 'phene', + 'pheon', + 'phese', + 'phial', + 'phish', + 'phizz', + 'phlox', + 'phoca', + 'phono', + 'phons', + 'phots', + 'phpht', + 'phuts', + 'phyla', + 'phyle', + 'piani', + 'pians', + 'pibal', + 'pical', + 'picas', + 'piccy', + 'picks', + 'picot', + 'picra', + 'picul', + 'piend', + 'piers', + 'piert', + 'pieta', + 'piets', + 'piezo', + 'pight', + 'pigmy', + 'piing', + 'pikas', + 'pikau', + 'piked', + 'piker', + 'pikes', + 'pikey', + 'pikis', + 'pikul', + 'pilae', + 'pilaf', + 'pilao', + 'pilar', + 'pilau', + 'pilaw', + 'pilch', + 'pilea', + 'piled', + 'pilei', + 'piler', + 'piles', + 'pilis', + 'pills', + 'pilow', + 'pilum', + 'pilus', + 'pimas', + 'pimps', + 'pinas', + 'pined', + 'pines', + 'pingo', + 'pings', + 'pinko', + 'pinks', + 'pinna', + 'pinny', + 'pinon', + 'pinot', + 'pinta', + 'pints', + 'pinup', + 'pions', + 'piony', + 'pious', + 'pioye', + 'pioys', + 'pipal', + 'pipas', + 'piped', + 'pipes', + 'pipet', + 'pipis', + 'pipit', + 'pippy', + 'pipul', + 'pirai', + 'pirls', + 'pirns', + 'pirog', + 'pisco', + 'pises', + 'pisky', + 'pisos', + 'pissy', + 'piste', + 'pitas', + 'piths', + 'piton', + 'pitot', + 'pitta', + 'piums', + 'pixes', + 'pized', + 'pizes', + 'plaas', + 'plack', + 'plage', + 'plans', + 'plaps', + 'plash', + 'plasm', + 'plast', + 'plats', + 'platt', + 'platy', + 'playa', + 'plays', + 'pleas', + 'plebe', + 'plebs', + 'plena', + 'pleon', + 'plesh', + 'plews', + 'plica', + 'plies', + 'plims', + 'pling', + 'plink', + 'ploat', + 'plods', + 'plong', + 'plonk', + 'plook', + 'plops', + 'plots', + 'plotz', + 'plouk', + 'plows', + 'ploye', + 'ploys', + 'plues', + 'pluff', + 'plugs', + 'plums', + 'plumy', + 'pluot', + 'pluto', + 'plyer', + 'poach', + 'poaka', + 'poake', + 'poboy', + 'pocks', + 'pocky', + 'podal', + 'poddy', + 'podex', + 'podge', + 'podgy', + 'podia', + 'poems', + 'poeps', + 'poets', + 'pogey', + 'pogge', + 'pogos', + 'pohed', + 'poilu', + 'poind', + 'pokal', + 'poked', + 'pokes', + 'pokey', + 'pokie', + 'poled', + 'poler', + 'poles', + 'poley', + 'polio', + 'polis', + 'polje', + 'polks', + 'polls', + 'polly', + 'polos', + 'polts', + 'polys', + 'pombe', + 'pomes', + 'pommy', + 'pomos', + 'pomps', + 'ponce', + 'poncy', + 'ponds', + 'pones', + 'poney', + 'ponga', + 'pongo', + 'pongs', + 'pongy', + 'ponks', + 'ponts', + 'ponty', + 'ponzu', + 'poods', + 'pooed', + 'poofs', + 'poofy', + 'poohs', + 'pooja', + 'pooka', + 'pooks', + 'pools', + 'poons', + 'poops', + 'poopy', + 'poori', + 'poort', + 'poots', + 'poove', + 'poovy', + 'popes', + 'poppa', + 'popsy', + 'porae', + 'poral', + 'pored', + 'porer', + 'pores', + 'porge', + 'porgy', + 'porin', + 'porks', + 'porky', + 'porno', + 'porns', + 'porny', + 'porta', + 'ports', + 'porty', + 'posed', + 'poses', + 'posey', + 'posho', + 'posts', + 'potae', + 'potch', + 'poted', + 'potes', + 'potin', + 'potoo', + 'potsy', + 'potto', + 'potts', + 'potty', + 'pouff', + 'poufs', + 'pouke', + 'pouks', + 'poule', + 'poulp', + 'poult', + 'poupe', + 'poupt', + 'pours', + 'pouts', + 'powan', + 'powin', + 'pownd', + 'powns', + 'powny', + 'powre', + 'poxed', + 'poxes', + 'poynt', + 'poyou', + 'poyse', + 'pozzy', + 'praam', + 'prads', + 'prahu', + 'prams', + 'prana', + 'prang', + 'praos', + 'prase', + 'prate', + 'prats', + 'pratt', + 'praty', + 'praus', + 'prays', + 'predy', + 'preed', + 'prees', + 'preif', + 'prems', + 'premy', + 'prent', + 'preon', + 'preop', + 'preps', + 'presa', + 'prese', + 'prest', + 'preve', + 'prexy', + 'preys', + 'prial', + 'pricy', + 'prief', + 'prier', + 'pries', + 'prigs', + 'prill', + 'prima', + 'primi', + 'primp', + 'prims', + 'primy', + 'prink', + 'prion', + 'prise', + 'priss', + 'proas', + 'probs', + 'prods', + 'proem', + 'profs', + 'progs', + 'proin', + 'proke', + 'prole', + 'proll', + 'promo', + 'proms', + 'pronk', + 'props', + 'prore', + 'proso', + 'pross', + 'prost', + 'prosy', + 'proto', + 'proul', + 'prows', + 'proyn', + 'prunt', + 'pruta', + 'pryer', + 'pryse', + 'pseud', + 'pshaw', + 'psion', + 'psoae', + 'psoai', + 'psoas', + 'psora', + 'psych', + 'psyop', + 'pubco', + 'pubes', + 'pubis', + 'pucan', + 'pucer', + 'puces', + 'pucka', + 'pucks', + 'puddy', + 'pudge', + 'pudic', + 'pudor', + 'pudsy', + 'pudus', + 'puers', + 'puffa', + 'puffs', + 'puggy', + 'pugil', + 'puhas', + 'pujah', + 'pujas', + 'pukas', + 'puked', + 'puker', + 'pukes', + 'pukey', + 'pukka', + 'pukus', + 'pulao', + 'pulas', + 'puled', + 'puler', + 'pules', + 'pulik', + 'pulis', + 'pulka', + 'pulks', + 'pulli', + 'pulls', + 'pully', + 'pulmo', + 'pulps', + 'pulus', + 'pumas', + 'pumie', + 'pumps', + 'punas', + 'punce', + 'punga', + 'pungs', + 'punji', + 'punka', + 'punks', + 'punky', + 'punny', + 'punto', + 'punts', + 'punty', + 'pupae', + 'pupas', + 'pupus', + 'purda', + 'pured', + 'pures', + 'purin', + 'puris', + 'purls', + 'purpy', + 'purrs', + 'pursy', + 'purty', + 'puses', + 'pusle', + 'pussy', + 'putid', + 'puton', + 'putti', + 'putto', + 'putts', + 'puzel', + 'pwned', + 'pyats', + 'pyets', + 'pygal', + 'pyins', + 'pylon', + 'pyned', + 'pynes', + 'pyoid', + 'pyots', + 'pyral', + 'pyran', + 'pyres', + 'pyrex', + 'pyric', + 'pyros', + 'pyxed', + 'pyxes', + 'pyxie', + 'pyxis', + 'pzazz', + 'qadis', + 'qaids', + 'qajaq', + 'qanat', + 'qapik', + 'qibla', + 'qophs', + 'qorma', + 'quads', + 'quaff', + 'quags', + 'quair', + 'quais', + 'quaky', + 'quale', + 'quant', + 'quare', + 'quass', + 'quate', + 'quats', + 'quayd', + 'quays', + 'qubit', + 'quean', + 'queme', + 'quena', + 'quern', + 'queyn', + 'queys', + 'quich', + 'quids', + 'quiff', + 'quims', + 'quina', + 'quine', + 'quino', + 'quins', + 'quint', + 'quipo', + 'quips', + 'quipu', + 'quire', + 'quirt', + 'quist', + 'quits', + 'quoad', + 'quods', + 'quoif', + 'quoin', + 'quoit', + 'quoll', + 'quonk', + 'quops', + 'qursh', + 'quyte', + 'rabat', + 'rabic', + 'rabis', + 'raced', + 'races', + 'rache', + 'racks', + 'racon', + 'radge', + 'radix', + 'radon', + 'raffs', + 'rafts', + 'ragas', + 'ragde', + 'raged', + 'ragee', + 'rager', + 'rages', + 'ragga', + 'raggs', + 'raggy', + 'ragis', + 'ragus', + 'rahed', + 'rahui', + 'raias', + 'raids', + 'raiks', + 'raile', + 'rails', + 'raine', + 'rains', + 'raird', + 'raita', + 'raits', + 'rajas', + 'rajes', + 'raked', + 'rakee', + 'raker', + 'rakes', + 'rakia', + 'rakis', + 'rakus', + 'rales', + 'ramal', + 'ramee', + 'ramet', + 'ramie', + 'ramin', + 'ramis', + 'rammy', + 'ramps', + 'ramus', + 'ranas', + 'rance', + 'rands', + 'ranee', + 'ranga', + 'rangi', + 'rangs', + 'rangy', + 'ranid', + 'ranis', + 'ranke', + 'ranks', + 'rants', + 'raped', + 'raper', + 'rapes', + 'raphe', + 'rappe', + 'rared', + 'raree', + 'rares', + 'rarks', + 'rased', + 'raser', + 'rases', + 'rasps', + 'rasse', + 'rasta', + 'ratal', + 'ratan', + 'ratas', + 'ratch', + 'rated', + 'ratel', + 'rater', + 'rates', + 'ratha', + 'rathe', + 'raths', + 'ratoo', + 'ratos', + 'ratus', + 'rauns', + 'raupo', + 'raved', + 'ravel', + 'raver', + 'raves', + 'ravey', + 'ravin', + 'rawer', + 'rawin', + 'rawly', + 'rawns', + 'raxed', + 'raxes', + 'rayah', + 'rayas', + 'rayed', + 'rayle', + 'rayne', + 'razed', + 'razee', + 'razer', + 'razes', + 'razoo', + 'readd', + 'reads', + 'reais', + 'reaks', + 'realo', + 'reals', + 'reame', + 'reams', + 'reamy', + 'reans', + 'reaps', + 'rears', + 'reast', + 'reata', + 'reate', + 'reave', + 'rebbe', + 'rebec', + 'rebid', + 'rebit', + 'rebop', + 'rebuy', + 'recal', + 'recce', + 'recco', + 'reccy', + 'recit', + 'recks', + 'recon', + 'recta', + 'recti', + 'recto', + 'redan', + 'redds', + 'reddy', + 'reded', + 'redes', + 'redia', + 'redid', + 'redip', + 'redly', + 'redon', + 'redos', + 'redox', + 'redry', + 'redub', + 'redux', + 'redye', + 'reech', + 'reede', + 'reeds', + 'reefs', + 'reefy', + 'reeks', + 'reeky', + 'reels', + 'reens', + 'reest', + 'reeve', + 'refed', + 'refel', + 'reffo', + 'refis', + 'refix', + 'refly', + 'refry', + 'regar', + 'reges', + 'reggo', + 'regie', + 'regma', + 'regna', + 'regos', + 'regur', + 'rehem', + 'reifs', + 'reify', + 'reiki', + 'reiks', + 'reink', + 'reins', + 'reird', + 'reist', + 'reive', + 'rejig', + 'rejon', + 'reked', + 'rekes', + 'rekey', + 'relet', + 'relie', + 'relit', + 'rello', + 'reman', + 'remap', + 'remen', + 'remet', + 'remex', + 'remix', + 'renay', + 'rends', + 'reney', + 'renga', + 'renig', + 'renin', + 'renne', + 'renos', + 'rente', + 'rents', + 'reoil', + 'reorg', + 'repeg', + 'repin', + 'repla', + 'repos', + 'repot', + 'repps', + 'repro', + 'reran', + 'rerig', + 'resat', + 'resaw', + 'resay', + 'resee', + 'reses', + 'resew', + 'resid', + 'resit', + 'resod', + 'resow', + 'resto', + 'rests', + 'resty', + 'resus', + 'retag', + 'retax', + 'retem', + 'retia', + 'retie', + 'retox', + 'revet', + 'revie', + 'rewan', + 'rewax', + 'rewed', + 'rewet', + 'rewin', + 'rewon', + 'rewth', + 'rexes', + 'rezes', + 'rheas', + 'rheme', + 'rheum', + 'rhies', + 'rhime', + 'rhine', + 'rhody', + 'rhomb', + 'rhone', + 'rhumb', + 'rhyne', + 'rhyta', + 'riads', + 'rials', + 'riant', + 'riata', + 'ribas', + 'ribby', + 'ribes', + 'riced', + 'ricer', + 'rices', + 'ricey', + 'richt', + 'ricin', + 'ricks', + 'rides', + 'ridgy', + 'ridic', + 'riels', + 'riems', + 'rieve', + 'rifer', + 'riffs', + 'rifte', + 'rifts', + 'rifty', + 'riggs', + 'rigol', + 'riled', + 'riles', + 'riley', + 'rille', + 'rills', + 'rimae', + 'rimed', + 'rimer', + 'rimes', + 'rimus', + 'rinds', + 'rindy', + 'rines', + 'rings', + 'rinks', + 'rioja', + 'riots', + 'riped', + 'ripes', + 'ripps', + 'rises', + 'rishi', + 'risks', + 'risps', + 'risus', + 'rites', + 'ritts', + 'ritzy', + 'rivas', + 'rived', + 'rivel', + 'riven', + 'rives', + 'riyal', + 'rizas', + 'roads', + 'roams', + 'roans', + 'roars', + 'roary', + 'roate', + 'robed', + 'robes', + 'roble', + 'rocks', + 'roded', + 'rodes', + 'roguy', + 'rohes', + 'roids', + 'roils', + 'roily', + 'roins', + 'roist', + 'rojak', + 'rojis', + 'roked', + 'roker', + 'rokes', + 'rolag', + 'roles', + 'rolfs', + 'rolls', + 'romal', + 'roman', + 'romeo', + 'romps', + 'ronde', + 'rondo', + 'roneo', + 'rones', + 'ronin', + 'ronne', + 'ronte', + 'ronts', + 'roods', + 'roofs', + 'roofy', + 'rooks', + 'rooky', + 'rooms', + 'roons', + 'roops', + 'roopy', + 'roosa', + 'roose', + 'roots', + 'rooty', + 'roped', + 'roper', + 'ropes', + 'ropey', + 'roque', + 'roral', + 'rores', + 'roric', + 'rorid', + 'rorie', + 'rorts', + 'rorty', + 'rosed', + 'roses', + 'roset', + 'roshi', + 'rosin', + 'rosit', + 'rosti', + 'rosts', + 'rotal', + 'rotan', + 'rotas', + 'rotch', + 'roted', + 'rotes', + 'rotis', + 'rotls', + 'roton', + 'rotos', + 'rotte', + 'rouen', + 'roues', + 'roule', + 'rouls', + 'roums', + 'roups', + 'roupy', + 'roust', + 'routh', + 'routs', + 'roved', + 'roven', + 'roves', + 'rowan', + 'rowed', + 'rowel', + 'rowen', + 'rowie', + 'rowme', + 'rownd', + 'rowth', + 'rowts', + 'royne', + 'royst', + 'rozet', + 'rozit', + 'ruana', + 'rubai', + 'rubby', + 'rubel', + 'rubes', + 'rubin', + 'ruble', + 'rubli', + 'rubus', + 'ruche', + 'rucks', + 'rudas', + 'rudds', + 'rudes', + 'rudie', + 'rudis', + 'rueda', + 'ruers', + 'ruffe', + 'ruffs', + 'rugae', + 'rugal', + 'ruggy', + 'ruing', + 'ruins', + 'rukhs', + 'ruled', + 'rules', + 'rumal', + 'rumbo', + 'rumen', + 'rumes', + 'rumly', + 'rummy', + 'rumpo', + 'rumps', + 'rumpy', + 'runch', + 'runds', + 'runed', + 'runes', + 'rungs', + 'runic', + 'runny', + 'runts', + 'runty', + 'rupia', + 'rurps', + 'rurus', + 'rusas', + 'ruses', + 'rushy', + 'rusks', + 'rusma', + 'russe', + 'rusts', + 'ruths', + 'rutin', + 'rutty', + 'ryals', + 'rybat', + 'ryked', + 'rykes', + 'rymme', + 'rynds', + 'ryots', + 'ryper', + 'saags', + 'sabal', + 'sabed', + 'saber', + 'sabes', + 'sabha', + 'sabin', + 'sabir', + 'sable', + 'sabot', + 'sabra', + 'sabre', + 'sacks', + 'sacra', + 'saddo', + 'sades', + 'sadhe', + 'sadhu', + 'sadis', + 'sados', + 'sadza', + 'safed', + 'safes', + 'sagas', + 'sager', + 'sages', + 'saggy', + 'sagos', + 'sagum', + 'saheb', + 'sahib', + 'saice', + 'saick', + 'saics', + 'saids', + 'saiga', + 'sails', + 'saims', + 'saine', + 'sains', + 'sairs', + 'saist', + 'saith', + 'sajou', + 'sakai', + 'saker', + 'sakes', + 'sakia', + 'sakis', + 'sakti', + 'salal', + 'salat', + 'salep', + 'sales', + 'salet', + 'salic', + 'salix', + 'salle', + 'salmi', + 'salol', + 'salop', + 'salpa', + 'salps', + 'salse', + 'salto', + 'salts', + 'salue', + 'salut', + 'saman', + 'samas', + 'samba', + 'sambo', + 'samek', + 'samel', + 'samen', + 'sames', + 'samey', + 'samfu', + 'sammy', + 'sampi', + 'samps', + 'sands', + 'saned', + 'sanes', + 'sanga', + 'sangh', + 'sango', + 'sangs', + 'sanko', + 'sansa', + 'santo', + 'sants', + 'saola', + 'sapan', + 'sapid', + 'sapor', + 'saran', + 'sards', + 'sared', + 'saree', + 'sarge', + 'sargo', + 'sarin', + 'saris', + 'sarks', + 'sarky', + 'sarod', + 'saros', + 'sarus', + 'saser', + 'sasin', + 'sasse', + 'satai', + 'satay', + 'sated', + 'satem', + 'sates', + 'satis', + 'sauba', + 'sauch', + 'saugh', + 'sauls', + 'sault', + 'saunt', + 'saury', + 'sauts', + 'saved', + 'saver', + 'saves', + 'savey', + 'savin', + 'sawah', + 'sawed', + 'sawer', + 'saxes', + 'sayed', + 'sayer', + 'sayid', + 'sayne', + 'sayon', + 'sayst', + 'sazes', + 'scabs', + 'scads', + 'scaff', + 'scags', + 'scail', + 'scala', + 'scall', + 'scams', + 'scand', + 'scans', + 'scapa', + 'scape', + 'scapi', + 'scarp', + 'scars', + 'scart', + 'scath', + 'scats', + 'scatt', + 'scaud', + 'scaup', + 'scaur', + 'scaws', + 'sceat', + 'scena', + 'scend', + 'schav', + 'schmo', + 'schul', + 'schwa', + 'sclim', + 'scody', + 'scogs', + 'scoog', + 'scoot', + 'scopa', + 'scops', + 'scots', + 'scoug', + 'scoup', + 'scowp', + 'scows', + 'scrab', + 'scrae', + 'scrag', + 'scran', + 'scrat', + 'scraw', + 'scray', + 'scrim', + 'scrip', + 'scrob', + 'scrod', + 'scrog', + 'scrow', + 'scudi', + 'scudo', + 'scuds', + 'scuff', + 'scuft', + 'scugs', + 'sculk', + 'scull', + 'sculp', + 'sculs', + 'scums', + 'scups', + 'scurf', + 'scurs', + 'scuse', + 'scuta', + 'scute', + 'scuts', + 'scuzz', + 'scyes', + 'sdayn', + 'sdein', + 'seals', + 'seame', + 'seams', + 'seamy', + 'seans', + 'seare', + 'sears', + 'sease', + 'seats', + 'seaze', + 'sebum', + 'secco', + 'sechs', + 'sects', + 'seder', + 'sedes', + 'sedge', + 'sedgy', + 'sedum', + 'seeds', + 'seeks', + 'seeld', + 'seels', + 'seely', + 'seems', + 'seeps', + 'seepy', + 'seers', + 'sefer', + 'segar', + 'segni', + 'segno', + 'segol', + 'segos', + 'sehri', + 'seifs', + 'seils', + 'seine', + 'seirs', + 'seise', + 'seism', + 'seity', + 'seiza', + 'sekos', + 'sekts', + 'selah', + 'seles', + 'selfs', + 'sella', + 'selle', + 'sells', + 'selva', + 'semee', + 'semes', + 'semie', + 'semis', + 'senas', + 'sends', + 'senes', + 'sengi', + 'senna', + 'senor', + 'sensa', + 'sensi', + 'sente', + 'senti', + 'sents', + 'senvy', + 'senza', + 'sepad', + 'sepal', + 'sepic', + 'sepoy', + 'septa', + 'septs', + 'serac', + 'serai', + 'seral', + 'sered', + 'serer', + 'seres', + 'serfs', + 'serge', + 'seric', + 'serin', + 'serks', + 'seron', + 'serow', + 'serra', + 'serre', + 'serrs', + 'serry', + 'servo', + 'sesey', + 'sessa', + 'setae', + 'setal', + 'seton', + 'setts', + 'sewan', + 'sewar', + 'sewed', + 'sewel', + 'sewen', + 'sewin', + 'sexed', + 'sexer', + 'sexes', + 'sexto', + 'sexts', + 'seyen', + 'shads', + 'shags', + 'shahs', + 'shako', + 'shakt', + 'shalm', + 'shaly', + 'shama', + 'shams', + 'shand', + 'shans', + 'shaps', + 'sharn', + 'shash', + 'shaul', + 'shawm', + 'shawn', + 'shaws', + 'shaya', + 'shays', + 'shchi', + 'sheaf', + 'sheal', + 'sheas', + 'sheds', + 'sheel', + 'shend', + 'shent', + 'sheol', + 'sherd', + 'shere', + 'shero', + 'shets', + 'sheva', + 'shewn', + 'shews', + 'shiai', + 'shiel', + 'shier', + 'shies', + 'shill', + 'shily', + 'shims', + 'shins', + 'ships', + 'shirr', + 'shirs', + 'shish', + 'shiso', + 'shist', + 'shite', + 'shits', + 'shiur', + 'shiva', + 'shive', + 'shivs', + 'shlep', + 'shlub', + 'shmek', + 'shmoe', + 'shoat', + 'shoed', + 'shoer', + 'shoes', + 'shogi', + 'shogs', + 'shoji', + 'shojo', + 'shola', + 'shool', + 'shoon', + 'shoos', + 'shope', + 'shops', + 'shorl', + 'shote', + 'shots', + 'shott', + 'showd', + 'shows', + 'shoyu', + 'shred', + 'shris', + 'shrow', + 'shtik', + 'shtum', + 'shtup', + 'shule', + 'shuln', + 'shuls', + 'shuns', + 'shura', + 'shute', + 'shuts', + 'shwas', + 'shyer', + 'sials', + 'sibbs', + 'sibyl', + 'sices', + 'sicht', + 'sicko', + 'sicks', + 'sicky', + 'sidas', + 'sided', + 'sider', + 'sides', + 'sidha', + 'sidhe', + 'sidle', + 'sield', + 'siens', + 'sient', + 'sieth', + 'sieur', + 'sifts', + 'sighs', + 'sigil', + 'sigla', + 'signa', + 'signs', + 'sijos', + 'sikas', + 'siker', + 'sikes', + 'silds', + 'siled', + 'silen', + 'siler', + 'siles', + 'silex', + 'silks', + 'sills', + 'silos', + 'silts', + 'silty', + 'silva', + 'simar', + 'simas', + 'simba', + 'simis', + 'simps', + 'simul', + 'sinds', + 'sined', + 'sines', + 'sings', + 'sinhs', + 'sinks', + 'sinky', + 'sinus', + 'siped', + 'sipes', + 'sippy', + 'sired', + 'siree', + 'sires', + 'sirih', + 'siris', + 'siroc', + 'sirra', + 'sirup', + 'sisal', + 'sises', + 'sista', + 'sists', + 'sitar', + 'sited', + 'sites', + 'sithe', + 'sitka', + 'situp', + 'situs', + 'siver', + 'sixer', + 'sixes', + 'sixmo', + 'sixte', + 'sizar', + 'sized', + 'sizel', + 'sizer', + 'sizes', + 'skags', + 'skail', + 'skald', + 'skank', + 'skart', + 'skats', + 'skatt', + 'skaws', + 'skean', + 'skear', + 'skeds', + 'skeed', + 'skeef', + 'skeen', + 'skeer', + 'skees', + 'skeet', + 'skegg', + 'skegs', + 'skein', + 'skelf', + 'skell', + 'skelm', + 'skelp', + 'skene', + 'skens', + 'skeos', + 'skeps', + 'skers', + 'skets', + 'skews', + 'skids', + 'skied', + 'skies', + 'skiey', + 'skimo', + 'skims', + 'skink', + 'skins', + 'skint', + 'skios', + 'skips', + 'skirl', + 'skirr', + 'skite', + 'skits', + 'skive', + 'skivy', + 'sklim', + 'skoal', + 'skody', + 'skoff', + 'skogs', + 'skols', + 'skool', + 'skort', + 'skosh', + 'skran', + 'skrik', + 'skuas', + 'skugs', + 'skyed', + 'skyer', + 'skyey', + 'skyfs', + 'skyre', + 'skyrs', + 'skyte', + 'slabs', + 'slade', + 'slaes', + 'slags', + 'slaid', + 'slake', + 'slams', + 'slane', + 'slank', + 'slaps', + 'slart', + 'slats', + 'slaty', + 'slaws', + 'slays', + 'slebs', + 'sleds', + 'sleer', + 'slews', + 'sleys', + 'slier', + 'slily', + 'slims', + 'slipe', + 'slips', + 'slipt', + 'slish', + 'slits', + 'slive', + 'sloan', + 'slobs', + 'sloes', + 'slogs', + 'sloid', + 'slojd', + 'slomo', + 'sloom', + 'sloot', + 'slops', + 'slopy', + 'slorm', + 'slots', + 'slove', + 'slows', + 'sloyd', + 'slubb', + 'slubs', + 'slued', + 'slues', + 'sluff', + 'slugs', + 'sluit', + 'slums', + 'slurb', + 'slurs', + 'sluse', + 'sluts', + 'slyer', + 'slype', + 'smaak', + 'smaik', + 'smalm', + 'smalt', + 'smarm', + 'smaze', + 'smeek', + 'smees', + 'smeik', + 'smeke', + 'smerk', + 'smews', + 'smirr', + 'smirs', + 'smits', + 'smogs', + 'smoko', + 'smolt', + 'smoor', + 'smoot', + 'smore', + 'smorg', + 'smout', + 'smowt', + 'smugs', + 'smurs', + 'smush', + 'smuts', + 'snabs', + 'snafu', + 'snags', + 'snaps', + 'snarf', + 'snark', + 'snars', + 'snary', + 'snash', + 'snath', + 'snaws', + 'snead', + 'sneap', + 'snebs', + 'sneck', + 'sneds', + 'sneed', + 'snees', + 'snell', + 'snibs', + 'snick', + 'snies', + 'snift', + 'snigs', + 'snips', + 'snipy', + 'snirt', + 'snits', + 'snobs', + 'snods', + 'snoek', + 'snoep', + 'snogs', + 'snoke', + 'snood', + 'snook', + 'snool', + 'snoot', + 'snots', + 'snowk', + 'snows', + 'snubs', + 'snugs', + 'snush', + 'snyes', + 'soaks', + 'soaps', + 'soare', + 'soars', + 'soave', + 'sobas', + 'socas', + 'soces', + 'socko', + 'socks', + 'socle', + 'sodas', + 'soddy', + 'sodic', + 'sodom', + 'sofar', + 'sofas', + 'softa', + 'softs', + 'softy', + 'soger', + 'sohur', + 'soils', + 'soily', + 'sojas', + 'sojus', + 'sokah', + 'soken', + 'sokes', + 'sokol', + 'solah', + 'solan', + 'solas', + 'solde', + 'soldi', + 'soldo', + 'solds', + 'soled', + 'solei', + 'soler', + 'soles', + 'solon', + 'solos', + 'solum', + 'solus', + 'soman', + 'somas', + 'sonce', + 'sonde', + 'sones', + 'songs', + 'sonly', + 'sonne', + 'sonny', + 'sonse', + 'sonsy', + 'sooey', + 'sooks', + 'sooky', + 'soole', + 'sools', + 'sooms', + 'soops', + 'soote', + 'soots', + 'sophs', + 'sophy', + 'sopor', + 'soppy', + 'sopra', + 'soral', + 'soras', + 'sorbo', + 'sorbs', + 'sorda', + 'sordo', + 'sords', + 'sored', + 'soree', + 'sorel', + 'sorer', + 'sores', + 'sorex', + 'sorgo', + 'sorns', + 'sorra', + 'sorta', + 'sorts', + 'sorus', + 'soths', + 'sotol', + 'souce', + 'souct', + 'sough', + 'souks', + 'souls', + 'soums', + 'soups', + 'soupy', + 'sours', + 'souse', + 'souts', + 'sowar', + 'sowce', + 'sowed', + 'sowff', + 'sowfs', + 'sowle', + 'sowls', + 'sowms', + 'sownd', + 'sowne', + 'sowps', + 'sowse', + 'sowth', + 'soyas', + 'soyle', + 'soyuz', + 'sozin', + 'spacy', + 'spado', + 'spaed', + 'spaer', + 'spaes', + 'spags', + 'spahi', + 'spail', + 'spain', + 'spait', + 'spake', + 'spald', + 'spale', + 'spall', + 'spalt', + 'spams', + 'spane', + 'spang', + 'spans', + 'spard', + 'spars', + 'spart', + 'spate', + 'spats', + 'spaul', + 'spawl', + 'spaws', + 'spayd', + 'spays', + 'spaza', + 'spazz', + 'speal', + 'spean', + 'speat', + 'specs', + 'spect', + 'speel', + 'speer', + 'speil', + 'speir', + 'speks', + 'speld', + 'spelk', + 'speos', + 'spets', + 'speug', + 'spews', + 'spewy', + 'spial', + 'spica', + 'spick', + 'spics', + 'spide', + 'spier', + 'spies', + 'spiff', + 'spifs', + 'spiks', + 'spile', + 'spims', + 'spina', + 'spink', + 'spins', + 'spirt', + 'spiry', + 'spits', + 'spitz', + 'spivs', + 'splay', + 'splog', + 'spode', + 'spods', + 'spoom', + 'spoor', + 'spoot', + 'spork', + 'sposh', + 'spots', + 'sprad', + 'sprag', + 'sprat', + 'spred', + 'sprew', + 'sprit', + 'sprod', + 'sprog', + 'sprue', + 'sprug', + 'spuds', + 'spued', + 'spuer', + 'spues', + 'spugs', + 'spule', + 'spume', + 'spumy', + 'spurs', + 'sputa', + 'spyal', + 'spyre', + 'squab', + 'squaw', + 'squeg', + 'squid', + 'squit', + 'squiz', + 'stabs', + 'stade', + 'stags', + 'stagy', + 'staig', + 'stane', + 'stang', + 'staph', + 'staps', + 'starn', + 'starr', + 'stars', + 'stats', + 'staun', + 'staws', + 'stays', + 'stean', + 'stear', + 'stedd', + 'stede', + 'steds', + 'steek', + 'steem', + 'steen', + 'steil', + 'stela', + 'stele', + 'stell', + 'steme', + 'stems', + 'stend', + 'steno', + 'stens', + 'stent', + 'steps', + 'stept', + 'stere', + 'stets', + 'stews', + 'stewy', + 'steys', + 'stich', + 'stied', + 'sties', + 'stilb', + 'stile', + 'stime', + 'stims', + 'stimy', + 'stipa', + 'stipe', + 'stire', + 'stirk', + 'stirp', + 'stirs', + 'stive', + 'stivy', + 'stoae', + 'stoai', + 'stoas', + 'stoat', + 'stobs', + 'stoep', + 'stogy', + 'stoit', + 'stoln', + 'stoma', + 'stond', + 'stong', + 'stonk', + 'stonn', + 'stook', + 'stoor', + 'stope', + 'stops', + 'stopt', + 'stoss', + 'stots', + 'stott', + 'stoun', + 'stoup', + 'stour', + 'stown', + 'stowp', + 'stows', + 'strad', + 'strae', + 'strag', + 'strak', + 'strep', + 'strew', + 'stria', + 'strig', + 'strim', + 'strop', + 'strow', + 'stroy', + 'strum', + 'stubs', + 'stude', + 'studs', + 'stull', + 'stulm', + 'stumm', + 'stums', + 'stuns', + 'stupa', + 'stupe', + 'sture', + 'sturt', + 'styed', + 'styes', + 'styli', + 'stylo', + 'styme', + 'stymy', + 'styre', + 'styte', + 'subah', + 'subas', + 'subby', + 'suber', + 'subha', + 'succi', + 'sucks', + 'sucky', + 'sucre', + 'sudds', + 'sudor', + 'sudsy', + 'suede', + 'suent', + 'suers', + 'suete', + 'suets', + 'suety', + 'sugan', + 'sughs', + 'sugos', + 'suhur', + 'suids', + 'suint', + 'suits', + 'sujee', + 'sukhs', + 'sukuk', + 'sulci', + 'sulfa', + 'sulfo', + 'sulks', + 'sulph', + 'sulus', + 'sumis', + 'summa', + 'sumos', + 'sumph', + 'sumps', + 'sunis', + 'sunks', + 'sunna', + 'sunns', + 'sunup', + 'supes', + 'supra', + 'surah', + 'sural', + 'suras', + 'surat', + 'surds', + 'sured', + 'sures', + 'surfs', + 'surfy', + 'surgy', + 'surra', + 'sused', + 'suses', + 'susus', + 'sutor', + 'sutra', + 'sutta', + 'swabs', + 'swack', + 'swads', + 'swage', + 'swags', + 'swail', + 'swain', + 'swale', + 'swaly', + 'swamy', + 'swang', + 'swank', + 'swans', + 'swaps', + 'swapt', + 'sward', + 'sware', + 'swarf', + 'swart', + 'swats', + 'swayl', + 'sways', + 'sweal', + 'swede', + 'sweed', + 'sweel', + 'sweer', + 'swees', + 'sweir', + 'swelt', + 'swerf', + 'sweys', + 'swies', + 'swigs', + 'swile', + 'swims', + 'swink', + 'swipe', + 'swire', + 'swiss', + 'swith', + 'swits', + 'swive', + 'swizz', + 'swobs', + 'swole', + 'swoln', + 'swops', + 'swopt', + 'swots', + 'swoun', + 'sybbe', + 'sybil', + 'syboe', + 'sybow', + 'sycee', + 'syces', + 'sycon', + 'syens', + 'syker', + 'sykes', + 'sylis', + 'sylph', + 'sylva', + 'symar', + 'synch', + 'syncs', + 'synds', + 'syned', + 'synes', + 'synth', + 'syped', + 'sypes', + 'syphs', + 'syrah', + 'syren', + 'sysop', + 'sythe', + 'syver', + 'taals', + 'taata', + 'taber', + 'tabes', + 'tabid', + 'tabis', + 'tabla', + 'tabor', + 'tabun', + 'tabus', + 'tacan', + 'taces', + 'tacet', + 'tache', + 'tacho', + 'tachs', + 'tacks', + 'tacos', + 'tacts', + 'taels', + 'tafia', + 'taggy', + 'tagma', + 'tahas', + 'tahrs', + 'taiga', + 'taigs', + 'taiko', + 'tails', + 'tains', + 'taira', + 'taish', + 'taits', + 'tajes', + 'takas', + 'takes', + 'takhi', + 'takin', + 'takis', + 'takky', + 'talak', + 'talaq', + 'talar', + 'talas', + 'talcs', + 'talcy', + 'talea', + 'taler', + 'tales', + 'talks', + 'talky', + 'talls', + 'talma', + 'talpa', + 'taluk', + 'talus', + 'tamal', + 'tamed', + 'tames', + 'tamin', + 'tamis', + 'tammy', + 'tamps', + 'tanas', + 'tanga', + 'tangi', + 'tangs', + 'tanhs', + 'tanka', + 'tanks', + 'tanky', + 'tanna', + 'tansy', + 'tanti', + 'tanto', + 'tanty', + 'tapas', + 'taped', + 'tapen', + 'tapes', + 'tapet', + 'tapis', + 'tappa', + 'tapus', + 'taras', + 'tardo', + 'tared', + 'tares', + 'targa', + 'targe', + 'tarns', + 'taroc', + 'tarok', + 'taros', + 'tarps', + 'tarre', + 'tarry', + 'tarsi', + 'tarts', + 'tarty', + 'tasar', + 'tased', + 'taser', + 'tases', + 'tasks', + 'tassa', + 'tasse', + 'tasso', + 'tatar', + 'tater', + 'tates', + 'taths', + 'tatie', + 'tatou', + 'tatts', + 'tatus', + 'taube', + 'tauld', + 'tauon', + 'taupe', + 'tauts', + 'tavah', + 'tavas', + 'taver', + 'tawai', + 'tawas', + 'tawed', + 'tawer', + 'tawie', + 'tawse', + 'tawts', + 'taxed', + 'taxer', + 'taxes', + 'taxis', + 'taxol', + 'taxon', + 'taxor', + 'taxus', + 'tayra', + 'tazza', + 'tazze', + 'teade', + 'teads', + 'teaed', + 'teaks', + 'teals', + 'teams', + 'tears', + 'teats', + 'teaze', + 'techs', + 'techy', + 'tecta', + 'teels', + 'teems', + 'teend', + 'teene', + 'teens', + 'teeny', + 'teers', + 'teffs', + 'teggs', + 'tegua', + 'tegus', + 'tehrs', + 'teiid', + 'teils', + 'teind', + 'teins', + 'telae', + 'telco', + 'teles', + 'telex', + 'telia', + 'telic', + 'tells', + 'telly', + 'teloi', + 'telos', + 'temed', + 'temes', + 'tempi', + 'temps', + 'tempt', + 'temse', + 'tench', + 'tends', + 'tendu', + 'tenes', + 'tenge', + 'tenia', + 'tenne', + 'tenno', + 'tenny', + 'tenon', + 'tents', + 'tenty', + 'tenue', + 'tepal', + 'tepas', + 'tepoy', + 'terai', + 'teras', + 'terce', + 'terek', + 'teres', + 'terfe', + 'terfs', + 'terga', + 'terms', + 'terne', + 'terns', + 'terry', + 'terts', + 'tesla', + 'testa', + 'teste', + 'tests', + 'tetes', + 'teths', + 'tetra', + 'tetri', + 'teuch', + 'teugh', + 'tewed', + 'tewel', + 'tewit', + 'texas', + 'texes', + 'texts', + 'thack', + 'thagi', + 'thaim', + 'thale', + 'thali', + 'thana', + 'thane', + 'thang', + 'thans', + 'thanx', + 'tharm', + 'thars', + 'thaws', + 'thawy', + 'thebe', + 'theca', + 'theed', + 'theek', + 'thees', + 'thegn', + 'theic', + 'thein', + 'thelf', + 'thema', + 'thens', + 'theow', + 'therm', + 'thesp', + 'thete', + 'thews', + 'thewy', + 'thigs', + 'thilk', + 'thill', + 'thine', + 'thins', + 'thiol', + 'thirl', + 'thoft', + 'thole', + 'tholi', + 'thoro', + 'thorp', + 'thous', + 'thowl', + 'thrae', + 'thraw', + 'thrid', + 'thrip', + 'throe', + 'thuds', + 'thugs', + 'thuja', + 'thunk', + 'thurl', + 'thuya', + 'thymi', + 'thymy', + 'tians', + 'tiars', + 'tical', + 'ticca', + 'ticed', + 'tices', + 'tichy', + 'ticks', + 'ticky', + 'tiddy', + 'tided', + 'tides', + 'tiers', + 'tiffs', + 'tifos', + 'tifts', + 'tiges', + 'tigon', + 'tikas', + 'tikes', + 'tikis', + 'tikka', + 'tilak', + 'tiled', + 'tiler', + 'tiles', + 'tills', + 'tilly', + 'tilth', + 'tilts', + 'timbo', + 'timed', + 'times', + 'timon', + 'timps', + 'tinas', + 'tinct', + 'tinds', + 'tinea', + 'tined', + 'tines', + 'tinge', + 'tings', + 'tinks', + 'tinny', + 'tints', + 'tinty', + 'tipis', + 'tippy', + 'tired', + 'tires', + 'tirls', + 'tiros', + 'tirrs', + 'titch', + 'titer', + 'titis', + 'titre', + 'titty', + 'titup', + 'tiyin', + 'tiyns', + 'tizes', + 'tizzy', + 'toads', + 'toady', + 'toaze', + 'tocks', + 'tocky', + 'tocos', + 'todde', + 'toeas', + 'toffs', + 'toffy', + 'tofts', + 'tofus', + 'togae', + 'togas', + 'toged', + 'toges', + 'togue', + 'tohos', + 'toile', + 'toils', + 'toing', + 'toise', + 'toits', + 'tokay', + 'toked', + 'toker', + 'tokes', + 'tokos', + 'tolan', + 'tolar', + 'tolas', + 'toled', + 'toles', + 'tolls', + 'tolly', + 'tolts', + 'tolus', + 'tolyl', + 'toman', + 'tombs', + 'tomes', + 'tomia', + 'tommy', + 'tomos', + 'tondi', + 'tondo', + 'toned', + 'toner', + 'tones', + 'toney', + 'tongs', + 'tonka', + 'tonks', + 'tonne', + 'tonus', + 'tools', + 'tooms', + 'toons', + 'toots', + 'toped', + 'topee', + 'topek', + 'toper', + 'topes', + 'tophe', + 'tophi', + 'tophs', + 'topis', + 'topoi', + 'topos', + 'toppy', + 'toque', + 'torah', + 'toran', + 'toras', + 'torcs', + 'tores', + 'toric', + 'torii', + 'toros', + 'torot', + 'torrs', + 'torse', + 'torsi', + 'torsk', + 'torta', + 'torte', + 'torts', + 'tosas', + 'tosed', + 'toses', + 'toshy', + 'tossy', + 'toted', + 'toter', + 'totes', + 'totty', + 'touks', + 'touns', + 'tours', + 'touse', + 'tousy', + 'touts', + 'touze', + 'touzy', + 'towed', + 'towie', + 'towns', + 'towny', + 'towse', + 'towsy', + 'towts', + 'towze', + 'towzy', + 'toyed', + 'toyer', + 'toyon', + 'toyos', + 'tozed', + 'tozes', + 'tozie', + 'trabs', + 'trads', + 'tragi', + 'traik', + 'trams', + 'trank', + 'tranq', + 'trans', + 'trant', + 'trape', + 'traps', + 'trapt', + 'trass', + 'trats', + 'tratt', + 'trave', + 'trayf', + 'trays', + 'treck', + 'treed', + 'treen', + 'trees', + 'trefa', + 'treif', + 'treks', + 'trema', + 'trems', + 'tress', + 'trest', + 'trets', + 'trews', + 'treyf', + 'treys', + 'triac', + 'tride', + 'trier', + 'tries', + 'triff', + 'trigo', + 'trigs', + 'trike', + 'trild', + 'trill', + 'trims', + 'trine', + 'trins', + 'triol', + 'trior', + 'trios', + 'trips', + 'tripy', + 'trist', + 'troad', + 'troak', + 'troat', + 'trock', + 'trode', + 'trods', + 'trogs', + 'trois', + 'troke', + 'tromp', + 'trona', + 'tronc', + 'trone', + 'tronk', + 'trons', + 'trooz', + 'troth', + 'trots', + 'trows', + 'troys', + 'trued', + 'trues', + 'trugo', + 'trugs', + 'trull', + 'tryer', + 'tryke', + 'tryma', + 'tryps', + 'tsade', + 'tsadi', + 'tsars', + 'tsked', + 'tsuba', + 'tsubo', + 'tuans', + 'tuart', + 'tuath', + 'tubae', + 'tubar', + 'tubas', + 'tubby', + 'tubed', + 'tubes', + 'tucks', + 'tufas', + 'tuffe', + 'tuffs', + 'tufts', + 'tufty', + 'tugra', + 'tuile', + 'tuina', + 'tuism', + 'tuktu', + 'tules', + 'tulpa', + 'tulsi', + 'tumid', + 'tummy', + 'tumps', + 'tumpy', + 'tunas', + 'tunds', + 'tuned', + 'tuner', + 'tunes', + 'tungs', + 'tunny', + 'tupek', + 'tupik', + 'tuple', + 'tuque', + 'turds', + 'turfs', + 'turfy', + 'turks', + 'turme', + 'turms', + 'turns', + 'turnt', + 'turps', + 'turrs', + 'tushy', + 'tusks', + 'tusky', + 'tutee', + 'tutti', + 'tutty', + 'tutus', + 'tuxes', + 'tuyer', + 'twaes', + 'twain', + 'twals', + 'twank', + 'twats', + 'tways', + 'tweel', + 'tween', + 'tweep', + 'tweer', + 'twerk', + 'twerp', + 'twier', + 'twigs', + 'twill', + 'twilt', + 'twink', + 'twins', + 'twiny', + 'twire', + 'twirp', + 'twite', + 'twits', + 'twoer', + 'twyer', + 'tyees', + 'tyers', + 'tyiyn', + 'tykes', + 'tyler', + 'tymps', + 'tynde', + 'tyned', + 'tynes', + 'typal', + 'typed', + 'types', + 'typey', + 'typic', + 'typos', + 'typps', + 'typto', + 'tyran', + 'tyred', + 'tyres', + 'tyros', + 'tythe', + 'tzars', + 'udals', + 'udons', + 'ugali', + 'ugged', + 'uhlan', + 'uhuru', + 'ukase', + 'ulama', + 'ulans', + 'ulema', + 'ulmin', + 'ulnad', + 'ulnae', + 'ulnar', + 'ulnas', + 'ulpan', + 'ulvas', + 'ulyie', + 'ulzie', + 'umami', + 'umbel', + 'umber', + 'umble', + 'umbos', + 'umbre', + 'umiac', + 'umiak', + 'umiaq', + 'ummah', + 'ummas', + 'ummed', + 'umped', + 'umphs', + 'umpie', + 'umpty', + 'umrah', + 'umras', + 'unais', + 'unapt', + 'unarm', + 'unary', + 'unaus', + 'unbag', + 'unban', + 'unbar', + 'unbed', + 'unbid', + 'unbox', + 'uncap', + 'unces', + 'uncia', + 'uncos', + 'uncoy', + 'uncus', + 'undam', + 'undee', + 'undos', + 'undug', + 'uneth', + 'unfix', + 'ungag', + 'unget', + 'ungod', + 'ungot', + 'ungum', + 'unhat', + 'unhip', + 'unica', + 'units', + 'unjam', + 'unked', + 'unket', + 'unkid', + 'unlaw', + 'unlay', + 'unled', + 'unlet', + 'unlid', + 'unman', + 'unmew', + 'unmix', + 'unpay', + 'unpeg', + 'unpen', + 'unpin', + 'unred', + 'unrid', + 'unrig', + 'unrip', + 'unsaw', + 'unsay', + 'unsee', + 'unsew', + 'unsex', + 'unsod', + 'untax', + 'untin', + 'unwet', + 'unwit', + 'unwon', + 'upbow', + 'upbye', + 'updos', + 'updry', + 'upend', + 'upjet', + 'uplay', + 'upled', + 'uplit', + 'upped', + 'upran', + 'uprun', + 'upsee', + 'upsey', + 'uptak', + 'upter', + 'uptie', + 'uraei', + 'urali', + 'uraos', + 'urare', + 'urari', + 'urase', + 'urate', + 'urbex', + 'urbia', + 'urdee', + 'ureal', + 'ureas', + 'uredo', + 'ureic', + 'urena', + 'urent', + 'urged', + 'urger', + 'urges', + 'urial', + 'urite', + 'urman', + 'urnal', + 'urned', + 'urped', + 'ursae', + 'ursid', + 'urson', + 'urubu', + 'urvas', + 'users', + 'usnea', + 'usque', + 'usure', + 'usury', + 'uteri', + 'uveal', + 'uveas', + 'uvula', + 'vacua', + 'vaded', + 'vades', + 'vagal', + 'vagus', + 'vails', + 'vaire', + 'vairs', + 'vairy', + 'vakas', + 'vakil', + 'vales', + 'valis', + 'valse', + 'vamps', + 'vampy', + 'vanda', + 'vaned', + 'vanes', + 'vangs', + 'vants', + 'vaped', + 'vaper', + 'vapes', + 'varan', + 'varas', + 'vardy', + 'varec', + 'vares', + 'varia', + 'varix', + 'varna', + 'varus', + 'varve', + 'vasal', + 'vases', + 'vasts', + 'vasty', + 'vatic', + 'vatus', + 'vauch', + 'vaute', + 'vauts', + 'vawte', + 'vaxes', + 'veale', + 'veals', + 'vealy', + 'veena', + 'veeps', + 'veers', + 'veery', + 'vegas', + 'veges', + 'vegie', + 'vegos', + 'vehme', + 'veils', + 'veily', + 'veins', + 'veiny', + 'velar', + 'velds', + 'veldt', + 'veles', + 'vells', + 'velum', + 'venae', + 'venal', + 'vends', + 'vendu', + 'veney', + 'venge', + 'venin', + 'vents', + 'venus', + 'verbs', + 'verra', + 'verry', + 'verst', + 'verts', + 'vertu', + 'vespa', + 'vesta', + 'vests', + 'vetch', + 'vexed', + 'vexer', + 'vexes', + 'vexil', + 'vezir', + 'vials', + 'viand', + 'vibes', + 'vibex', + 'vibey', + 'viced', + 'vices', + 'vichy', + 'viers', + 'views', + 'viewy', + 'vifda', + 'viffs', + 'vigas', + 'vigia', + 'vilde', + 'viler', + 'villi', + 'vills', + 'vimen', + 'vinal', + 'vinas', + 'vinca', + 'vined', + 'viner', + 'vines', + 'vinew', + 'vinic', + 'vinos', + 'vints', + 'viold', + 'viols', + 'vired', + 'vireo', + 'vires', + 'virga', + 'virge', + 'virid', + 'virls', + 'virtu', + 'visas', + 'vised', + 'vises', + 'visie', + 'visne', + 'vison', + 'visto', + 'vitae', + 'vitas', + 'vitex', + 'vitro', + 'vitta', + 'vivas', + 'vivat', + 'vivda', + 'viver', + 'vives', + 'vizir', + 'vizor', + 'vleis', + 'vlies', + 'vlogs', + 'voars', + 'vocab', + 'voces', + 'voddy', + 'vodou', + 'vodun', + 'voema', + 'vogie', + 'voids', + 'voile', + 'voips', + 'volae', + 'volar', + 'voled', + 'voles', + 'volet', + 'volks', + 'volta', + 'volte', + 'volti', + 'volts', + 'volva', + 'volve', + 'vomer', + 'voted', + 'votes', + 'vouge', + 'voulu', + 'vowed', + 'vower', + 'voxel', + 'vozhd', + 'vraic', + 'vrils', + 'vroom', + 'vrous', + 'vrouw', + 'vrows', + 'vuggs', + 'vuggy', + 'vughs', + 'vughy', + 'vulgo', + 'vulns', + 'vulva', + 'vutty', + 'waacs', + 'wacke', + 'wacko', + 'wacks', + 'wadds', + 'waddy', + 'waded', + 'wader', + 'wades', + 'wadge', + 'wadis', + 'wadts', + 'waffs', + 'wafts', + 'waged', + 'wages', + 'wagga', + 'wagyu', + 'wahoo', + 'waide', + 'waifs', + 'waift', + 'wails', + 'wains', + 'wairs', + 'waite', + 'waits', + 'wakas', + 'waked', + 'waken', + 'waker', + 'wakes', + 'wakfs', + 'waldo', + 'walds', + 'waled', + 'waler', + 'wales', + 'walie', + 'walis', + 'walks', + 'walla', + 'walls', + 'wally', + 'walty', + 'wamed', + 'wames', + 'wamus', + 'wands', + 'waned', + 'wanes', + 'waney', + 'wangs', + 'wanks', + 'wanky', + 'wanle', + 'wanly', + 'wanna', + 'wants', + 'wanty', + 'wanze', + 'waqfs', + 'warbs', + 'warby', + 'wards', + 'wared', + 'wares', + 'warez', + 'warks', + 'warms', + 'warns', + 'warps', + 'warre', + 'warst', + 'warts', + 'wases', + 'washy', + 'wasms', + 'wasps', + 'waspy', + 'wasts', + 'watap', + 'watts', + 'wauff', + 'waugh', + 'wauks', + 'waulk', + 'wauls', + 'waurs', + 'waved', + 'waves', + 'wavey', + 'wawas', + 'wawes', + 'wawls', + 'waxed', + 'waxer', + 'waxes', + 'wayed', + 'wazir', + 'wazoo', + 'weald', + 'weals', + 'weamb', + 'weans', + 'wears', + 'webby', + 'weber', + 'wecht', + 'wedel', + 'wedgy', + 'weeds', + 'weeke', + 'weeks', + 'weels', + 'weems', + 'weens', + 'weeny', + 'weeps', + 'weepy', + 'weest', + 'weete', + 'weets', + 'wefte', + 'wefts', + 'weids', + 'weils', + 'weirs', + 'weise', + 'weize', + 'wekas', + 'welds', + 'welke', + 'welks', + 'welkt', + 'wells', + 'welly', + 'welts', + 'wembs', + 'wends', + 'wenge', + 'wenny', + 'wents', + 'weros', + 'wersh', + 'wests', + 'wetas', + 'wetly', + 'wexed', + 'wexes', + 'whamo', + 'whams', + 'whang', + 'whaps', + 'whare', + 'whata', + 'whats', + 'whaup', + 'whaur', + 'wheal', + 'whear', + 'wheen', + 'wheep', + 'wheft', + 'whelk', + 'whelm', + 'whens', + 'whets', + 'whews', + 'wheys', + 'whids', + 'whift', + 'whigs', + 'whilk', + 'whims', + 'whins', + 'whios', + 'whips', + 'whipt', + 'whirr', + 'whirs', + 'whish', + 'whiss', + 'whist', + 'whits', + 'whity', + 'whizz', + 'whomp', + 'whoof', + 'whoot', + 'whops', + 'whore', + 'whorl', + 'whort', + 'whoso', + 'whows', + 'whump', + 'whups', + 'whyda', + 'wicca', + 'wicks', + 'wicky', + 'widdy', + 'wides', + 'wiels', + 'wifed', + 'wifes', + 'wifey', + 'wifie', + 'wifty', + 'wigan', + 'wigga', + 'wiggy', + 'wikis', + 'wilco', + 'wilds', + 'wiled', + 'wiles', + 'wilga', + 'wilis', + 'wilja', + 'wills', + 'wilts', + 'wimps', + 'winds', + 'wined', + 'wines', + 'winey', + 'winge', + 'wings', + 'wingy', + 'winks', + 'winna', + 'winns', + 'winos', + 'winze', + 'wiped', + 'wiper', + 'wipes', + 'wired', + 'wirer', + 'wires', + 'wirra', + 'wised', + 'wises', + 'wisha', + 'wisht', + 'wisps', + 'wists', + 'witan', + 'wited', + 'wites', + 'withe', + 'withs', + 'withy', + 'wived', + 'wiver', + 'wives', + 'wizen', + 'wizes', + 'woads', + 'woald', + 'wocks', + 'wodge', + 'woful', + 'wojus', + 'woker', + 'wokka', + 'wolds', + 'wolfs', + 'wolly', + 'wolve', + 'wombs', + 'womby', + 'womyn', + 'wonga', + 'wongi', + 'wonks', + 'wonky', + 'wonts', + 'woods', + 'wooed', + 'woofs', + 'woofy', + 'woold', + 'wools', + 'woons', + 'woops', + 'woopy', + 'woose', + 'woosh', + 'wootz', + 'words', + 'works', + 'worms', + 'wormy', + 'worts', + 'wowed', + 'wowee', + 'woxen', + 'wrang', + 'wraps', + 'wrapt', + 'wrast', + 'wrate', + 'wrawl', + 'wrens', + 'wrick', + 'wried', + 'wrier', + 'wries', + 'writs', + 'wroke', + 'wroot', + 'wroth', + 'wryer', + 'wuddy', + 'wudus', + 'wulls', + 'wurst', + 'wuses', + 'wushu', + 'wussy', + 'wuxia', + 'wyled', + 'wyles', + 'wynds', + 'wynns', + 'wyted', + 'wytes', + 'xebec', + 'xenia', + 'xenic', + 'xenon', + 'xeric', + 'xerox', + 'xerus', + 'xoana', + 'xrays', + 'xylan', + 'xylem', + 'xylic', + 'xylol', + 'xylyl', + 'xysti', + 'xysts', + 'yaars', + 'yabas', + 'yabba', + 'yabby', + 'yacca', + 'yacka', + 'yacks', + 'yaffs', + 'yager', + 'yages', + 'yagis', + 'yahoo', + 'yaird', + 'yakka', + 'yakow', + 'yales', + 'yamen', + 'yampy', + 'yamun', + 'yangs', + 'yanks', + 'yapok', + 'yapon', + 'yapps', + 'yappy', + 'yarak', + 'yarco', + 'yards', + 'yarer', + 'yarfa', + 'yarks', + 'yarns', + 'yarrs', + 'yarta', + 'yarto', + 'yates', + 'yauds', + 'yauld', + 'yaups', + 'yawed', + 'yawey', + 'yawls', + 'yawns', + 'yawny', + 'yawps', + 'ybore', + 'yclad', + 'ycled', + 'ycond', + 'ydrad', + 'ydred', + 'yeads', + 'yeahs', + 'yealm', + 'yeans', + 'yeard', + 'years', + 'yecch', + 'yechs', + 'yechy', + 'yedes', + 'yeeds', + 'yeesh', + 'yeggs', + 'yelks', + 'yells', + 'yelms', + 'yelps', + 'yelts', + 'yenta', + 'yente', + 'yerba', + 'yerds', + 'yerks', + 'yeses', + 'yesks', + 'yests', + 'yesty', + 'yetis', + 'yetts', + 'yeuks', + 'yeuky', + 'yeven', + 'yeves', + 'yewen', + 'yexed', + 'yexes', + 'yfere', + 'yiked', + 'yikes', + 'yills', + 'yince', + 'yipes', + 'yippy', + 'yirds', + 'yirks', + 'yirrs', + 'yirth', + 'yites', + 'yitie', + 'ylems', + 'ylike', + 'ylkes', + 'ymolt', + 'ympes', + 'yobbo', + 'yobby', + 'yocks', + 'yodel', + 'yodhs', + 'yodle', + 'yogas', + 'yogee', + 'yoghs', + 'yogic', + 'yogin', + 'yogis', + 'yoick', + 'yojan', + 'yoked', + 'yokel', + 'yoker', + 'yokes', + 'yokul', + 'yolks', + 'yolky', + 'yomim', + 'yomps', + 'yonic', + 'yonis', + 'yonks', + 'yoofs', + 'yoops', + 'yores', + 'yorks', + 'yorps', + 'youks', + 'yourn', + 'yours', + 'yourt', + 'youse', + 'yowed', + 'yowes', + 'yowie', + 'yowls', + 'yowza', + 'yrapt', + 'yrent', + 'yrivd', + 'yrneh', + 'ysame', + 'ytost', + 'yuans', + 'yucas', + 'yucca', + 'yucch', + 'yucko', + 'yucks', + 'yucky', + 'yufts', + 'yugas', + 'yuked', + 'yukes', + 'yukky', + 'yukos', + 'yulan', + 'yules', + 'yummo', + 'yummy', + 'yumps', + 'yupon', + 'yuppy', + 'yurta', + 'yurts', + 'yuzus', + 'zabra', + 'zacks', + 'zaida', + 'zaidy', + 'zaire', + 'zakat', + 'zaman', + 'zambo', + 'zamia', + 'zanja', + 'zante', + 'zanza', + 'zanze', + 'zappy', + 'zarfs', + 'zaris', + 'zatis', + 'zaxes', + 'zayin', + 'zazen', + 'zeals', + 'zebec', + 'zebub', + 'zebus', + 'zedas', + 'zeins', + 'zendo', + 'zerda', + 'zerks', + 'zeros', + 'zests', + 'zetas', + 'zexes', + 'zezes', + 'zhomo', + 'zibet', + 'ziffs', + 'zigan', + 'zilas', + 'zilch', + 'zilla', + 'zills', + 'zimbi', + 'zimbs', + 'zinco', + 'zincs', + 'zincy', + 'zineb', + 'zines', + 'zings', + 'zingy', + 'zinke', + 'zinky', + 'zippo', + 'zippy', + 'ziram', + 'zitis', + 'zizel', + 'zizit', + 'zlote', + 'zloty', + 'zoaea', + 'zobos', + 'zobus', + 'zocco', + 'zoeae', + 'zoeal', + 'zoeas', + 'zoism', + 'zoist', + 'zombi', + 'zonae', + 'zonda', + 'zoned', + 'zoner', + 'zones', + 'zonks', + 'zooea', + 'zooey', + 'zooid', + 'zooks', + 'zooms', + 'zoons', + 'zooty', + 'zoppa', + 'zoppo', + 'zoril', + 'zoris', + 'zorro', + 'zouks', + 'zowee', + 'zowie', + 'zulus', + 'zupan', + 'zupas', + 'zuppa', + 'zurfs', + 'zuzim', + 'zygal', + 'zygon', + 'zymes', + 'zymic' +]); diff --git a/examples/sveltekit-app/static/favicon.png b/examples/sveltekit-app/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/examples/sveltekit-app/static/favicon.png differ diff --git a/examples/sveltekit-app/static/robots.txt b/examples/sveltekit-app/static/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/examples/sveltekit-app/static/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/sveltekit-app/svelte.config.js b/examples/sveltekit-app/svelte.config.js new file mode 100644 index 0000000..6fb0a97 --- /dev/null +++ b/examples/sveltekit-app/svelte.config.js @@ -0,0 +1,17 @@ +import adapter from "@ptkdev/sveltekit-electron-adapter"; +import { vitePreprocess } from '@sveltejs/kit/vite'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + adapter: adapter({ + strict: false, + }), + } +}; + +export default config; diff --git a/examples/sveltekit-app/tsconfig.json b/examples/sveltekit-app/tsconfig.json new file mode 100644 index 0000000..6ae0c8c --- /dev/null +++ b/examples/sveltekit-app/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/examples/sveltekit-app/vite.config.ts b/examples/sveltekit-app/vite.config.ts new file mode 100644 index 0000000..bbf8c7d --- /dev/null +++ b/examples/sveltekit-app/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/package.json b/package.json index 55d6be4..8259fed 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,12 @@ "displayName": "SvelteKit Adapter for Desktop Apps with Electron", "description": "Adapter for SvelteKit apps that prerenders your entire site as a collection of static files for use with Electron", "version": "0.2.2-nightly.0", - "main": "./index.js", + "main": "./app/adapter/index.js", "type": "module", "exports": { ".": { - "types": "./index.d.ts", - "import": "./index.js" + "types": "./app/adapter/index.d.ts", + "import": "./app/adapter/index.js" }, "./package.json": "./package.json" }, @@ -33,7 +33,7 @@ "node": ">=14.0.0" }, "scripts": { - "build": "cp ./app/**/* . -r", + "build": "echo \"Compiling...\"", "release": "npm run build", "test": "jest app", "docs": "git submodule update --recursive && markserv ./README.md",