diff --git a/package-lock.json b/package-lock.json
index e127911..f81787d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,6 +22,7 @@
"react-dom": "19.2.4",
"react-markdown": "^10.1.0",
"remark-gfm": "^4.0.1",
+ "ts-fsrs": "^5.4.1",
"zod": "^4.4.3"
},
"devDependencies": {
@@ -33,7 +34,8 @@
"eslint-config-next": "16.2.9",
"prisma": "^7.8.0",
"tailwindcss": "^4",
- "typescript": "^5"
+ "typescript": "^5",
+ "vitest": "^4.1.10"
}
},
"node_modules/@alloc/quick-lru": {
@@ -1349,6 +1351,16 @@
"node": ">=12.4.0"
}
},
+ "node_modules/@oxc-project/types": {
+ "version": "0.139.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
"node_modules/@phc/format": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz",
@@ -1737,6 +1749,293 @@
}
}
},
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.1",
+ "@emnapi/runtime": "1.11.1",
+ "@napi-rs/wasm-runtime": "^1.1.6"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
@@ -2042,6 +2341,17 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
"node_modules/@types/debug": {
"version": "4.1.13",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
@@ -2051,6 +2361,13 @@
"@types/ms": "*"
}
},
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
@@ -2110,6 +2427,7 @@
"integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -2790,6 +3108,119 @@
"win32"
]
},
+ "node_modules/@vitest/expect": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
+ "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
+ "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "4.1.10",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
+ "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
+ "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.10",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
+ "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
+ "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
"node_modules/acorn": {
"version": "8.17.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
@@ -3040,6 +3471,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/ast-types-flow": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
@@ -3395,6 +3836,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -4061,6 +4512,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-module-lexer": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz",
+ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/es-object-atoms": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
@@ -4555,6 +5013,16 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@@ -4574,6 +5042,16 @@
"node": ">=6"
}
},
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/exsolve": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz",
@@ -4797,6 +5275,21 @@
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"license": "MIT"
},
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -7675,6 +8168,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/obug": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz",
+ "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
"node_modules/ohash": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
@@ -8407,6 +8914,40 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rolldown": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.139.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.1.5",
+ "@rolldown/binding-darwin-arm64": "1.1.5",
+ "@rolldown/binding-darwin-x64": "1.1.5",
+ "@rolldown/binding-freebsd-x64": "1.1.5",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
+ "@rolldown/binding-linux-arm64-gnu": "1.1.5",
+ "@rolldown/binding-linux-arm64-musl": "1.1.5",
+ "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
+ "@rolldown/binding-linux-s390x-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-musl": "1.1.5",
+ "@rolldown/binding-openharmony-arm64": "1.1.5",
+ "@rolldown/binding-wasm32-wasi": "1.1.5",
+ "@rolldown/binding-win32-arm64-msvc": "1.1.5",
+ "@rolldown/binding-win32-x64-msvc": "1.1.5"
+ }
+ },
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -8739,6 +9280,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -8833,6 +9381,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/std-env": {
"version": "3.10.0",
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
@@ -9130,6 +9685,23 @@
"node": ">=6"
}
},
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
+ "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
@@ -9179,6 +9751,16 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/tinyrainbow": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -9225,6 +9807,15 @@
"typescript": ">=4.8.4"
}
},
+ "node_modules/ts-fsrs": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ts-fsrs/-/ts-fsrs-5.4.1.tgz",
+ "integrity": "sha512-mOp9+oexJexBTkwjg/jQI1aSUQRLIAvbimeKHLSmVdNJPwObugFNKmZkoggH5d6kZ0uaWLboP1Al1DnXAfIb9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
"node_modules/tsconfig-paths": {
"version": "3.15.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
@@ -9646,6 +10237,236 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/vite": {
+ "version": "8.1.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz",
+ "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.16",
+ "rolldown": "~1.1.4",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.3.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.5.19",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz",
+ "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
+ "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.10",
+ "@vitest/mocker": "4.1.10",
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/runner": "4.1.10",
+ "@vitest/snapshot": "4.1.10",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.10",
+ "@vitest/browser-preview": "4.1.10",
+ "@vitest/browser-webdriverio": "4.1.10",
+ "@vitest/coverage-istanbul": "4.1.10",
+ "@vitest/coverage-v8": "4.1.10",
+ "@vitest/ui": "4.1.10",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/vitest/node_modules/std-env": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -9750,6 +10571,23 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
diff --git a/package.json b/package.json
index 6ee3ab5..584aaee 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
"dev": "next dev",
"build": "next build",
"start": "next start",
- "lint": "eslint"
+ "lint": "eslint",
+ "test": "vitest run"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
@@ -23,6 +24,7 @@
"react-dom": "19.2.4",
"react-markdown": "^10.1.0",
"remark-gfm": "^4.0.1",
+ "ts-fsrs": "^5.4.1",
"zod": "^4.4.3"
},
"devDependencies": {
@@ -34,6 +36,7 @@
"eslint-config-next": "16.2.9",
"prisma": "^7.8.0",
"tailwindcss": "^4",
- "typescript": "^5"
+ "typescript": "^5",
+ "vitest": "^4.1.10"
}
}
diff --git a/prisma/migrations/20260713200500_add_spaced_repetition/migration.sql b/prisma/migrations/20260713200500_add_spaced_repetition/migration.sql
new file mode 100644
index 0000000..abdf670
--- /dev/null
+++ b/prisma/migrations/20260713200500_add_spaced_repetition/migration.sql
@@ -0,0 +1,64 @@
+-- CreateTable
+CREATE TABLE "SpacedRepetitionSet" (
+ "id" TEXT NOT NULL PRIMARY KEY,
+ "classId" TEXT NOT NULL,
+ "name" TEXT NOT NULL,
+ "description" TEXT,
+ "newCardsPerDay" INTEGER NOT NULL DEFAULT 30,
+ "sortOrder" INTEGER NOT NULL DEFAULT 0,
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" DATETIME NOT NULL,
+ CONSTRAINT "SpacedRepetitionSet_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class" ("id") ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+-- CreateTable
+CREATE TABLE "SpacedRepetitionSetDeck" (
+ "setId" TEXT NOT NULL,
+ "deckId" TEXT NOT NULL,
+ "sortOrder" INTEGER NOT NULL DEFAULT 0,
+ "addedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+
+ PRIMARY KEY ("setId", "deckId"),
+ CONSTRAINT "SpacedRepetitionSetDeck_setId_fkey" FOREIGN KEY ("setId") REFERENCES "SpacedRepetitionSet" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT "SpacedRepetitionSetDeck_deckId_fkey" FOREIGN KEY ("deckId") REFERENCES "Deck" ("id") ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+-- CreateTable
+CREATE TABLE "SpacedRepetitionCardState" (
+ "id" TEXT NOT NULL PRIMARY KEY,
+ "setId" TEXT NOT NULL,
+ "flashcardId" TEXT NOT NULL,
+ "due" DATETIME NOT NULL,
+ "stability" REAL NOT NULL,
+ "difficulty" REAL NOT NULL,
+ "elapsedDays" INTEGER NOT NULL,
+ "scheduledDays" INTEGER NOT NULL,
+ "learningSteps" INTEGER NOT NULL DEFAULT 0,
+ "reps" INTEGER NOT NULL,
+ "lapses" INTEGER NOT NULL,
+ "state" INTEGER NOT NULL,
+ "firstReviewedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "lastReview" DATETIME,
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" DATETIME NOT NULL,
+ CONSTRAINT "SpacedRepetitionCardState_setId_fkey" FOREIGN KEY ("setId") REFERENCES "SpacedRepetitionSet" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ CONSTRAINT "SpacedRepetitionCardState_flashcardId_fkey" FOREIGN KEY ("flashcardId") REFERENCES "Flashcard" ("id") ON DELETE CASCADE ON UPDATE CASCADE
+);
+
+-- CreateIndex
+CREATE INDEX "SpacedRepetitionSet_classId_sortOrder_idx" ON "SpacedRepetitionSet"("classId", "sortOrder");
+
+-- CreateIndex
+CREATE INDEX "SpacedRepetitionSetDeck_deckId_idx" ON "SpacedRepetitionSetDeck"("deckId");
+
+-- CreateIndex
+CREATE INDEX "SpacedRepetitionCardState_setId_due_idx" ON "SpacedRepetitionCardState"("setId", "due");
+
+-- CreateIndex
+CREATE INDEX "SpacedRepetitionCardState_setId_firstReviewedAt_idx" ON "SpacedRepetitionCardState"("setId", "firstReviewedAt");
+
+-- CreateIndex
+CREATE INDEX "SpacedRepetitionCardState_flashcardId_idx" ON "SpacedRepetitionCardState"("flashcardId");
+
+-- CreateIndex
+CREATE UNIQUE INDEX "SpacedRepetitionCardState_setId_flashcardId_key" ON "SpacedRepetitionCardState"("setId", "flashcardId");
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index be359a1..cfec0f4 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -14,9 +14,10 @@ model Class {
sortOrder Int @default(0)
createdAt DateTime @default(now())
- decks Deck[]
- quizSets QuizSet[]
- materialGroups MaterialGroup[]
+ decks Deck[]
+ quizSets QuizSet[]
+ materialGroups MaterialGroup[]
+ spacedRepetitionSets SpacedRepetitionSet[]
}
model Deck {
@@ -27,12 +28,13 @@ model Deck {
sortOrder Int @default(0)
createdAt DateTime @default(now())
- class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
- groupId String?
- group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
- cards Flashcard[]
- shareLink ShareLink?
- progress StudyProgress[]
+ class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
+ groupId String?
+ group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
+ cards Flashcard[]
+ shareLink ShareLink?
+ progress StudyProgress[]
+ spacedRepetitionMemberships SpacedRepetitionSetDeck[]
}
model Flashcard {
@@ -42,7 +44,8 @@ model Flashcard {
back String
sortOrder Int @default(0)
- deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
+ deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
+ spacedRepetitionStates SpacedRepetitionCardState[]
}
model QuizSet {
@@ -53,9 +56,9 @@ model QuizSet {
sortOrder Int @default(0)
createdAt DateTime @default(now())
- class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
+ class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
groupId String?
- group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
+ group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
questions Question[]
attempts QuizAttempt[]
shareLink ShareLink?
@@ -153,12 +156,69 @@ model MaterialGroup {
id String @id @default(uuid())
classId String
name String
- type String // "DECK" | "QUIZ"
+ type String // "DECK" | "QUIZ"
sortOrder Int @default(0)
createdAt DateTime @default(now())
- class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
+ class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
decks Deck[]
quizSets QuizSet[]
shareLink ShareLink?
}
+
+model SpacedRepetitionSet {
+ id String @id @default(uuid())
+ classId String
+ name String
+ description String?
+ newCardsPerDay Int @default(30)
+ sortOrder Int @default(0)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
+ decks SpacedRepetitionSetDeck[]
+ cardStates SpacedRepetitionCardState[]
+
+ @@index([classId, sortOrder])
+}
+
+model SpacedRepetitionSetDeck {
+ setId String
+ deckId String
+ sortOrder Int @default(0)
+ addedAt DateTime @default(now())
+
+ set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)
+ deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
+
+ @@id([setId, deckId])
+ @@index([deckId])
+}
+
+model SpacedRepetitionCardState {
+ id String @id @default(uuid())
+ setId String
+ flashcardId String
+ due DateTime
+ stability Float
+ difficulty Float
+ elapsedDays Int
+ scheduledDays Int
+ learningSteps Int @default(0)
+ reps Int
+ lapses Int
+ state Int
+ firstReviewedAt DateTime @default(now())
+ lastReview DateTime?
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)
+ flashcard Flashcard @relation(fields: [flashcardId], references: [id], onDelete: Cascade)
+
+ @@unique([setId, flashcardId])
+ @@index([setId, due])
+ @@index([setId, firstReviewedAt])
+ @@index([flashcardId])
+}
diff --git a/src/app/(protected)/[classSlug]/spaced-repetition/[setId]/page.tsx b/src/app/(protected)/[classSlug]/spaced-repetition/[setId]/page.tsx
new file mode 100644
index 0000000..4bd9feb
--- /dev/null
+++ b/src/app/(protected)/[classSlug]/spaced-repetition/[setId]/page.tsx
@@ -0,0 +1,5 @@
+import { SpacedRepetitionViewer } from "@/components/spaced-repetition/SpacedRepetitionViewer";
+
+export default function SpacedRepetitionStudyPage() {
+ return ;
+}
diff --git a/src/app/(protected)/[classSlug]/spaced-repetition/page.tsx b/src/app/(protected)/[classSlug]/spaced-repetition/page.tsx
new file mode 100644
index 0000000..b07ee3b
--- /dev/null
+++ b/src/app/(protected)/[classSlug]/spaced-repetition/page.tsx
@@ -0,0 +1,5 @@
+import { SpacedRepetitionSets } from "@/components/spaced-repetition/SpacedRepetitionSets";
+
+export default function SpacedRepetitionPage() {
+ return ;
+}
diff --git a/src/app/(protected)/page.tsx b/src/app/(protected)/page.tsx
index ba8de20..5d37387 100644
--- a/src/app/(protected)/page.tsx
+++ b/src/app/(protected)/page.tsx
@@ -9,6 +9,10 @@ interface ClassItem {
slug: string;
name: string;
_count: { decks: number; quizSets: number };
+ spacedRepetitionDueCards: number;
+ spacedRepetitionLearningCards: number;
+ spacedRepetitionNewCards: number;
+ spacedRepetitionReadyCards: number;
}
const accents = ["#4f46e5", "#f97360", "#25845f", "#c27718", "#8b5cf6", "#0284c7"];
@@ -114,6 +118,14 @@ export default function HomePage() {
{cls._count.decks} {cls._count.decks === 1 ? "deck" : "decks"}
{cls._count.quizSets} {cls._count.quizSets === 1 ? "quiz" : "quizzes"}
+ {cls.spacedRepetitionReadyCards > 0 && (
+
+ {cls.spacedRepetitionReadyCards} {cls.spacedRepetitionReadyCards === 1 ? "card" : "cards"} ready
+
+ )}
diff --git a/src/app/api/spaced-repetition-sets/[id]/decks/[deckId]/route.ts b/src/app/api/spaced-repetition-sets/[id]/decks/[deckId]/route.ts
new file mode 100644
index 0000000..8abeee4
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/[id]/decks/[deckId]/route.ts
@@ -0,0 +1,16 @@
+import { NextRequest, NextResponse } from "next/server";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function DELETE(
+ _request: NextRequest,
+ context: { params: Promise<{ id: string; deckId: string }> }
+) {
+ const { id, deckId } = await context.params;
+ try {
+ await spacedRepetitionService.removeDeck(id, deckId);
+ return NextResponse.json({ success: true });
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/app/api/spaced-repetition-sets/[id]/decks/route.ts b/src/app/api/spaced-repetition-sets/[id]/decks/route.ts
new file mode 100644
index 0000000..805af67
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/[id]/decks/route.ts
@@ -0,0 +1,43 @@
+import { NextRequest, NextResponse } from "next/server";
+import {
+ addSpacedRepetitionDeckSchema,
+ reorderSpacedRepetitionDecksSchema,
+} from "@/lib/validation/spacedRepetitionSchemas";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function POST(
+ request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ const parsed = addSpacedRepetitionDeckSchema.safeParse(
+ await request.json().catch(() => null)
+ );
+ if (!parsed.success) return NextResponse.json({ error: "Invalid deck" }, { status: 400 });
+ try {
+ return NextResponse.json(
+ await spacedRepetitionService.addDeck(id, parsed.data.deckId),
+ { status: 201 }
+ );
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
+
+export async function PATCH(
+ request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ const parsed = reorderSpacedRepetitionDecksSchema.safeParse(
+ await request.json().catch(() => null)
+ );
+ if (!parsed.success) return NextResponse.json({ error: "Invalid deck order" }, { status: 400 });
+ try {
+ await spacedRepetitionService.reorderDecks(id, parsed.data.deckIds);
+ return NextResponse.json({ success: true });
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/app/api/spaced-repetition-sets/[id]/reviews/route.ts b/src/app/api/spaced-repetition-sets/[id]/reviews/route.ts
new file mode 100644
index 0000000..4e11cf8
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/[id]/reviews/route.ts
@@ -0,0 +1,22 @@
+import { NextRequest, NextResponse } from "next/server";
+import { reviewSpacedRepetitionCardSchema } from "@/lib/validation/spacedRepetitionSchemas";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function POST(
+ request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ const parsed = reviewSpacedRepetitionCardSchema.safeParse(
+ await request.json().catch(() => null)
+ );
+ if (!parsed.success) return NextResponse.json({ error: "Invalid review" }, { status: 400 });
+ try {
+ return NextResponse.json(
+ await spacedRepetitionService.reviewCard({ setId: id, ...parsed.data })
+ );
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/app/api/spaced-repetition-sets/[id]/route.ts b/src/app/api/spaced-repetition-sets/[id]/route.ts
new file mode 100644
index 0000000..721f616
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/[id]/route.ts
@@ -0,0 +1,45 @@
+import { NextRequest, NextResponse } from "next/server";
+import { updateSpacedRepetitionSetSchema } from "@/lib/validation/spacedRepetitionSchemas";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function GET(
+ _request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ try {
+ return NextResponse.json(await spacedRepetitionService.getSet(id));
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
+
+export async function PATCH(
+ request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ const parsed = updateSpacedRepetitionSetSchema.safeParse(
+ await request.json().catch(() => null)
+ );
+ if (!parsed.success) return NextResponse.json({ error: "Invalid update" }, { status: 400 });
+ try {
+ return NextResponse.json(await spacedRepetitionService.updateSet(id, parsed.data));
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
+
+export async function DELETE(
+ _request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ try {
+ await spacedRepetitionService.deleteSet(id);
+ return NextResponse.json({ success: true });
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/app/api/spaced-repetition-sets/[id]/study/route.ts b/src/app/api/spaced-repetition-sets/[id]/study/route.ts
new file mode 100644
index 0000000..5addeed
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/[id]/study/route.ts
@@ -0,0 +1,15 @@
+import { NextRequest, NextResponse } from "next/server";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function GET(
+ _request: NextRequest,
+ context: { params: Promise<{ id: string }> }
+) {
+ const { id } = await context.params;
+ try {
+ return NextResponse.json(await spacedRepetitionService.getStudyState(id));
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/app/api/spaced-repetition-sets/route.ts b/src/app/api/spaced-repetition-sets/route.ts
new file mode 100644
index 0000000..bcc2ec3
--- /dev/null
+++ b/src/app/api/spaced-repetition-sets/route.ts
@@ -0,0 +1,30 @@
+import { NextRequest, NextResponse } from "next/server";
+import { createSpacedRepetitionSetSchema } from "@/lib/validation/spacedRepetitionSchemas";
+import { spacedRepetitionErrorResponse } from "@/lib/spacedRepetitionApi";
+import * as spacedRepetitionService from "@/services/spacedRepetitionService";
+
+export async function GET(request: NextRequest) {
+ const classId = new URL(request.url).searchParams.get("classId");
+ if (!classId) return NextResponse.json({ error: "classId is required" }, { status: 400 });
+ try {
+ return NextResponse.json(await spacedRepetitionService.listSetsByClass(classId));
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
+
+export async function POST(request: NextRequest) {
+ const parsed = createSpacedRepetitionSetSchema.safeParse(
+ await request.json().catch(() => null)
+ );
+ if (!parsed.success) {
+ return NextResponse.json({ error: "Invalid repetition set" }, { status: 400 });
+ }
+ try {
+ return NextResponse.json(await spacedRepetitionService.createSet(parsed.data), {
+ status: 201,
+ });
+ } catch (error) {
+ return spacedRepetitionErrorResponse(error);
+ }
+}
diff --git a/src/components/spaced-repetition/SpacedRepetitionSets.tsx b/src/components/spaced-repetition/SpacedRepetitionSets.tsx
new file mode 100644
index 0000000..af0b9b3
--- /dev/null
+++ b/src/components/spaced-repetition/SpacedRepetitionSets.tsx
@@ -0,0 +1,365 @@
+"use client";
+
+/* eslint-disable react-hooks/refs -- @dnd-kit intentionally returns render-time ref callbacks and drag state. */
+
+import { useCallback, useEffect, useState } from "react";
+import Link from "next/link";
+import { useParams } from "next/navigation";
+import {
+ DndContext,
+ KeyboardSensor,
+ PointerSensor,
+ pointerWithin,
+ useDraggable,
+ useDndContext,
+ useDroppable,
+ useSensor,
+ useSensors,
+ type DragEndEvent,
+} from "@dnd-kit/core";
+import {
+ SortableContext,
+ arrayMove,
+ sortableKeyboardCoordinates,
+ useSortable,
+ verticalListSortingStrategy,
+} from "@dnd-kit/sortable";
+import { CSS } from "@dnd-kit/utilities";
+
+interface DeckSummary {
+ id: string;
+ name: string;
+ description: string | null;
+ sortOrder?: number;
+ _count: { cards: number };
+}
+
+interface SetSummary {
+ id: string;
+ name: string;
+ description: string | null;
+ newCardsPerDay: number;
+ decks: DeckSummary[];
+ stats: {
+ totalCards: number;
+ reviewedCards: number;
+ unseenCards: number;
+ dueCards: number;
+ learningAheadCards: number;
+ newCardsAvailable: number;
+ availableCards: number;
+ nextDue: string | null;
+ };
+}
+
+interface EditState {
+ id: string;
+ name: string;
+ description: string;
+ newCardsPerDay: number;
+}
+
+function notifyStudyAvailabilityChanged() {
+ window.dispatchEvent(new Event("spaced-repetition-updated"));
+}
+
+function SourceDeck({ deck }: { deck: DeckSummary }) {
+ const drag = useDraggable({
+ id: `source:${deck.id}`,
+ data: { deckId: deck.id, sourceSetId: null },
+ });
+ return (
+
+
+
+
{deck.name}
+
{deck._count.cards} cards
+
+
+ );
+}
+
+function MembershipDeck({ deck, setId, onRemove }: {
+ deck: DeckSummary;
+ setId: string;
+ onRemove: () => void;
+}) {
+ const sortable = useSortable({
+ id: `set:${setId}:deck:${deck.id}`,
+ data: { deckId: deck.id, sourceSetId: setId, setId },
+ });
+ return (
+
+
+
+
{deck.name}
+
{deck._count.cards} cards
+
+
+
+ );
+}
+
+function SetDropZone({ set, children }: { set: SetSummary; children: React.ReactNode }) {
+ const drop = useDroppable({ id: `set:${set.id}`, data: { setId: set.id } });
+ const { over } = useDndContext();
+ const isOver =
+ over?.id === `set:${set.id}` || over?.data.current?.setId === set.id;
+ return (
+
+ {children}
+
+ );
+}
+
+export function SpacedRepetitionSets() {
+ const { classSlug } = useParams<{ classSlug: string }>();
+ const [classId, setClassId] = useState("");
+ const [sets, setSets] = useState
([]);
+ const [decks, setDecks] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [creating, setCreating] = useState(false);
+ const [newName, setNewName] = useState("");
+ const [editing, setEditing] = useState(null);
+ const [message, setMessage] = useState(null);
+ const sensors = useSensors(
+ useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),
+ useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })
+ );
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const classesResponse = await fetch("/api/classes");
+ const classes = (await classesResponse.json()) as Array<{ id: string; slug: string }>;
+ const currentClass = classes.find((item) => item.slug === classSlug);
+ if (!currentClass) throw new Error("Class not found");
+ setClassId(currentClass.id);
+ const [setsResponse, decksResponse] = await Promise.all([
+ fetch(`/api/spaced-repetition-sets?classId=${currentClass.id}`),
+ fetch(`/api/decks/list?classId=${currentClass.id}`),
+ ]);
+ if (!setsResponse.ok || !decksResponse.ok) throw new Error("Unable to load repetition sets");
+ setSets(await setsResponse.json());
+ setDecks(await decksResponse.json());
+ } catch (error) {
+ setMessage(error instanceof Error ? error.message : "Unable to load repetition sets");
+ } finally {
+ setLoading(false);
+ }
+ }, [classSlug]);
+
+ useEffect(() => {
+ const timer = window.setTimeout(() => void load(), 0);
+ return () => window.clearTimeout(timer);
+ }, [load]);
+
+ async function createSet() {
+ if (!newName.trim()) return;
+ const response = await fetch("/api/spaced-repetition-sets", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ classId, name: newName, newCardsPerDay: 30 }),
+ });
+ if (!response.ok) return setMessage("Could not create repetition set");
+ setNewName("");
+ setCreating(false);
+ await load();
+ }
+
+ async function saveEdit() {
+ if (!editing) return;
+ const response = await fetch(`/api/spaced-repetition-sets/${editing.id}`, {
+ method: "PATCH",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ name: editing.name,
+ description: editing.description,
+ newCardsPerDay: editing.newCardsPerDay,
+ }),
+ });
+ if (!response.ok) return setMessage("Could not update repetition set");
+ setEditing(null);
+ notifyStudyAvailabilityChanged();
+ await load();
+ }
+
+ async function deleteSet(set: SetSummary) {
+ if (!confirm(`Delete “${set.name}”? Its spaced-repetition schedules will be permanently removed.`)) return;
+ const response = await fetch(`/api/spaced-repetition-sets/${set.id}`, { method: "DELETE" });
+ if (!response.ok) return setMessage("Could not delete repetition set");
+ notifyStudyAvailabilityChanged();
+ await load();
+ }
+
+ async function removeDeck(set: SetSummary, deck: DeckSummary) {
+ if (!confirm(`Remove “${deck.name}” from “${set.name}”? Its scheduling history in this set will be reset.`)) return;
+ const response = await fetch(`/api/spaced-repetition-sets/${set.id}/decks/${deck.id}`, { method: "DELETE" });
+ if (!response.ok) return setMessage("Could not remove deck");
+ notifyStudyAvailabilityChanged();
+ await load();
+ }
+
+ async function addDeck(setId: string, deckId: string) {
+ const target = sets.find((set) => set.id === setId);
+ const deck = decks.find((item) => item.id === deckId);
+ if (target?.decks.some((item) => item.id === deckId)) {
+ setMessage(`${deck?.name ?? "That deck"} is already in ${target.name}.`);
+ return;
+ }
+ const response = await fetch(`/api/spaced-repetition-sets/${setId}/decks`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ deckId }),
+ });
+ if (!response.ok) return setMessage((await response.json()).error ?? "Could not add deck");
+ setMessage(`${deck?.name ?? "Deck"} added.`);
+ notifyStudyAvailabilityChanged();
+ await load();
+ }
+
+ async function handleDragEnd(event: DragEndEvent) {
+ const activeData = event.active.data.current as { deckId?: string; sourceSetId?: string | null } | undefined;
+ const overData = event.over?.data.current as { setId?: string; deckId?: string } | undefined;
+ if (!activeData?.deckId || !overData?.setId) return;
+ const targetSetId = overData.setId;
+
+ if (activeData.sourceSetId === targetSetId && overData.deckId) {
+ const target = sets.find((set) => set.id === targetSetId);
+ if (!target) return;
+ const oldIndex = target.decks.findIndex((deck) => deck.id === activeData.deckId);
+ const newIndex = target.decks.findIndex((deck) => deck.id === overData.deckId);
+ if (oldIndex < 0 || newIndex < 0 || oldIndex === newIndex) return;
+ const ordered = arrayMove(target.decks, oldIndex, newIndex);
+ setSets((current) => current.map((set) => set.id === targetSetId ? { ...set, decks: ordered } : set));
+ const response = await fetch(`/api/spaced-repetition-sets/${targetSetId}/decks`, {
+ method: "PATCH",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ deckIds: ordered.map((deck) => deck.id) }),
+ });
+ if (!response.ok) await load();
+ return;
+ }
+ await addDeck(targetSetId, activeData.deckId);
+ }
+
+ if (loading) return Loading repetition sets…
;
+
+ return (
+
+
+
Adaptive review
Spaced repetition
+
+
+
+ {message &&
{message}
}
+
+ {creating && (
+
+ setNewName(event.target.value)} onKeyDown={(event) => event.key === "Enter" && createSet()} placeholder="e.g. Patho comprehensive review" className="min-h-11 flex-1 rounded-lg border border-border bg-bg-surface-alt px-3 text-text-heading" />
+
+
+
+ )}
+
+
+
+ {sets.length === 0 &&
No repetition sets yet
Create one, then drag flashcard decks into it.
}
+ {sets.map((set) => (
+
+
+
+
{set.name}
+ {set.description &&
{set.description}
}
+
+ {set.stats.totalCards} cards
+ {set.stats.dueCards} due
+ {set.stats.learningAheadCards > 0 && {set.stats.learningAheadCards} learning}
+ {set.stats.newCardsAvailable} new today
+ Limit {set.newCardsPerDay}/day
+
+
+
+ {set.stats.totalCards === 0 ?
: set.stats.availableCards > 0 ? (
+
{set.stats.reviewedCards === 0 ? "Study" : "Continue"} · {set.stats.availableCards}
+ ) :
Caught up}
+
+
+
+
+ `set:${set.id}:deck:${deck.id}`)} strategy={verticalListSortingStrategy}>
+
+ {set.decks.length === 0 ? Drop flashcard decks here
: set.decks.map((deck) => removeDeck(set, deck)} />)}
+
+
+
+ ))}
+
+
+ Source library
+ Flashcard decks
+ Drag a deck into any repetition set. The original deck stays here and can be reused.
+ {decks.length ? {decks.map((deck) => )}
: Create flashcard decks before building a repetition set.
}
+
+
+
+
+ {editing && (
+
+
+
Edit repetition set
+
+
setEditing({ ...editing, name: event.target.value })} className="mt-1 min-h-11 w-full rounded-lg border border-border bg-bg-surface-alt px-3 text-text-heading" />
+
+
+
+ )}
+
+ );
+}
diff --git a/src/components/spaced-repetition/SpacedRepetitionViewer.tsx b/src/components/spaced-repetition/SpacedRepetitionViewer.tsx
new file mode 100644
index 0000000..8fbdea4
--- /dev/null
+++ b/src/components/spaced-repetition/SpacedRepetitionViewer.tsx
@@ -0,0 +1,220 @@
+"use client";
+
+import { useCallback, useEffect, useState } from "react";
+import { useParams, useRouter } from "next/navigation";
+import ReactMarkdown from "react-markdown";
+import remarkGfm from "remark-gfm";
+import type { SpacedRepetitionRating } from "@/lib/spacedRepetition";
+
+interface StudyState {
+ set: {
+ id: string;
+ name: string;
+ description: string | null;
+ class: { slug: string; name: string };
+ stats: {
+ totalCards: number;
+ reviewedCards: number;
+ unseenCards: number;
+ dueCards: number;
+ learningAheadCards: number;
+ newCardsAvailable: number;
+ availableCards: number;
+ nextDue: string | null;
+ };
+ };
+ currentCard: {
+ id: string;
+ front: string;
+ back: string;
+ sourceDeckName: string;
+ stateVersion: string | null;
+ previews: Array<{
+ rating: SpacedRepetitionRating;
+ due: string;
+ scheduledDays: number;
+ }>;
+ } | null;
+}
+
+const ratingStyles: Record = {
+ AGAIN: "border-error/35 text-error hover:bg-error-bg",
+ HARD: "border-accent/40 text-accent hover:bg-bg-surface-alt",
+ GOOD: "border-success/35 text-success hover:bg-success-bg",
+ EASY: "border-primary/35 text-primary hover:bg-bg-callout",
+};
+
+function intervalLabel(due: string, scheduledDays: number) {
+ if (scheduledDays >= 1) {
+ if (scheduledDays < 30) return `${scheduledDays}d`;
+ const months = Math.round(scheduledDays / 30);
+ if (months < 12) return `${months}mo`;
+ return `${Math.round(months / 12)}y`;
+ }
+
+ const minutes = Math.max(1, Math.round((new Date(due).getTime() - Date.now()) / 60000));
+ if (minutes < 60) return `${minutes}m`;
+ const hours = Math.round(minutes / 60);
+ return `${hours}h`;
+}
+
+function dueLabel(due: string | null) {
+ if (!due) return "No reviews scheduled";
+ return new Intl.DateTimeFormat(undefined, {
+ dateStyle: "medium",
+ timeStyle: "short",
+ }).format(new Date(due));
+}
+
+export function SpacedRepetitionViewer() {
+ const { classSlug, setId } = useParams<{ classSlug: string; setId: string }>();
+ const router = useRouter();
+ const [data, setData] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [flipped, setFlipped] = useState(false);
+ const [saving, setSaving] = useState(false);
+ const [error, setError] = useState(null);
+
+ const load = useCallback(async () => {
+ setLoading(true);
+ try {
+ const response = await fetch(`/api/spaced-repetition-sets/${setId}/study`, {
+ cache: "no-store",
+ });
+ if (!response.ok) throw new Error("Repetition set not found");
+ const nextData = (await response.json()) as StudyState;
+ if (nextData.set.class.slug !== classSlug) throw new Error("Repetition set not found");
+ setData(nextData);
+ setFlipped(false);
+ setError(null);
+ } catch {
+ router.push(`/${classSlug}/spaced-repetition`);
+ } finally {
+ setLoading(false);
+ }
+ }, [classSlug, router, setId]);
+
+ useEffect(() => {
+ const timer = window.setTimeout(() => void load(), 0);
+ return () => window.clearTimeout(timer);
+ }, [load]);
+
+ const submitRating = useCallback(async (rating: SpacedRepetitionRating) => {
+ if (!data?.currentCard || saving) return;
+ setSaving(true);
+ setError(null);
+ try {
+ const response = await fetch(`/api/spaced-repetition-sets/${setId}/reviews`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ flashcardId: data.currentCard.id,
+ rating,
+ expectedStateVersion: data.currentCard.stateVersion,
+ }),
+ });
+ if (response.status === 409) {
+ await load();
+ setError("That review was already saved. The queue has been refreshed.");
+ return;
+ }
+ if (!response.ok) {
+ const body = await response.json().catch(() => null);
+ throw new Error(body?.error ?? "Unable to save review");
+ }
+ setData(await response.json());
+ window.dispatchEvent(new Event("spaced-repetition-updated"));
+ setFlipped(false);
+ } catch (reviewError) {
+ setError(reviewError instanceof Error ? reviewError.message : "Unable to save review");
+ } finally {
+ setSaving(false);
+ }
+ }, [data, load, saving, setId]);
+
+ useEffect(() => {
+ function onKeyDown(event: KeyboardEvent) {
+ if (!data?.currentCard || saving) return;
+ if (event.key === " " || event.key === "Enter") {
+ event.preventDefault();
+ setFlipped((current) => !current);
+ return;
+ }
+ if (!flipped) return;
+ const keyboardRatings: Record = {
+ "1": "AGAIN", "2": "HARD", "3": "GOOD", "4": "EASY",
+ };
+ const rating = keyboardRatings[event.key];
+ if (rating) submitRating(rating);
+ }
+ window.addEventListener("keydown", onKeyDown);
+ return () => window.removeEventListener("keydown", onKeyDown);
+ }, [data, flipped, saving, submitRating]);
+
+ if (loading || !data) {
+ return Loading review queue…
;
+ }
+
+ const card = data.currentCard;
+ return (
+
+
+
+ {error &&
{error}
}
+
+ {!card ? (
+
+
✓
+
You’re caught up
+
There are no due cards and today’s new-card allowance is complete.
+
Next review: {dueLabel(data.set.stats.nextDue)}
+
+
+ ) : (
+
+
From {card.sourceDeckName}{data.set.stats.availableCards} available
+
!saving && setFlipped((current) => !current)}
+ className="perspective-1000 relative w-full cursor-pointer select-none"
+ >
+
+
+
Front
+
{card.front}
+
Tap or press Space to reveal the answer
+
+
+
+
+
+
+ {card.previews.map((preview, index) => (
+
+ ))}
+
+
{flipped ? "Choose 1–4 based on how well you remembered" : "Space to flip"}
+
+ )}
+
+ );
+}
diff --git a/src/components/ui/Navbar.tsx b/src/components/ui/Navbar.tsx
index 632fb54..7eec153 100644
--- a/src/components/ui/Navbar.tsx
+++ b/src/components/ui/Navbar.tsx
@@ -1,6 +1,6 @@
"use client";
-import { useState } from "react";
+import { useCallback, useEffect, useState } from "react";
import { useRouter, usePathname } from "next/navigation";
import Link from "next/link";
import { ThemeToggle } from "./ThemeToggle";
@@ -19,6 +19,37 @@ export function Navbar() {
const [open, setOpen] = useState(false);
const parts = pathname.split("/").filter(Boolean);
const classSlug = parts[0] && parts[0] !== "shared" ? parts[0] : null;
+ const [hasReadyCards, setHasReadyCards] = useState(false);
+
+ const refreshDueCards = useCallback(async () => {
+ if (!classSlug) return;
+
+ try {
+ const response = await fetch("/api/classes");
+ if (!response.ok) return;
+ const classes = await response.json() as Array<{
+ slug: string;
+ spacedRepetitionReadyCards: number;
+ }>;
+ const currentClass = classes.find((classItem) => classItem.slug === classSlug);
+ setHasReadyCards((currentClass?.spacedRepetitionReadyCards ?? 0) > 0);
+ } catch {
+ // Keep the last known state when a background refresh fails.
+ }
+ }, [classSlug]);
+
+ useEffect(() => {
+ const initialRefresh = window.setTimeout(() => void refreshDueCards(), 0);
+ const interval = window.setInterval(refreshDueCards, 60_000);
+ window.addEventListener("focus", refreshDueCards);
+ window.addEventListener("spaced-repetition-updated", refreshDueCards);
+ return () => {
+ window.clearTimeout(initialRefresh);
+ window.clearInterval(interval);
+ window.removeEventListener("focus", refreshDueCards);
+ window.removeEventListener("spaced-repetition-updated", refreshDueCards);
+ };
+ }, [refreshDueCards]);
async function handleLogout() {
await fetch("/api/auth/logout", { method: "POST" });
@@ -61,6 +92,22 @@ export function Navbar() {
>
✓ Quizzes
+ setOpen(false)}
+ className={`mt-1 flex min-h-11 items-center gap-3 rounded-xl px-3 text-sm font-semibold transition-colors ${pathname.includes("/spaced-repetition") ? "bg-bg-callout text-primary" : "text-text-secondary hover:bg-bg-surface-alt hover:text-text-heading"}`}
+ >
+ ↻ Spaced Repetition
+ {classSlug && hasReadyCards && (
+
+ !
+ Cards ready to study
+
+ )}
+
)}
diff --git a/src/config/studyModes.ts b/src/config/studyModes.ts
index 49ba427..ef865f6 100644
--- a/src/config/studyModes.ts
+++ b/src/config/studyModes.ts
@@ -1,6 +1,7 @@
export const STUDY_MODES = [
{ key: "flashcards", label: "Flashcards", path: "flashcards" },
{ key: "quizzes", label: "Quizzes", path: "quizzes" },
+ { key: "spaced-repetition", label: "Spaced Repetition", path: "spaced-repetition" },
// Future modes get added here — the layout, tab bar, and auth middleware need no changes.
] as const;
diff --git a/src/generated/prisma/browser.ts b/src/generated/prisma/browser.ts
index cffdc48..cc59e90 100644
--- a/src/generated/prisma/browser.ts
+++ b/src/generated/prisma/browser.ts
@@ -82,3 +82,18 @@ export type StudyActivity = Prisma.StudyActivityModel
*
*/
export type MaterialGroup = Prisma.MaterialGroupModel
+/**
+ * Model SpacedRepetitionSet
+ *
+ */
+export type SpacedRepetitionSet = Prisma.SpacedRepetitionSetModel
+/**
+ * Model SpacedRepetitionSetDeck
+ *
+ */
+export type SpacedRepetitionSetDeck = Prisma.SpacedRepetitionSetDeckModel
+/**
+ * Model SpacedRepetitionCardState
+ *
+ */
+export type SpacedRepetitionCardState = Prisma.SpacedRepetitionCardStateModel
diff --git a/src/generated/prisma/client.ts b/src/generated/prisma/client.ts
index 27a7cbd..d9db84c 100644
--- a/src/generated/prisma/client.ts
+++ b/src/generated/prisma/client.ts
@@ -106,3 +106,18 @@ export type StudyActivity = Prisma.StudyActivityModel
*
*/
export type MaterialGroup = Prisma.MaterialGroupModel
+/**
+ * Model SpacedRepetitionSet
+ *
+ */
+export type SpacedRepetitionSet = Prisma.SpacedRepetitionSetModel
+/**
+ * Model SpacedRepetitionSetDeck
+ *
+ */
+export type SpacedRepetitionSetDeck = Prisma.SpacedRepetitionSetDeckModel
+/**
+ * Model SpacedRepetitionCardState
+ *
+ */
+export type SpacedRepetitionCardState = Prisma.SpacedRepetitionCardStateModel
diff --git a/src/generated/prisma/internal/class.ts b/src/generated/prisma/internal/class.ts
index de318cc..6dbbf00 100644
--- a/src/generated/prisma/internal/class.ts
+++ b/src/generated/prisma/internal/class.ts
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.8.0",
"engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a",
"activeProvider": "sqlite",
- "inlineSchema": "datasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\nmodel Class {\n id String @id @default(uuid())\n slug String @unique\n name String\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n decks Deck[]\n quizSets QuizSet[]\n materialGroups MaterialGroup[]\n}\n\nmodel Deck {\n id String @id @default(uuid())\n classId String\n name String\n description String?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n groupId String?\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)\n cards Flashcard[]\n shareLink ShareLink?\n progress StudyProgress[]\n}\n\nmodel Flashcard {\n id String @id @default(uuid())\n deckId String\n front String\n back String\n sortOrder Int @default(0)\n\n deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)\n}\n\nmodel QuizSet {\n id String @id @default(uuid())\n classId String\n name String\n description String?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n groupId String?\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)\n questions Question[]\n attempts QuizAttempt[]\n shareLink ShareLink?\n progress StudyProgress[]\n}\n\nmodel Question {\n id String @id @default(uuid())\n quizSetId String\n type String // \"MULTIPLE_CHOICE\" | \"SATA\"\n prompt String\n rationale String\n category String\n sortOrder Int @default(0)\n\n quizSet QuizSet @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n options AnswerOption[]\n}\n\nmodel AnswerOption {\n id String @id @default(uuid())\n questionId String\n text String\n isCorrect Boolean @default(false)\n sortOrder Int @default(0)\n\n question Question @relation(fields: [questionId], references: [id], onDelete: Cascade)\n}\n\nmodel StudyProgress {\n id String @id @default(uuid())\n contentType String // \"DECK\" | \"QUIZ\"\n deckId String?\n quizSetId String?\n mode String // \"SEQUENTIAL\" | \"SHUFFLED\"\n currentIndex Int @default(0)\n orderJson String // JSON array of card/question ids\n answersJson String? // in-progress quiz answers\n cardResultsJson String? // per-card grades for decks\n updatedAt DateTime @updatedAt\n\n deck Deck? @relation(fields: [deckId], references: [id], onDelete: Cascade)\n quizSet QuizSet? @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n\n @@unique([deckId, mode])\n @@unique([quizSetId, mode])\n}\n\nmodel QuizAttempt {\n id String @id @default(uuid())\n quizSetId String\n score Float\n maxScore Int\n answersJson String\n isPartialRetake Boolean @default(false)\n completedAt DateTime @default(now())\n\n quizSet QuizSet @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n}\n\nmodel ShareLink {\n id String @id @default(uuid())\n targetType String // \"DECK\" | \"QUIZ\" | \"GROUP\"\n deckId String? @unique\n quizSetId String? @unique\n groupId String? @unique\n createdAt DateTime @default(now())\n\n deck Deck? @relation(fields: [deckId], references: [id], onDelete: Cascade)\n quizSet QuizSet? @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: Cascade)\n}\n\nmodel AuthSecurity {\n id Int @id @default(1)\n failedAttempts Int @default(0)\n lockedUntil DateTime?\n lastAttemptAt DateTime?\n}\n\nmodel Setting {\n key String @id\n value String\n}\n\nmodel StudyActivity {\n id String @id @default(uuid())\n type String // \"FLASHCARD\" | \"QUIZ_QUESTION\"\n occurredAt DateTime @default(now())\n\n @@index([occurredAt])\n}\n\nmodel MaterialGroup {\n id String @id @default(uuid())\n classId String\n name String\n type String // \"DECK\" | \"QUIZ\"\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n decks Deck[]\n quizSets QuizSet[]\n shareLink ShareLink?\n}\n",
+ "inlineSchema": "datasource db {\n provider = \"sqlite\"\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\nmodel Class {\n id String @id @default(uuid())\n slug String @unique\n name String\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n decks Deck[]\n quizSets QuizSet[]\n materialGroups MaterialGroup[]\n spacedRepetitionSets SpacedRepetitionSet[]\n}\n\nmodel Deck {\n id String @id @default(uuid())\n classId String\n name String\n description String?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n groupId String?\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)\n cards Flashcard[]\n shareLink ShareLink?\n progress StudyProgress[]\n spacedRepetitionMemberships SpacedRepetitionSetDeck[]\n}\n\nmodel Flashcard {\n id String @id @default(uuid())\n deckId String\n front String\n back String\n sortOrder Int @default(0)\n\n deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)\n spacedRepetitionStates SpacedRepetitionCardState[]\n}\n\nmodel QuizSet {\n id String @id @default(uuid())\n classId String\n name String\n description String?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n groupId String?\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)\n questions Question[]\n attempts QuizAttempt[]\n shareLink ShareLink?\n progress StudyProgress[]\n}\n\nmodel Question {\n id String @id @default(uuid())\n quizSetId String\n type String // \"MULTIPLE_CHOICE\" | \"SATA\"\n prompt String\n rationale String\n category String\n sortOrder Int @default(0)\n\n quizSet QuizSet @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n options AnswerOption[]\n}\n\nmodel AnswerOption {\n id String @id @default(uuid())\n questionId String\n text String\n isCorrect Boolean @default(false)\n sortOrder Int @default(0)\n\n question Question @relation(fields: [questionId], references: [id], onDelete: Cascade)\n}\n\nmodel StudyProgress {\n id String @id @default(uuid())\n contentType String // \"DECK\" | \"QUIZ\"\n deckId String?\n quizSetId String?\n mode String // \"SEQUENTIAL\" | \"SHUFFLED\"\n currentIndex Int @default(0)\n orderJson String // JSON array of card/question ids\n answersJson String? // in-progress quiz answers\n cardResultsJson String? // per-card grades for decks\n updatedAt DateTime @updatedAt\n\n deck Deck? @relation(fields: [deckId], references: [id], onDelete: Cascade)\n quizSet QuizSet? @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n\n @@unique([deckId, mode])\n @@unique([quizSetId, mode])\n}\n\nmodel QuizAttempt {\n id String @id @default(uuid())\n quizSetId String\n score Float\n maxScore Int\n answersJson String\n isPartialRetake Boolean @default(false)\n completedAt DateTime @default(now())\n\n quizSet QuizSet @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n}\n\nmodel ShareLink {\n id String @id @default(uuid())\n targetType String // \"DECK\" | \"QUIZ\" | \"GROUP\"\n deckId String? @unique\n quizSetId String? @unique\n groupId String? @unique\n createdAt DateTime @default(now())\n\n deck Deck? @relation(fields: [deckId], references: [id], onDelete: Cascade)\n quizSet QuizSet? @relation(fields: [quizSetId], references: [id], onDelete: Cascade)\n group MaterialGroup? @relation(fields: [groupId], references: [id], onDelete: Cascade)\n}\n\nmodel AuthSecurity {\n id Int @id @default(1)\n failedAttempts Int @default(0)\n lockedUntil DateTime?\n lastAttemptAt DateTime?\n}\n\nmodel Setting {\n key String @id\n value String\n}\n\nmodel StudyActivity {\n id String @id @default(uuid())\n type String // \"FLASHCARD\" | \"QUIZ_QUESTION\"\n occurredAt DateTime @default(now())\n\n @@index([occurredAt])\n}\n\nmodel MaterialGroup {\n id String @id @default(uuid())\n classId String\n name String\n type String // \"DECK\" | \"QUIZ\"\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n decks Deck[]\n quizSets QuizSet[]\n shareLink ShareLink?\n}\n\nmodel SpacedRepetitionSet {\n id String @id @default(uuid())\n classId String\n name String\n description String?\n newCardsPerDay Int @default(30)\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n class Class @relation(fields: [classId], references: [id], onDelete: Cascade)\n decks SpacedRepetitionSetDeck[]\n cardStates SpacedRepetitionCardState[]\n\n @@index([classId, sortOrder])\n}\n\nmodel SpacedRepetitionSetDeck {\n setId String\n deckId String\n sortOrder Int @default(0)\n addedAt DateTime @default(now())\n\n set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)\n deck Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)\n\n @@id([setId, deckId])\n @@index([deckId])\n}\n\nmodel SpacedRepetitionCardState {\n id String @id @default(uuid())\n setId String\n flashcardId String\n due DateTime\n stability Float\n difficulty Float\n elapsedDays Int\n scheduledDays Int\n learningSteps Int @default(0)\n reps Int\n lapses Int\n state Int\n firstReviewedAt DateTime @default(now())\n lastReview DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n set SpacedRepetitionSet @relation(fields: [setId], references: [id], onDelete: Cascade)\n flashcard Flashcard @relation(fields: [flashcardId], references: [id], onDelete: Cascade)\n\n @@unique([setId, flashcardId])\n @@index([setId, due])\n @@index([setId, firstReviewedAt])\n @@index([flashcardId])\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},
@@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = {
}
}
-config.runtimeDataModel = JSON.parse("{\"models\":{\"Class\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"decks\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"ClassToDeck\"},{\"name\":\"quizSets\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"ClassToQuizSet\"},{\"name\":\"materialGroups\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"ClassToMaterialGroup\"}],\"dbName\":null},\"Deck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToDeck\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"DeckToMaterialGroup\"},{\"name\":\"cards\",\"kind\":\"object\",\"type\":\"Flashcard\",\"relationName\":\"DeckToFlashcard\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"DeckToShareLink\"},{\"name\":\"progress\",\"kind\":\"object\",\"type\":\"StudyProgress\",\"relationName\":\"DeckToStudyProgress\"}],\"dbName\":null},\"Flashcard\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"front\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"back\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToFlashcard\"}],\"dbName\":null},\"QuizSet\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToQuizSet\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"MaterialGroupToQuizSet\"},{\"name\":\"questions\",\"kind\":\"object\",\"type\":\"Question\",\"relationName\":\"QuestionToQuizSet\"},{\"name\":\"attempts\",\"kind\":\"object\",\"type\":\"QuizAttempt\",\"relationName\":\"QuizAttemptToQuizSet\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"QuizSetToShareLink\"},{\"name\":\"progress\",\"kind\":\"object\",\"type\":\"StudyProgress\",\"relationName\":\"QuizSetToStudyProgress\"}],\"dbName\":null},\"Question\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prompt\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rationale\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"category\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuestionToQuizSet\"},{\"name\":\"options\",\"kind\":\"object\",\"type\":\"AnswerOption\",\"relationName\":\"AnswerOptionToQuestion\"}],\"dbName\":null},\"AnswerOption\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"questionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"text\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isCorrect\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"question\",\"kind\":\"object\",\"type\":\"Question\",\"relationName\":\"AnswerOptionToQuestion\"}],\"dbName\":null},\"StudyProgress\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"contentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"currentIndex\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"orderJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"answersJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cardResultsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToStudyProgress\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizSetToStudyProgress\"}],\"dbName\":null},\"QuizAttempt\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"maxScore\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"answersJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isPartialRetake\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizAttemptToQuizSet\"}],\"dbName\":null},\"ShareLink\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToShareLink\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizSetToShareLink\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"MaterialGroupToShareLink\"}],\"dbName\":null},\"AuthSecurity\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"failedAttempts\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"lockedUntil\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastAttemptAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Setting\":{\"fields\":[{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"StudyActivity\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"occurredAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MaterialGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToMaterialGroup\"},{\"name\":\"decks\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToMaterialGroup\"},{\"name\":\"quizSets\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"MaterialGroupToQuizSet\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"MaterialGroupToShareLink\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
+config.runtimeDataModel = JSON.parse("{\"models\":{\"Class\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"decks\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"ClassToDeck\"},{\"name\":\"quizSets\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"ClassToQuizSet\"},{\"name\":\"materialGroups\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"ClassToMaterialGroup\"},{\"name\":\"spacedRepetitionSets\",\"kind\":\"object\",\"type\":\"SpacedRepetitionSet\",\"relationName\":\"ClassToSpacedRepetitionSet\"}],\"dbName\":null},\"Deck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToDeck\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"DeckToMaterialGroup\"},{\"name\":\"cards\",\"kind\":\"object\",\"type\":\"Flashcard\",\"relationName\":\"DeckToFlashcard\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"DeckToShareLink\"},{\"name\":\"progress\",\"kind\":\"object\",\"type\":\"StudyProgress\",\"relationName\":\"DeckToStudyProgress\"},{\"name\":\"spacedRepetitionMemberships\",\"kind\":\"object\",\"type\":\"SpacedRepetitionSetDeck\",\"relationName\":\"DeckToSpacedRepetitionSetDeck\"}],\"dbName\":null},\"Flashcard\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"front\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"back\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToFlashcard\"},{\"name\":\"spacedRepetitionStates\",\"kind\":\"object\",\"type\":\"SpacedRepetitionCardState\",\"relationName\":\"FlashcardToSpacedRepetitionCardState\"}],\"dbName\":null},\"QuizSet\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToQuizSet\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"MaterialGroupToQuizSet\"},{\"name\":\"questions\",\"kind\":\"object\",\"type\":\"Question\",\"relationName\":\"QuestionToQuizSet\"},{\"name\":\"attempts\",\"kind\":\"object\",\"type\":\"QuizAttempt\",\"relationName\":\"QuizAttemptToQuizSet\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"QuizSetToShareLink\"},{\"name\":\"progress\",\"kind\":\"object\",\"type\":\"StudyProgress\",\"relationName\":\"QuizSetToStudyProgress\"}],\"dbName\":null},\"Question\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"prompt\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rationale\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"category\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuestionToQuizSet\"},{\"name\":\"options\",\"kind\":\"object\",\"type\":\"AnswerOption\",\"relationName\":\"AnswerOptionToQuestion\"}],\"dbName\":null},\"AnswerOption\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"questionId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"text\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isCorrect\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"question\",\"kind\":\"object\",\"type\":\"Question\",\"relationName\":\"AnswerOptionToQuestion\"}],\"dbName\":null},\"StudyProgress\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"contentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"currentIndex\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"orderJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"answersJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cardResultsJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToStudyProgress\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizSetToStudyProgress\"}],\"dbName\":null},\"QuizAttempt\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"score\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"maxScore\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"answersJson\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isPartialRetake\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizAttemptToQuizSet\"}],\"dbName\":null},\"ShareLink\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"quizSetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToShareLink\"},{\"name\":\"quizSet\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"QuizSetToShareLink\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"MaterialGroup\",\"relationName\":\"MaterialGroupToShareLink\"}],\"dbName\":null},\"AuthSecurity\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"failedAttempts\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"lockedUntil\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastAttemptAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Setting\":{\"fields\":[{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"StudyActivity\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"occurredAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MaterialGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToMaterialGroup\"},{\"name\":\"decks\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToMaterialGroup\"},{\"name\":\"quizSets\",\"kind\":\"object\",\"type\":\"QuizSet\",\"relationName\":\"MaterialGroupToQuizSet\"},{\"name\":\"shareLink\",\"kind\":\"object\",\"type\":\"ShareLink\",\"relationName\":\"MaterialGroupToShareLink\"}],\"dbName\":null},\"SpacedRepetitionSet\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"classId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"newCardsPerDay\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"class\",\"kind\":\"object\",\"type\":\"Class\",\"relationName\":\"ClassToSpacedRepetitionSet\"},{\"name\":\"decks\",\"kind\":\"object\",\"type\":\"SpacedRepetitionSetDeck\",\"relationName\":\"SpacedRepetitionSetToSpacedRepetitionSetDeck\"},{\"name\":\"cardStates\",\"kind\":\"object\",\"type\":\"SpacedRepetitionCardState\",\"relationName\":\"SpacedRepetitionCardStateToSpacedRepetitionSet\"}],\"dbName\":null},\"SpacedRepetitionSetDeck\":{\"fields\":[{\"name\":\"setId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"deckId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"addedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"set\",\"kind\":\"object\",\"type\":\"SpacedRepetitionSet\",\"relationName\":\"SpacedRepetitionSetToSpacedRepetitionSetDeck\"},{\"name\":\"deck\",\"kind\":\"object\",\"type\":\"Deck\",\"relationName\":\"DeckToSpacedRepetitionSetDeck\"}],\"dbName\":null},\"SpacedRepetitionCardState\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"setId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"flashcardId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"due\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"stability\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"difficulty\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"elapsedDays\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scheduledDays\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"learningSteps\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"reps\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"lapses\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"firstReviewedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastReview\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"set\",\"kind\":\"object\",\"type\":\"SpacedRepetitionSet\",\"relationName\":\"SpacedRepetitionCardStateToSpacedRepetitionSet\"},{\"name\":\"flashcard\",\"kind\":\"object\",\"type\":\"Flashcard\",\"relationName\":\"FlashcardToSpacedRepetitionCardState\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
config.parameterizationSchema = {
- strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"class\",\"decks\",\"group\",\"quizSet\",\"question\",\"options\",\"_count\",\"questions\",\"attempts\",\"deck\",\"shareLink\",\"progress\",\"quizSets\",\"cards\",\"materialGroups\",\"Class.findUnique\",\"Class.findUniqueOrThrow\",\"Class.findFirst\",\"Class.findFirstOrThrow\",\"Class.findMany\",\"data\",\"Class.createOne\",\"Class.createMany\",\"Class.createManyAndReturn\",\"Class.updateOne\",\"Class.updateMany\",\"Class.updateManyAndReturn\",\"create\",\"update\",\"Class.upsertOne\",\"Class.deleteOne\",\"Class.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"Class.groupBy\",\"Class.aggregate\",\"Deck.findUnique\",\"Deck.findUniqueOrThrow\",\"Deck.findFirst\",\"Deck.findFirstOrThrow\",\"Deck.findMany\",\"Deck.createOne\",\"Deck.createMany\",\"Deck.createManyAndReturn\",\"Deck.updateOne\",\"Deck.updateMany\",\"Deck.updateManyAndReturn\",\"Deck.upsertOne\",\"Deck.deleteOne\",\"Deck.deleteMany\",\"Deck.groupBy\",\"Deck.aggregate\",\"Flashcard.findUnique\",\"Flashcard.findUniqueOrThrow\",\"Flashcard.findFirst\",\"Flashcard.findFirstOrThrow\",\"Flashcard.findMany\",\"Flashcard.createOne\",\"Flashcard.createMany\",\"Flashcard.createManyAndReturn\",\"Flashcard.updateOne\",\"Flashcard.updateMany\",\"Flashcard.updateManyAndReturn\",\"Flashcard.upsertOne\",\"Flashcard.deleteOne\",\"Flashcard.deleteMany\",\"Flashcard.groupBy\",\"Flashcard.aggregate\",\"QuizSet.findUnique\",\"QuizSet.findUniqueOrThrow\",\"QuizSet.findFirst\",\"QuizSet.findFirstOrThrow\",\"QuizSet.findMany\",\"QuizSet.createOne\",\"QuizSet.createMany\",\"QuizSet.createManyAndReturn\",\"QuizSet.updateOne\",\"QuizSet.updateMany\",\"QuizSet.updateManyAndReturn\",\"QuizSet.upsertOne\",\"QuizSet.deleteOne\",\"QuizSet.deleteMany\",\"QuizSet.groupBy\",\"QuizSet.aggregate\",\"Question.findUnique\",\"Question.findUniqueOrThrow\",\"Question.findFirst\",\"Question.findFirstOrThrow\",\"Question.findMany\",\"Question.createOne\",\"Question.createMany\",\"Question.createManyAndReturn\",\"Question.updateOne\",\"Question.updateMany\",\"Question.updateManyAndReturn\",\"Question.upsertOne\",\"Question.deleteOne\",\"Question.deleteMany\",\"Question.groupBy\",\"Question.aggregate\",\"AnswerOption.findUnique\",\"AnswerOption.findUniqueOrThrow\",\"AnswerOption.findFirst\",\"AnswerOption.findFirstOrThrow\",\"AnswerOption.findMany\",\"AnswerOption.createOne\",\"AnswerOption.createMany\",\"AnswerOption.createManyAndReturn\",\"AnswerOption.updateOne\",\"AnswerOption.updateMany\",\"AnswerOption.updateManyAndReturn\",\"AnswerOption.upsertOne\",\"AnswerOption.deleteOne\",\"AnswerOption.deleteMany\",\"AnswerOption.groupBy\",\"AnswerOption.aggregate\",\"StudyProgress.findUnique\",\"StudyProgress.findUniqueOrThrow\",\"StudyProgress.findFirst\",\"StudyProgress.findFirstOrThrow\",\"StudyProgress.findMany\",\"StudyProgress.createOne\",\"StudyProgress.createMany\",\"StudyProgress.createManyAndReturn\",\"StudyProgress.updateOne\",\"StudyProgress.updateMany\",\"StudyProgress.updateManyAndReturn\",\"StudyProgress.upsertOne\",\"StudyProgress.deleteOne\",\"StudyProgress.deleteMany\",\"StudyProgress.groupBy\",\"StudyProgress.aggregate\",\"QuizAttempt.findUnique\",\"QuizAttempt.findUniqueOrThrow\",\"QuizAttempt.findFirst\",\"QuizAttempt.findFirstOrThrow\",\"QuizAttempt.findMany\",\"QuizAttempt.createOne\",\"QuizAttempt.createMany\",\"QuizAttempt.createManyAndReturn\",\"QuizAttempt.updateOne\",\"QuizAttempt.updateMany\",\"QuizAttempt.updateManyAndReturn\",\"QuizAttempt.upsertOne\",\"QuizAttempt.deleteOne\",\"QuizAttempt.deleteMany\",\"QuizAttempt.groupBy\",\"QuizAttempt.aggregate\",\"ShareLink.findUnique\",\"ShareLink.findUniqueOrThrow\",\"ShareLink.findFirst\",\"ShareLink.findFirstOrThrow\",\"ShareLink.findMany\",\"ShareLink.createOne\",\"ShareLink.createMany\",\"ShareLink.createManyAndReturn\",\"ShareLink.updateOne\",\"ShareLink.updateMany\",\"ShareLink.updateManyAndReturn\",\"ShareLink.upsertOne\",\"ShareLink.deleteOne\",\"ShareLink.deleteMany\",\"ShareLink.groupBy\",\"ShareLink.aggregate\",\"AuthSecurity.findUnique\",\"AuthSecurity.findUniqueOrThrow\",\"AuthSecurity.findFirst\",\"AuthSecurity.findFirstOrThrow\",\"AuthSecurity.findMany\",\"AuthSecurity.createOne\",\"AuthSecurity.createMany\",\"AuthSecurity.createManyAndReturn\",\"AuthSecurity.updateOne\",\"AuthSecurity.updateMany\",\"AuthSecurity.updateManyAndReturn\",\"AuthSecurity.upsertOne\",\"AuthSecurity.deleteOne\",\"AuthSecurity.deleteMany\",\"AuthSecurity.groupBy\",\"AuthSecurity.aggregate\",\"Setting.findUnique\",\"Setting.findUniqueOrThrow\",\"Setting.findFirst\",\"Setting.findFirstOrThrow\",\"Setting.findMany\",\"Setting.createOne\",\"Setting.createMany\",\"Setting.createManyAndReturn\",\"Setting.updateOne\",\"Setting.updateMany\",\"Setting.updateManyAndReturn\",\"Setting.upsertOne\",\"Setting.deleteOne\",\"Setting.deleteMany\",\"Setting.groupBy\",\"Setting.aggregate\",\"StudyActivity.findUnique\",\"StudyActivity.findUniqueOrThrow\",\"StudyActivity.findFirst\",\"StudyActivity.findFirstOrThrow\",\"StudyActivity.findMany\",\"StudyActivity.createOne\",\"StudyActivity.createMany\",\"StudyActivity.createManyAndReturn\",\"StudyActivity.updateOne\",\"StudyActivity.updateMany\",\"StudyActivity.updateManyAndReturn\",\"StudyActivity.upsertOne\",\"StudyActivity.deleteOne\",\"StudyActivity.deleteMany\",\"StudyActivity.groupBy\",\"StudyActivity.aggregate\",\"MaterialGroup.findUnique\",\"MaterialGroup.findUniqueOrThrow\",\"MaterialGroup.findFirst\",\"MaterialGroup.findFirstOrThrow\",\"MaterialGroup.findMany\",\"MaterialGroup.createOne\",\"MaterialGroup.createMany\",\"MaterialGroup.createManyAndReturn\",\"MaterialGroup.updateOne\",\"MaterialGroup.updateMany\",\"MaterialGroup.updateManyAndReturn\",\"MaterialGroup.upsertOne\",\"MaterialGroup.deleteOne\",\"MaterialGroup.deleteMany\",\"MaterialGroup.groupBy\",\"MaterialGroup.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"classId\",\"name\",\"type\",\"sortOrder\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"occurredAt\",\"key\",\"value\",\"failedAttempts\",\"lockedUntil\",\"lastAttemptAt\",\"targetType\",\"deckId\",\"quizSetId\",\"groupId\",\"score\",\"maxScore\",\"answersJson\",\"isPartialRetake\",\"completedAt\",\"contentType\",\"mode\",\"currentIndex\",\"orderJson\",\"cardResultsJson\",\"updatedAt\",\"questionId\",\"text\",\"isCorrect\",\"prompt\",\"rationale\",\"category\",\"description\",\"front\",\"back\",\"slug\",\"every\",\"some\",\"none\",\"deckId_mode\",\"quizSetId_mode\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"disconnect\",\"delete\",\"connect\",\"createMany\",\"set\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
- graph: "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-QQAICQAAPoEACAlAAD9BAAgJgAA_AQAICcAAPsEACAI6gEAAJwDADDrAQAAwgEAEOwBAACcAwAw7QEBAPUCACHxAQIA9gIAIZMCAQD1AgAhlAIBAPUCACGVAiAAlwMAIQMAAAATACABAADBAQAwIwAAwgEAIAMAAAATACABAAAUADACAAAVACABAAAAIwAgAQAAACMAIAMAAAAhACABAAAiADACAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAwGAAC_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_AQEAAAABgAIBAIEDACEBAAAArAIAIAEAAACsAgAgBeoBAACEAwAw6wEAAK8CABDsAQAAhAMAMP8BAQCBAwAhgAIBAIEDACEAAwAAAK8CACABAACwAgAwAgAArAIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACADAAAArwIAIAEAALACADACAACsAgAgAv8BAQAAAAGAAgEAAAABARcAALQCACAC_wEBAAAAAYACAQAAAAEBFwAAtgIAMAEXAAC2AgAwAv8BAQDCAwAhgAIBAMIDACECAAAArAIAIBcAALkCACAC_wEBAMIDACGAAgEAwgMAIQIAAACvAgAgFwAAuwIAIAIAAACvAgAgFwAAuwIAIAMAAACsAgAgHgAAtAIAIB8AALkCACABAAAArAIAIAEAAACvAgAgAwkAAN0EACAmAADfBAAgJwAA3gQAIAXqAQAAgwMAMOsBAADCAgAQ7AEAAIMDADD_AQEA9QIAIYACAQD1AgAhAwAAAK8CACABAADBAgAwIwAAwgIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAG6gEAAIADADDrAQAAyAIAEOwBAACAAwAw7QEBAAAAAfABAQCBAwAh_gFAAIIDACEBAAAAxQIAIAEAAADFAgAgBuoBAACAAwAw6wEAAMgCABDsAQAAgAMAMO0BAQCBAwAh8AEBAIEDACH-AUAAggMAIQADAAAAyAIAIAEAAMkCADACAADFAgAgAwAAAMgCACABAADJAgAwAgAAxQIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACAD7QEBAAAAAfABAQAAAAH-AUAAAAABARcAAM0CACAD7QEBAAAAAfABAQAAAAH-AUAAAAABARcAAM8CADABFwAAzwIAMAPtAQEAwgMAIfABAQDCAwAh_gFAAMQDACECAAAAxQIAIBcAANICACAD7QEBAMIDACHwAQEAwgMAIf4BQADEAwAhAgAAAMgCACAXAADUAgAgAgAAAMgCACAXAADUAgAgAwAAAMUCACAeAADNAgAgHwAA0gIAIAEAAADFAgAgAQAAAMgCACADCQAA2gQAICYAANwEACAnAADbBAAgBuoBAAD_AgAw6wEAANsCABDsAQAA_wIAMO0BAQD1AgAh8AEBAPUCACH-AUAA9wIAIQMAAADIAgAgAQAA2gIAMCMAANsCACADAAAAyAIAIAEAAMkCADACAADFAgAgAQAAADcAIAEAAAA3ACADAAAABwAgAQAANgAwAgAANwAgAwAAAAcAIAEAADYAMAIAADcAIAMAAAAHACABAAA2ADACAAA3ACAKAwAA1gQAIAQAANcEACANAADZBAAgDwAA2AQAIO0BAQAAAAHuAQEAAAAB7wEBAAAAAfABAQAAAAHxAQIAAAAB8gFAAAAAAQEXAADjAgAgBu0BAQAAAAHuAQEAAAAB7wEBAAAAAfABAQAAAAHxAQIAAAAB8gFAAAAAAQEXAADlAgAwARcAAOUCADAKAwAAxQMAIAQAAMYDACANAADIAwAgDwAAxwMAIO0BAQDCAwAh7gEBAMIDACHvAQEAwgMAIfABAQDCAwAh8QECAMMDACHyAUAAxAMAIQIAAAA3ACAXAADoAgAgBu0BAQDCAwAh7gEBAMIDACHvAQEAwgMAIfABAQDCAwAh8QECAMMDACHyAUAAxAMAIQIAAAAHACAXAADqAgAgAgAAAAcAIBcAAOoCACADAAAANwAgHgAA4wIAIB8AAOgCACABAAAANwAgAQAAAAcAIAUJAAC9AwAgJAAAvgMAICUAAMEDACAmAADAAwAgJwAAvwMAIAnqAQAA9AIAMOsBAADxAgAQ7AEAAPQCADDtAQEA9QIAIe4BAQD1AgAh7wEBAPUCACHwAQEA9QIAIfEBAgD2AgAh8gFAAPcCACEDAAAABwAgAQAA8AIAMCMAAPECACADAAAABwAgAQAANgAwAgAANwAgCeoBAAD0AgAw6wEAAPECABDsAQAA9AIAMO0BAQD1AgAh7gEBAPUCACHvAQEA9QIAIfABAQD1AgAh8QECAPYCACHyAUAA9wIAIQ4JAAD5AgAgJgAA_gIAICcAAP4CACDzAQEAAAAB9AEBAAAABPUBAQAAAAT2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAP0CACH7AQEAAAAB_AEBAAAAAf0BAQAAAAENCQAA-QIAICQAAPwCACAlAAD5AgAgJgAA-QIAICcAAPkCACDzAQIAAAAB9AECAAAABPUBAgAAAAT2AQIAAAAB9wECAAAAAfgBAgAAAAH5AQIAAAAB-gECAPsCACELCQAA-QIAICYAAPoCACAnAAD6AgAg8wFAAAAAAfQBQAAAAAT1AUAAAAAE9gFAAAAAAfcBQAAAAAH4AUAAAAAB-QFAAAAAAfoBQAD4AgAhCwkAAPkCACAmAAD6AgAgJwAA-gIAIPMBQAAAAAH0AUAAAAAE9QFAAAAABPYBQAAAAAH3AUAAAAAB-AFAAAAAAfkBQAAAAAH6AUAA-AIAIQjzAQIAAAAB9AECAAAABPUBAgAAAAT2AQIAAAAB9wECAAAAAfgBAgAAAAH5AQIAAAAB-gECAPkCACEI8wFAAAAAAfQBQAAAAAT1AUAAAAAE9gFAAAAAAfcBQAAAAAH4AUAAAAAB-QFAAAAAAfoBQAD6AgAhDQkAAPkCACAkAAD8AgAgJQAA-QIAICYAAPkCACAnAAD5AgAg8wECAAAAAfQBAgAAAAT1AQIAAAAE9gECAAAAAfcBAgAAAAH4AQIAAAAB-QECAAAAAfoBAgD7AgAhCPMBCAAAAAH0AQgAAAAE9QEIAAAABPYBCAAAAAH3AQgAAAAB-AEIAAAAAfkBCAAAAAH6AQgA_AIAIQ4JAAD5AgAgJgAA_gIAICcAAP4CACDzAQEAAAAB9AEBAAAABPUBAQAAAAT2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAP0CACH7AQEAAAAB_AEBAAAAAf0BAQAAAAEL8wEBAAAAAfQBAQAAAAT1AQEAAAAE9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQD-AgAh-wEBAAAAAfwBAQAAAAH9AQEAAAABBuoBAAD_AgAw6wEAANsCABDsAQAA_wIAMO0BAQD1AgAh8AEBAPUCACH-AUAA9wIAIQbqAQAAgAMAMOsBAADIAgAQ7AEAAIADADDtAQEAgQMAIfABAQCBAwAh_gFAAIIDACEL8wEBAAAAAfQBAQAAAAT1AQEAAAAE9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQD-AgAh-wEBAAAAAfwBAQAAAAH9AQEAAAABCPMBQAAAAAH0AUAAAAAE9QFAAAAABPYBQAAAAAH3AUAAAAAB-AFAAAAAAfkBQAAAAAH6AUAA-gIAIQXqAQAAgwMAMOsBAADCAgAQ7AEAAIMDADD_AQEA9QIAIYACAQD1AgAhBeoBAACEAwAw6wEAAK8CABDsAQAAhAMAMP8BAQCBAwAhgAIBAIEDACEH6gEAAIUDADDrAQAAqQIAEOwBAACFAwAw7QECAPYCACGBAgIA9gIAIYICQACGAwAhgwJAAIYDACELCQAAiAMAICYAAIkDACAnAACJAwAg8wFAAAAAAfQBQAAAAAX1AUAAAAAF9gFAAAAAAfcBQAAAAAH4AUAAAAAB-QFAAAAAAfoBQACHAwAhCwkAAIgDACAmAACJAwAgJwAAiQMAIPMBQAAAAAH0AUAAAAAF9QFAAAAABfYBQAAAAAH3AUAAAAAB-AFAAAAAAfkBQAAAAAH6AUAAhwMAIQjzAQIAAAAB9AECAAAABfUBAgAAAAX2AQIAAAAB9wECAAAAAfgBAgAAAAH5AQIAAAAB-gECAIgDACEI8wFAAAAAAfQBQAAAAAX1AUAAAAAF9gFAAAAAAfcBQAAAAAH4AUAAAAAB-QFAAAAAAfoBQACJAwAhB-oBAACKAwAw6wEAAJYCABDsAQAAigMAMO0BAgCLAwAhgQICAIsDACGCAkAAjAMAIYMCQACMAwAhCPMBAgAAAAH0AQIAAAAE9QECAAAABPYBAgAAAAH3AQIAAAAB-AECAAAAAfkBAgAAAAH6AQIA-QIAIQjzAUAAAAAB9AFAAAAABfUBQAAAAAX2AUAAAAAB9wFAAAAAAfgBQAAAAAH5AUAAAAAB-gFAAIkDACEJ6gEAAI0DADDrAQAAkAIAEOwBAACNAwAw7QEBAPUCACHyAUAA9wIAIYQCAQD1AgAhhQIBAI4DACGGAgEAjgMAIYcCAQCOAwAhDgkAAIgDACAmAACQAwAgJwAAkAMAIPMBAQAAAAH0AQEAAAAF9QEBAAAABfYBAQAAAAH3AQEAAAAB-AEBAAAAAfkBAQAAAAH6AQEAjwMAIfsBAQAAAAH8AQEAAAAB_QEBAAAAAQ4JAACIAwAgJgAAkAMAICcAAJADACDzAQEAAAAB9AEBAAAABfUBAQAAAAX2AQEAAAAB9wEBAAAAAfgBAQAAAAH5AQEAAAAB-gEBAI8DACH7AQEAAAAB_AEBAAAAAf0BAQAAAAEL8wEBAAAAAfQBAQAAAAX1AQEAAAAF9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQCQAwAh-wEBAAAAAfwBAQAAAAH9AQEAAAABDAUAAJQDACAGAACTAwAgDAAAkgMAIOoBAACRAwAw6wEAABwAEOwBAACRAwAw7QEBAIEDACHyAUAAggMAIYQCAQCBAwAhhQIBAK4DACGGAgEArgMAIYcCAQCuAwAhEQMAAKcDACAFAACUAwAgDQAAqAMAIA4AALoDACAQAAC8AwAg6gEAALsDADDrAQAAAwAQ7AEAALsDADDtAQEAgQMAIe4BAQCBAwAh7wEBAIEDACHxAQIAiwMAIfIBQACCAwAhhwIBAK4DACGZAgEArgMAIaICAAADACCjAgAAAwAgEgMAAKcDACAFAACUAwAgCgAAuAMAIAsAALkDACANAACoAwAgDgAAugMAIOoBAAC3AwAw6wEAAAoAEOwBAAC3AwAw7QEBAIEDACHuAQEAgQMAIe8BAQCBAwAh8QECAIsDACHyAUAAggMAIYcCAQCuAwAhmQIBAK4DACGiAgAACgAgowIAAAoAIA8DAACnAwAgBAAAowMAIA0AAKgDACAPAACkAwAg6gEAAKYDADDrAQAABwAQ7AEAAKYDADDtAQEAgQMAIe4BAQCBAwAh7wEBAIEDACHwAQEAgQMAIfEBAgCLAwAh8gFAAIIDACGiAgAABwAgowIAAAcAIArqAQAAlQMAMOsBAADyAQAQ7AEAAJUDADDtAQEA9QIAIYYCAQD1AgAhiAIIAJYDACGJAgIA9gIAIYoCAQD1AgAhiwIgAJcDACGMAkAA9wIAIQ0JAAD5AgAgJAAA_AIAICUAAPwCACAmAAD8AgAgJwAA_AIAIPMBCAAAAAH0AQgAAAAE9QEIAAAABPYBCAAAAAH3AQgAAAAB-AEIAAAAAfkBCAAAAAH6AQgAmgMAIQUJAAD5AgAgJgAAmQMAICcAAJkDACDzASAAAAAB-gEgAJgDACEFCQAA-QIAICYAAJkDACAnAACZAwAg8wEgAAAAAfoBIACYAwAhAvMBIAAAAAH6ASAAmQMAIQ0JAAD5AgAgJAAA_AIAICUAAPwCACAmAAD8AgAgJwAA_AIAIPMBCAAAAAH0AQgAAAAE9QEIAAAABPYBCAAAAAH3AQgAAAAB-AEIAAAAAfkBCAAAAAH6AQgAmgMAIQ3qAQAAmwMAMOsBAADcAQAQ7AEAAJsDADDtAQEA9QIAIYUCAQCOAwAhhgIBAI4DACGKAgEAjgMAIY0CAQD1AgAhjgIBAPUCACGPAgIA9gIAIZACAQD1AgAhkQIBAI4DACGSAkAA9wIAIQjqAQAAnAMAMOsBAADCAQAQ7AEAAJwDADDtAQEA9QIAIfEBAgD2AgAhkwIBAPUCACGUAgEA9QIAIZUCIACXAwAhCuoBAACdAwAw6wEAAKwBABDsAQAAnQMAMO0BAQD1AgAh8AEBAPUCACHxAQIA9gIAIYYCAQD1AgAhlgIBAPUCACGXAgEA9QIAIZgCAQD1AgAhCuoBAACeAwAw6wEAAJYBABDsAQAAngMAMO0BAQD1AgAh7gEBAPUCACHvAQEA9QIAIfEBAgD2AgAh8gFAAPcCACGHAgEAjgMAIZkCAQCOAwAhCOoBAACfAwAw6wEAAH4AEOwBAACfAwAw7QEBAPUCACHxAQIA9gIAIYUCAQD1AgAhmgIBAPUCACGbAgEA9QIAIQrqAQAAoAMAMOsBAABoABDsAQAAoAMAMO0BAQD1AgAh7gEBAPUCACHvAQEA9QIAIfEBAgD2AgAh8gFAAPcCACGHAgEAjgMAIZkCAQCOAwAhCOoBAAChAwAw6wEAAFAAEOwBAAChAwAw7QEBAPUCACHvAQEA9QIAIfEBAgD2AgAh8gFAAPcCACGcAgEA9QIAIQsEAACjAwAgDwAApAMAIBEAAKUDACDqAQAAogMAMOsBAAA9ABDsAQAAogMAMO0BAQCBAwAh7wEBAIEDACHxAQIAiwMAIfIBQACCAwAhnAIBAIEDACEDnQIAAAMAIJ4CAAADACCfAgAAAwAgA50CAAAKACCeAgAACgAgnwIAAAoAIAOdAgAABwAgngIAAAcAIJ8CAAAHACANAwAApwMAIAQAAKMDACANAACoAwAgDwAApAMAIOoBAACmAwAw6wEAAAcAEOwBAACmAwAw7QEBAIEDACHuAQEAgQMAIe8BAQCBAwAh8AEBAIEDACHxAQIAiwMAIfIBQACCAwAhDQQAAKMDACAPAACkAwAgEQAApQMAIOoBAACiAwAw6wEAAD0AEOwBAACiAwAw7QEBAIEDACHvAQEAgQMAIfEBAgCLAwAh8gFAAIIDACGcAgEAgQMAIaICAAA9ACCjAgAAPQAgDgUAAJQDACAGAACTAwAgDAAAkgMAIOoBAACRAwAw6wEAABwAEOwBAACRAwAw7QEBAIEDACHyAUAAggMAIYQCAQCBAwAhhQIBAK4DACGGAgEArgMAIYcCAQCuAwAhogIAABwAIKMCAAAcACAJDAAAqgMAIOoBAACpAwAw6wEAAC0AEOwBAACpAwAw7QEBAIEDACHxAQIAiwMAIYUCAQCBAwAhmgIBAIEDACGbAgEAgQMAIREDAACnAwAgBQAAlAMAIA0AAKgDACAOAAC6AwAgEAAAvAMAIOoBAAC7AwAw6wEAAAMAEOwBAAC7AwAw7QEBAIEDACHuAQEAgQMAIe8BAQCBAwAh8QECAIsDACHyAUAAggMAIYcCAQCuAwAhmQIBAK4DACGiAgAAAwAgowIAAAMAIAKFAgEAAAABjgIBAAAAAQKGAgEAAAABjgIBAAAAAQ8GAACTAwAgDAAAkgMAIOoBAACtAwAw6wEAACEAEOwBAACtAwAw7QEBAIEDACGFAgEArgMAIYYCAQCuAwAhigIBAK4DACGNAgEAgQMAIY4CAQCBAwAhjwICAIsDACGQAgEAgQMAIZECAQCuAwAhkgJAAIIDACEL8wEBAAAAAfQBAQAAAAX1AQEAAAAF9gEBAAAAAfcBAQAAAAH4AQEAAAAB-QEBAAAAAfoBAQCQAwAh-wEBAAAAAfwBAQAAAAH9AQEAAAABCwYAALIDACDqAQAArwMAMOsBAAAYABDsAQAArwMAMO0BAQCBAwAhhgIBAIEDACGIAggAsAMAIYkCAgCLAwAhigIBAIEDACGLAiAAsQMAIYwCQACCAwAhCPMBCAAAAAH0AQgAAAAE9QEIAAAABPYBCAAAAAH3AQgAAAAB-AEIAAAAAfkBCAAAAAH6AQgA_AIAIQLzASAAAAAB-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-AMAMB8AAP0DADCkAgAA-QMAMKUCAAD6AwAwpgIAAPwDADCnAgAA_AMAMKgCAAD8AwAwqQIAAPsDACCqAgAA_AMAMKsCAAD-AwAwrAIAAP8DADAHHgAA8QMAIB8AAPQDACCkAgAA8gMAIKUCAADzAwAgpgIAABwAIKcCAAAcACCoAgAA9QEAIAseAADjAwAwHwAA6AMAMKQCAADkAwAwpQIAAOUDADCmAgAA5wMAMKcCAADnAwAwqAIAAOcDADCpAgAA5gMAIKoCAADnAwAwqwIAAOkDADCsAgAA6gMAMAoMAADwAwAg7QEBAAAAAYUCAQAAAAGKAgEAAAABjQIBAAAAAY4CAQAAAAGPAgIAAAABkAIBAAAAAZECAQAAAAGSAkAAAAABAgAAACMAIB4AAO8DACADAAAAIwAgHgAA7wMAIB8AAO0DACABFwAAjwYAMBEGAACTAwAgDAAAkgMAIOoBAACtAwAw6wEAACEAEOwBAACtAwAw7QEBAAAAAYUCAQCuAwAhhgIBAK4DACGKAgEArgMAIY0CAQCBAwAhjgIBAIEDACGPAgIAiwMAIZACAQCBAwAhkQIBAK4DACGSAkAAggMAIaACAACrAwAgoQIAAKwDACACAAAAIwAgFwAA7QMAIAIAAADrAwAgFwAA7AMAIA3qAQAA6gMAMOsBAADrAwAQ7AEAAOoDADDtAQEAgQMAIYUCAQCuAwAhhgIBAK4DACGKAgEArgMAIY0CAQCBAwAhjgIBAIEDACGPAgIAiwMAIZACAQCBAwAhkQIBAK4DACGSAkAAggMAIQ3qAQAA6gMAMOsBAADrAwAQ7AEAAOoDADDtAQEAgQMAIYUCAQCuAwAhhgIBAK4DACGKAgEArgMAIY0CAQCBAwAhjgIBAIEDACGPAgIAiwMAIZACAQCBAwAhkQIBAK4DACGSAkAAggMAIQntAQEAwgMAIYUCAQDQAwAhigIBANADACGNAgEAwgMAIY4CAQDCAwAhjwICAMMDACGQAgEAwgMAIZECAQDQAwAhkgJAAMQDACEKDAAA7gMAIO0BAQDCAwAhhQIBANADACGKAgEA0AMAIY0CAQDCAwAhjgIBAMIDACGPAgIAwwMAIZACAQDCAwAhkQIBANADACGSAkAAxAMAIQceAACKBgAgHwAAjQYAIKQCAACLBgAgpQIAAIwGACCmAgAAAwAgpwIAAAMAIKgCAAAFACAKDAAA8AMAIO0BAQAAAAGFAgEAAAABigIBAAAAAY0CAQAAAAGOAgEAAAABjwICAAAAAZACAQAAAAGRAgEAAAABkgJAAAAAAQMeAACKBgAgpAIAAIsGACCoAgAABQAgBwUAAPcDACAMAADRAwAg7QEBAAAAAfIBQAAAAAGEAgEAAAABhQIBAAAAAYcCAQAAAAECAAAA9QEAIB4AAPEDACADAAAAHAAgHgAA8QMAIB8AAPUDACAJAAAAHAAgBQAA9gMAIAwAAM4DACAXAAD1AwAg7QEBAMIDACHyAUAAxAMAIYQCAQDCAwAhhQIBANADACGHAgEA0AMAIQcFAAD2AwAgDAAAzgMAIO0BAQDCAwAh8gFAAMQDACGEAgEAwgMAIYUCAQDQAwAhhwIBANADACEHHgAAhQYAIB8AAIgGACCkAgAAhgYAIKUCAACHBgAgpgIAAAcAIKcCAAAHACCoAgAANwAgAx4AAIUGACCkAgAAhgYAIKgCAAA3ACAG7QEBAAAAAYgCCAAAAAGJAgIAAAABigIBAAAAAYsCIAAAAAGMAkAAAAABAgAAABoAIB4AAIUEACADAAAAGgAgHgAAhQQAIB8AAIQEACABFwAAhAYAMAsGAACyAwAg6gEAAK8DADDrAQAAGAAQ7AEAAK8DADDtAQEAAAABhgIBAIEDACGIAggAsAMAIYkCAgCLAwAhigIBAIEDACGLAiAAsQMAIYwCQACCAwAhAgAAABoAIBcAAIQEACACAAAAgAQAIBcAAIEEACAK6gEAAP8DADDrAQAAgAQAEOwBAAD_AwAw7QEBAIEDACGGAgEAgQMAIYgCCACwAwAhiQICAIsDACGKAgEAgQMAIYsCIACxAwAhjAJAAIIDACEK6gEAAP8DADDrAQAAgAQAEOwBAAD_AwAw7QEBAIEDACGGAgEAgQMAIYgCCACwAwAhiQICAIsDACGKAgEAgQMAIYsCIACxAwAhjAJAAIIDACEG7QEBAMIDACGIAggAggQAIYkCAgDDAwAhigIBAMIDACGLAiAAgwQAIYwCQADEAwAhBaoCCAAAAAGtAggAAAABrgIIAAAAAa8CCAAAAAGwAggAAAABAaoCIAAAAAEG7QEBAMIDACGIAggAggQAIYkCAgDDAwAhigIBAMIDACGLAiAAgwQAIYwCQADEAwAhBu0BAQAAAAGIAggAAAABiQICAAAAAYoCAQAAAAGLAiAAAAABjAJAAAAAAQcIAACfBAAg7QEBAAAAAfABAQAAAAHxAQIAAAABlgIBAAAAAZcCAQAAAAGYAgEAAAABAgAAABEAIB4AAJ4EACADAAAAEQAgHgAAngQAIB8AAJAEACABFwAAgwYAMAwGAACyAwAgCAAAtgMAIOoBAAC1AwAw6wEAAA8AEOwBAAC1AwAw7QEBAAAAAfABAQCBAwAh8QECAIsDACGGAgEAgQMAIZYCAQCBAwAhlwIBAIEDACGYAgEAgQMAIQIAAAARACAXAACQBAAgAgAAAI4EACAXAACPBAAgCuoBAACNBAAw6wEAAI4EABDsAQAAjQQAMO0BAQCBAwAh8AEBAIEDACHxAQIAiwMAIYYCAQCBAwAhlgIBAIEDACGXAgEAgQMAIZgCAQCBAwAhCuoBAACNBAAw6wEAAI4EABDsAQAAjQQAMO0BAQCBAwAh8AEBAIEDACHxAQIAiwMAIYYCAQCBAwAhlgIBAIEDACGXAgEAgQMAIZgCAQCBAwAhBu0BAQDCAwAh8AEBAMIDACHxAQIAwwMAIZYCAQDCAwAhlwIBAMIDACGYAgEAwgMAIQcIAACRBAAg7QEBAMIDACHwAQEAwgMAIfEBAgDDAwAhlgIBAMIDACGXAgEAwgMAIZgCAQDCAwAhCx4AAJIEADAfAACXBAAwpAIAAJMEADClAgAAlAQAMKYCAACWBAAwpwIAAJYEADCoAgAAlgQAMKkCAACVBAAgqgIAAJYEADCrAgAAmAQAMKwCAACZBAAwBO0BAQAAAAHxAQIAAAABlAIBAAAAAZUCIAAAAAECAAAAFQAgHgAAnQQAIAMAAAAVACAeAACdBAAgHwAAnAQAIAEXAACCBgAwCQcAALQDACDqAQAAswMAMOsBAAATABDsAQAAswMAMO0BAQAAAAHxAQIAiwMAIZMCAQCBAwAhlAIBAIEDACGVAiAAsQMAIQIAAAAVACAXAACcBAAgAgAAAJoEACAXAACbBAAgCOoBAACZBAAw6wEAAJoEABDsAQAAmQQAMO0BAQCBAwAh8QECAIsDACGTAgEAgQMAIZQCAQCBAwAhlQIgALEDACEI6gEAAJkEADDrAQAAmgQAEOwBAACZBAAw7QEBAIEDACHxAQIAiwMAIZMCAQCBAwAhlAIBAIEDACGVAiAAsQMAIQTtAQEAwgMAIfEBAgDDAwAhlAIBAMIDACGVAiAAgwQAIQTtAQEAwgMAIfEBAgDDAwAhlAIBAMIDACGVAiAAgwQAIQTtAQEAAAAB8QECAAAAAZQCAQAAAAGVAiAAAAABBwgAAJ8EACDtAQEAAAAB8AEBAAAAAfEBAgAAAAGWAgEAAAABlwIBAAAAAZgCAQAAAAEEHgAAkgQAMKQCAACTBAAwqAIAAJYEADCpAgAAlQQAIAsDAAChBAAgCgAAogQAIAsAAKMEACANAACkBAAgDgAApQQAIO0BAQAAAAHuAQEAAAAB7wEBAAAAAfEBAgAAAAHyAUAAAAABmQIBAAAAAQMeAACABgAgpAIAAIEGACCoAgAAAQAgBB4AAIYEADCkAgAAhwQAMKgCAACKBAAwqQIAAIkEACAEHgAA-AMAMKQCAAD5AwAwqAIAAPwDADCpAgAA-wMAIAMeAADxAwAgpAIAAPIDACCoAgAA9QEAIAQeAADjAwAwpAIAAOQDADCoAgAA5wMAMKkCAADmAwAgCgMAANIEACANAADUBAAgDgAA1QQAIBAAANMEACDtAQEAAAAB7gEBAAAAAe8BAQAAAAHxAQIAAAAB8gFAAAAAAZkCAQAAAAECAAAABQAgHgAA0QQAIAMAAAAFACAeAADRBAAgHwAAsAQAIAEXAAD_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_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-JQB_JgCAAScAgQESAgETPAEUPwEVQAEWQQEYQwEZRRAaRhEbSAEcShAdSxIgTAEhTQEiThAoURMpUhkqUwIrVAIsVQItVgIuVwIvWQIwWxAxXBoyXwIzYRA0Yhs1ZAI2ZQI3ZhA4aRw5aiI6aw07bA08bQ09bg0-bw0_cQ1AcxBBdCNCdg1DeBBEeSRFeg1Gew1HfBBIfyVJgAErSoEBBEuCAQRMgwEETYQBBE6FAQRPhwEEUIkBEFGKASxSjQEEU48BEFSQAS1VkgEEVpMBBFeUARBYlwEuWZgBNFqZAQVbmgEFXJsBBV2cAQVenQEFX58BBWChARBhogE1YqQBBWOmARBkpwE2ZagBBWapAQVnqgEQaK0BN2muAT1qrwEGa7ABBmyxAQZtsgEGbrMBBm-1AQZwtwEQcbgBPnK6AQZzvAEQdL0BP3W-AQZ2vwEGd8ABEHjDAUB5xAFGesUBCnvGAQp8xwEKfcgBCn7JAQp_ywEKgAHNARCBAc4BR4IB0gEKgwHUARCEAdUBSIUB2AEKhgHZAQqHAdoBEIgB3QFJiQHeAU-KAd8BCIsB4AEIjAHhAQiNAeIBCI4B4wEIjwHlAQiQAecBEJEB6AFQkgHqAQiTAewBEJQB7QFRlQHuAQiWAe8BCJcB8AEQmAHzAVKZAfQBWJoB9gEJmwH3AQmcAfkBCZ0B-gEJngH7AQmfAf0BCaAB_wEQoQGAAlmiAYUCCaMBhwIQpAGIAlqlAYwCCaYBjQIJpwGOAhCoAZECW6kBkgJfqgGUAmCrAZUCYKwBmAJgrQGZAmCuAZoCYK8BnAJgsAGeAhCxAZ8CYbIBoQJgswGjAhC0AaQCYrUBpQJgtgGmAmC3AacCELgBqgJjuQGrAmm6Aa0CarsBrgJqvAGxAmq9AbICar4BswJqvwG1AmrAAbcCEMEBuAJrwgG6AmrDAbwCEMQBvQJsxQG-AmrGAb8CascBwAIQyAHDAm3JAcQCccoBxgJyywHHAnLMAcoCcs0BywJyzgHMAnLPAc4CctAB0AIQ0QHRAnPSAdMCctMB1QIQ1AHWAnTVAdcCctYB2AJy1wHZAhDYAdwCddkB3QJ52gHeAgPbAd8CA9wB4AID3QHhAgPeAeICA98B5AID4AHmAhDhAecCeuIB6QID4wHrAhDkAewCe-UB7QID5gHuAgPnAe8CEOgB8gJ86QHzAoIB"
+ strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"class\",\"decks\",\"group\",\"quizSet\",\"question\",\"options\",\"_count\",\"questions\",\"attempts\",\"deck\",\"shareLink\",\"progress\",\"quizSets\",\"set\",\"cardStates\",\"flashcard\",\"spacedRepetitionStates\",\"cards\",\"spacedRepetitionMemberships\",\"materialGroups\",\"spacedRepetitionSets\",\"Class.findUnique\",\"Class.findUniqueOrThrow\",\"Class.findFirst\",\"Class.findFirstOrThrow\",\"Class.findMany\",\"data\",\"Class.createOne\",\"Class.createMany\",\"Class.createManyAndReturn\",\"Class.updateOne\",\"Class.updateMany\",\"Class.updateManyAndReturn\",\"create\",\"update\",\"Class.upsertOne\",\"Class.deleteOne\",\"Class.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"Class.groupBy\",\"Class.aggregate\",\"Deck.findUnique\",\"Deck.findUniqueOrThrow\",\"Deck.findFirst\",\"Deck.findFirstOrThrow\",\"Deck.findMany\",\"Deck.createOne\",\"Deck.createMany\",\"Deck.createManyAndReturn\",\"Deck.updateOne\",\"Deck.updateMany\",\"Deck.updateManyAndReturn\",\"Deck.upsertOne\",\"Deck.deleteOne\",\"Deck.deleteMany\",\"Deck.groupBy\",\"Deck.aggregate\",\"Flashcard.findUnique\",\"Flashcard.findUniqueOrThrow\",\"Flashcard.findFirst\",\"Flashcard.findFirstOrThrow\",\"Flashcard.findMany\",\"Flashcard.createOne\",\"Flashcard.createMany\",\"Flashcard.createManyAndReturn\",\"Flashcard.updateOne\",\"Flashcard.updateMany\",\"Flashcard.updateManyAndReturn\",\"Flashcard.upsertOne\",\"Flashcard.deleteOne\",\"Flashcard.deleteMany\",\"Flashcard.groupBy\",\"Flashcard.aggregate\",\"QuizSet.findUnique\",\"QuizSet.findUniqueOrThrow\",\"QuizSet.findFirst\",\"QuizSet.findFirstOrThrow\",\"QuizSet.findMany\",\"QuizSet.createOne\",\"QuizSet.createMany\",\"QuizSet.createManyAndReturn\",\"QuizSet.updateOne\",\"QuizSet.updateMany\",\"QuizSet.updateManyAndReturn\",\"QuizSet.upsertOne\",\"QuizSet.deleteOne\",\"QuizSet.deleteMany\",\"QuizSet.groupBy\",\"QuizSet.aggregate\",\"Question.findUnique\",\"Question.findUniqueOrThrow\",\"Question.findFirst\",\"Question.findFirstOrThrow\",\"Question.findMany\",\"Question.createOne\",\"Question.createMany\",\"Question.createManyAndReturn\",\"Question.updateOne\",\"Question.updateMany\",\"Question.updateManyAndReturn\",\"Question.upsertOne\",\"Question.deleteOne\",\"Question.deleteMany\",\"Question.groupBy\",\"Question.aggregate\",\"AnswerOption.findUnique\",\"AnswerOption.findUniqueOrThrow\",\"AnswerOption.findFirst\",\"AnswerOption.findFirstOrThrow\",\"AnswerOption.findMany\",\"AnswerOption.createOne\",\"AnswerOption.createMany\",\"AnswerOption.createManyAndReturn\",\"AnswerOption.updateOne\",\"AnswerOption.updateMany\",\"AnswerOption.updateManyAndReturn\",\"AnswerOption.upsertOne\",\"AnswerOption.deleteOne\",\"AnswerOption.deleteMany\",\"AnswerOption.groupBy\",\"AnswerOption.aggregate\",\"StudyProgress.findUnique\",\"StudyProgress.findUniqueOrThrow\",\"StudyProgress.findFirst\",\"StudyProgress.findFirstOrThrow\",\"StudyProgress.findMany\",\"StudyProgress.createOne\",\"StudyProgress.createMany\",\"StudyProgress.createManyAndReturn\",\"StudyProgress.updateOne\",\"StudyProgress.updateMany\",\"StudyProgress.updateManyAndReturn\",\"StudyProgress.upsertOne\",\"StudyProgress.deleteOne\",\"StudyProgress.deleteMany\",\"StudyProgress.groupBy\",\"StudyProgress.aggregate\",\"QuizAttempt.findUnique\",\"QuizAttempt.findUniqueOrThrow\",\"QuizAttempt.findFirst\",\"QuizAttempt.findFirstOrThrow\",\"QuizAttempt.findMany\",\"QuizAttempt.createOne\",\"QuizAttempt.createMany\",\"QuizAttempt.createManyAndReturn\",\"QuizAttempt.updateOne\",\"QuizAttempt.updateMany\",\"QuizAttempt.updateManyAndReturn\",\"QuizAttempt.upsertOne\",\"QuizAttempt.deleteOne\",\"QuizAttempt.deleteMany\",\"QuizAttempt.groupBy\",\"QuizAttempt.aggregate\",\"ShareLink.findUnique\",\"ShareLink.findUniqueOrThrow\",\"ShareLink.findFirst\",\"ShareLink.findFirstOrThrow\",\"ShareLink.findMany\",\"ShareLink.createOne\",\"ShareLink.createMany\",\"ShareLink.createManyAndReturn\",\"ShareLink.updateOne\",\"ShareLink.updateMany\",\"ShareLink.updateManyAndReturn\",\"ShareLink.upsertOne\",\"ShareLink.deleteOne\",\"ShareLink.deleteMany\",\"ShareLink.groupBy\",\"ShareLink.aggregate\",\"AuthSecurity.findUnique\",\"AuthSecurity.findUniqueOrThrow\",\"AuthSecurity.findFirst\",\"AuthSecurity.findFirstOrThrow\",\"AuthSecurity.findMany\",\"AuthSecurity.createOne\",\"AuthSecurity.createMany\",\"AuthSecurity.createManyAndReturn\",\"AuthSecurity.updateOne\",\"AuthSecurity.updateMany\",\"AuthSecurity.updateManyAndReturn\",\"AuthSecurity.upsertOne\",\"AuthSecurity.deleteOne\",\"AuthSecurity.deleteMany\",\"AuthSecurity.groupBy\",\"AuthSecurity.aggregate\",\"Setting.findUnique\",\"Setting.findUniqueOrThrow\",\"Setting.findFirst\",\"Setting.findFirstOrThrow\",\"Setting.findMany\",\"Setting.createOne\",\"Setting.createMany\",\"Setting.createManyAndReturn\",\"Setting.updateOne\",\"Setting.updateMany\",\"Setting.updateManyAndReturn\",\"Setting.upsertOne\",\"Setting.deleteOne\",\"Setting.deleteMany\",\"Setting.groupBy\",\"Setting.aggregate\",\"StudyActivity.findUnique\",\"StudyActivity.findUniqueOrThrow\",\"StudyActivity.findFirst\",\"StudyActivity.findFirstOrThrow\",\"StudyActivity.findMany\",\"StudyActivity.createOne\",\"StudyActivity.createMany\",\"StudyActivity.createManyAndReturn\",\"StudyActivity.updateOne\",\"StudyActivity.updateMany\",\"StudyActivity.updateManyAndReturn\",\"StudyActivity.upsertOne\",\"StudyActivity.deleteOne\",\"StudyActivity.deleteMany\",\"StudyActivity.groupBy\",\"StudyActivity.aggregate\",\"MaterialGroup.findUnique\",\"MaterialGroup.findUniqueOrThrow\",\"MaterialGroup.findFirst\",\"MaterialGroup.findFirstOrThrow\",\"MaterialGroup.findMany\",\"MaterialGroup.createOne\",\"MaterialGroup.createMany\",\"MaterialGroup.createManyAndReturn\",\"MaterialGroup.updateOne\",\"MaterialGroup.updateMany\",\"MaterialGroup.updateManyAndReturn\",\"MaterialGroup.upsertOne\",\"MaterialGroup.deleteOne\",\"MaterialGroup.deleteMany\",\"MaterialGroup.groupBy\",\"MaterialGroup.aggregate\",\"SpacedRepetitionSet.findUnique\",\"SpacedRepetitionSet.findUniqueOrThrow\",\"SpacedRepetitionSet.findFirst\",\"SpacedRepetitionSet.findFirstOrThrow\",\"SpacedRepetitionSet.findMany\",\"SpacedRepetitionSet.createOne\",\"SpacedRepetitionSet.createMany\",\"SpacedRepetitionSet.createManyAndReturn\",\"SpacedRepetitionSet.updateOne\",\"SpacedRepetitionSet.updateMany\",\"SpacedRepetitionSet.updateManyAndReturn\",\"SpacedRepetitionSet.upsertOne\",\"SpacedRepetitionSet.deleteOne\",\"SpacedRepetitionSet.deleteMany\",\"SpacedRepetitionSet.groupBy\",\"SpacedRepetitionSet.aggregate\",\"SpacedRepetitionSetDeck.findUnique\",\"SpacedRepetitionSetDeck.findUniqueOrThrow\",\"SpacedRepetitionSetDeck.findFirst\",\"SpacedRepetitionSetDeck.findFirstOrThrow\",\"SpacedRepetitionSetDeck.findMany\",\"SpacedRepetitionSetDeck.createOne\",\"SpacedRepetitionSetDeck.createMany\",\"SpacedRepetitionSetDeck.createManyAndReturn\",\"SpacedRepetitionSetDeck.updateOne\",\"SpacedRepetitionSetDeck.updateMany\",\"SpacedRepetitionSetDeck.updateManyAndReturn\",\"SpacedRepetitionSetDeck.upsertOne\",\"SpacedRepetitionSetDeck.deleteOne\",\"SpacedRepetitionSetDeck.deleteMany\",\"SpacedRepetitionSetDeck.groupBy\",\"SpacedRepetitionSetDeck.aggregate\",\"SpacedRepetitionCardState.findUnique\",\"SpacedRepetitionCardState.findUniqueOrThrow\",\"SpacedRepetitionCardState.findFirst\",\"SpacedRepetitionCardState.findFirstOrThrow\",\"SpacedRepetitionCardState.findMany\",\"SpacedRepetitionCardState.createOne\",\"SpacedRepetitionCardState.createMany\",\"SpacedRepetitionCardState.createManyAndReturn\",\"SpacedRepetitionCardState.updateOne\",\"SpacedRepetitionCardState.updateMany\",\"SpacedRepetitionCardState.updateManyAndReturn\",\"SpacedRepetitionCardState.upsertOne\",\"SpacedRepetitionCardState.deleteOne\",\"SpacedRepetitionCardState.deleteMany\",\"SpacedRepetitionCardState.groupBy\",\"SpacedRepetitionCardState.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"setId\",\"flashcardId\",\"due\",\"stability\",\"difficulty\",\"elapsedDays\",\"scheduledDays\",\"learningSteps\",\"reps\",\"lapses\",\"state\",\"firstReviewedAt\",\"lastReview\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"deckId\",\"sortOrder\",\"addedAt\",\"classId\",\"name\",\"description\",\"newCardsPerDay\",\"type\",\"occurredAt\",\"key\",\"value\",\"failedAttempts\",\"lockedUntil\",\"lastAttemptAt\",\"targetType\",\"quizSetId\",\"groupId\",\"score\",\"maxScore\",\"answersJson\",\"isPartialRetake\",\"completedAt\",\"contentType\",\"mode\",\"currentIndex\",\"orderJson\",\"cardResultsJson\",\"questionId\",\"text\",\"isCorrect\",\"prompt\",\"rationale\",\"category\",\"front\",\"back\",\"slug\",\"every\",\"some\",\"none\",\"setId_deckId\",\"setId_flashcardId\",\"deckId_mode\",\"quizSetId_mode\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
+ graph: "_geiAYACDAQAAPsDACAPAAD8AwAgFgAA_QMAIBcAAP4DACCgAgAA-gMAMKECAABQABCiAgAA-gMAMKMCAQAAAAGxAkAA4wMAIb8CAgDoAwAhwgIBAOIDACHhAgEAAAABAQAAAAEAIBADAACBBAAgBQAA7gMAIA0AAIUEACAOAACcBAAgFAAAngQAIBUAAIIEACCgAgAAnQQAMKECAAADABCiAgAAnQQAMKMCAQDiAwAhsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIc4CAQCABAAhCAMAAIQHACAFAACZBgAgDQAAhwcAIA4AAI4HACAUAACPBwAgFQAAhQcAIMMCAACfBAAgzgIAAJ8EACAQAwAAgQQAIAUAAO4DACANAACFBAAgDgAAnAQAIBQAAJ4EACAVAACCBAAgoAIAAJ0EADChAgAAAwAQogIAAJ0EADCjAgEAAAABsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIc4CAQCABAAhAwAAAAMAIAEAAAQAMAIAAAUAIA0DAACBBAAgBAAA-wMAIA0AAIUEACAPAAD8AwAgoAIAAIQEADChAgAABwAQogIAAIQEADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhxQIBAOIDACEBAAAABwAgAwAAAAMAIAEAAAQAMAIAAAUAIBADAACBBAAgBQAA7gMAIAoAAJoEACALAACbBAAgDQAAhQQAIA4AAJwEACCgAgAAmQQAMKECAAAKABCiAgAAmQQAMKMCAQDiAwAhsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIc4CAQCABAAhCAMAAIQHACAFAACZBgAgCgAAjAcAIAsAAI0HACANAACHBwAgDgAAjgcAIMMCAACfBAAgzgIAAJ8EACAQAwAAgQQAIAUAAO4DACAKAACaBAAgCwAAmwQAIA0AAIUEACAOAACcBAAgoAIAAJkEADChAgAACgAQogIAAJkEADCjAgEAAAABsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIc4CAQCABAAhAwAAAAoAIAEAAAsAMAIAAAwAIAEAAAAHACAMBgAAlAQAIAgAAJgEACCgAgAAlwQAMKECAAAPABCiAgAAlwQAMKMCAQDiAwAhvwICAOgDACHFAgEA4gMAIc0CAQDiAwAh3AIBAOIDACHdAgEA4gMAId4CAQDiAwAhAgYAAJgGACAIAACLBwAgDAYAAJQEACAIAACYBAAgoAIAAJcEADChAgAADwAQogIAAJcEADCjAgEAAAABvwICAOgDACHFAgEA4gMAIc0CAQDiAwAh3AIBAOIDACHdAgEA4gMAId4CAQDiAwAhAwAAAA8AIAEAABAAMAIAABEAIAkHAACWBAAgoAIAAJUEADChAgAAEwAQogIAAJUEADCjAgEA4gMAIb8CAgDoAwAh2QIBAOIDACHaAgEA4gMAIdsCIACTBAAhAQcAAIoHACAJBwAAlgQAIKACAACVBAAwoQIAABMAEKICAACVBAAwowIBAAAAAb8CAgDoAwAh2QIBAOIDACHaAgEA4gMAIdsCIACTBAAhAwAAABMAIAEAABQAMAIAABUAIAEAAAATACALBgAAlAQAIKACAACSBAAwoQIAABgAEKICAACSBAAwowIBAOIDACHNAgEA4gMAIc8CCACMBAAh0AICAOgDACHRAgEA4gMAIdICIACTBAAh0wJAAOMDACEBBgAAmAYAIAsGAACUBAAgoAIAAJIEADChAgAAGAAQogIAAJIEADCjAgEAAAABzQIBAOIDACHPAggAjAQAIdACAgDoAwAh0QIBAOIDACHSAiAAkwQAIdMCQADjAwAhAwAAABgAIAEAABkAMAIAABoAIAwFAADuAwAgBgAA7QMAIAwAAOwDACCgAgAA6wMAMKECAAAcABCiAgAA6wMAMKMCAQDiAwAhsQJAAOMDACG-AgEAgAQAIcwCAQDiAwAhzQIBAIAEACHOAgEAgAQAIQEAAAAcACABAAAAAwAgAQAAAAoAIAEAAAAHACAPBgAA7QMAIAwAAOwDACCgAgAAkQQAMKECAAAhABCiAgAAkQQAMKMCAQDiAwAhsgJAAOMDACG-AgEAgAQAIc0CAQCABAAh0QIBAIAEACHUAgEA4gMAIdUCAQDiAwAh1gICAOgDACHXAgEA4gMAIdgCAQCABAAhBgYAAJgGACAMAACXBgAgvgIAAJ8EACDNAgAAnwQAINECAACfBAAg2AIAAJ8EACARBgAA7QMAIAwAAOwDACCgAgAAkQQAMKECAAAhABCiAgAAkQQAMKMCAQAAAAGyAkAA4wMAIb4CAQCABAAhzQIBAIAEACHRAgEAgAQAIdQCAQDiAwAh1QIBAOIDACHWAgIA6AMAIdcCAQDiAwAh2AIBAIAEACHnAgAAjwQAIOgCAACQBAAgAwAAACEAIAEAACIAMAIAACMAIAEAAAADACABAAAACgAgAQAAAA8AIAEAAAAYACABAAAAIQAgAQAAABwAIAEAAAADACABAAAACgAgCgwAAIkEACATAACDBAAgoAIAAI4EADChAgAALQAQogIAAI4EADCjAgEA4gMAIb4CAQDiAwAhvwICAOgDACHfAgEA4gMAIeACAQDiAwAhAgwAAJcGACATAACGBwAgCgwAAIkEACATAACDBAAgoAIAAI4EADChAgAALQAQogIAAI4EADCjAgEAAAABvgIBAOIDACG_AgIA6AMAId8CAQDiAwAh4AIBAOIDACEDAAAALQAgAQAALgAwAgAALwAgFRAAAIgEACASAACNBAAgoAIAAIsEADChAgAAMQAQogIAAIsEADCjAgEA4gMAIaQCAQDiAwAhpQIBAOIDACGmAkAA4wMAIacCCACMBAAhqAIIAIwEACGpAgIA6AMAIaoCAgDoAwAhqwICAOgDACGsAgIA6AMAIa0CAgDoAwAhrgICAOgDACGvAkAA4wMAIbACQADpAwAhsQJAAOMDACGyAkAA4wMAIQMQAACIBwAgEgAAiQcAILACAACfBAAgFhAAAIgEACASAACNBAAgoAIAAIsEADChAgAAMQAQogIAAIsEADCjAgEAAAABpAIBAOIDACGlAgEA4gMAIaYCQADjAwAhpwIIAIwEACGoAggAjAQAIakCAgDoAwAhqgICAOgDACGrAgIA6AMAIawCAgDoAwAhrQICAOgDACGuAgIA6AMAIa8CQADjAwAhsAJAAOkDACGxAkAA4wMAIbICQADjAwAh5gIAAIoEACADAAAAMQAgAQAAMgAwAgAAMwAgCQwAAIkEACAQAACIBAAgoAIAAIcEADChAgAANQAQogIAAIcEADCkAgEA4gMAIb4CAQDiAwAhvwICAOgDACHAAkAA4wMAIQIMAACXBgAgEAAAiAcAIAoMAACJBAAgEAAAiAQAIKACAACHBAAwoQIAADUAEKICAACHBAAwpAIBAOIDACG-AgEA4gMAIb8CAgDoAwAhwAJAAOMDACHlAgAAhgQAIAMAAAA1ACABAAA2ADACAAA3ACADAAAAMQAgAQAAMgAwAgAAMwAgAQAAADUAIAEAAAAxACABAAAAMQAgAQAAABwAIAMAAAAhACABAAAiADACAAAjACADAAAANQAgAQAANgAwAgAANwAgAQAAAC0AIAEAAAAhACABAAAANQAgAwAAAAoAIAEAAAsAMAIAAAwAIAQDAACEBwAgBAAAgAcAIA0AAIcHACAPAACBBwAgDQMAAIEEACAEAAD7AwAgDQAAhQQAIA8AAPwDACCgAgAAhAQAMKECAAAHABCiAgAAhAQAMKMCAQAAAAGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcUCAQDiAwAhAwAAAAcAIAEAAEQAMAIAAEUAIA4DAACBBAAgBAAAggQAIBEAAIMEACCgAgAA_wMAMKECAABHABCiAgAA_wMAMKMCAQDiAwAhsQJAAOMDACGyAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhxAICAOgDACEEAwAAhAcAIAQAAIUHACARAACGBwAgwwIAAJ8EACAOAwAAgQQAIAQAAIIEACARAACDBAAgoAIAAP8DADChAgAARwAQogIAAP8DADCjAgEAAAABsQJAAOMDACGyAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhxAICAOgDACEDAAAARwAgAQAASAAwAgAASQAgAQAAAAMAIAEAAAAKACABAAAABwAgAQAAAEcAIAEAAAABACAMBAAA-wMAIA8AAPwDACAWAAD9AwAgFwAA_gMAIKACAAD6AwAwoQIAAFAAEKICAAD6AwAwowIBAOIDACGxAkAA4wMAIb8CAgDoAwAhwgIBAOIDACHhAgEA4gMAIQQEAACABwAgDwAAgQcAIBYAAIIHACAXAACDBwAgAwAAAFAAIAEAAFEAMAIAAAEAIAMAAABQACABAABRADACAAABACADAAAAUAAgAQAAUQAwAgAAAQAgCQQAAPwGACAPAAD9BgAgFgAA_gYAIBcAAP8GACCjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAAB4QIBAAAAAQEdAABVACAFowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAeECAQAAAAEBHQAAVwAwAR0AAFcAMAkEAADOBgAgDwAAzwYAIBYAANAGACAXAADRBgAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQIAAAABACAdAABaACAFowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQIAAABQACAdAABcACACAAAAUAAgHQAAXAAgAwAAAAEAICQAAFUAICUAAFoAIAEAAAABACABAAAAUAAgBQkAAMkGACAqAADKBgAgKwAAzQYAICwAAMwGACAtAADLBgAgCKACAAD5AwAwoQIAAGMAEKICAAD5AwAwowIBAMoDACGxAkAAywMAIb8CAgDNAwAhwgIBAMoDACHhAgEAygMAIQMAAABQACABAABiADApAABjACADAAAAUAAgAQAAUQAwAgAAAQAgAQAAAAUAIAEAAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACANAwAAgAYAIAUAAMgGACANAACCBgAgDgAAgwYAIBQAAIEGACAVAACEBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQEdAABrACAHowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQEdAABtADABHQAAbQAwAQAAAAcAIA0DAADKBQAgBQAAxwYAIA0AAMwFACAOAADNBQAgFAAAywUAIBUAAM4FACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQIAAAAFACAdAABxACAHowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACECAAAAAwAgHQAAcwAgAgAAAAMAIB0AAHMAIAEAAAAHACADAAAABQAgJAAAawAgJQAAcQAgAQAAAAUAIAEAAAADACAHCQAAwgYAICoAAMMGACArAADGBgAgLAAAxQYAIC0AAMQGACDDAgAAnwQAIM4CAACfBAAgCqACAAD4AwAwoQIAAHsAEKICAAD4AwAwowIBAMoDACGxAkAAywMAIb8CAgDNAwAhwQIBAMoDACHCAgEAygMAIcMCAQDcAwAhzgIBANwDACEDAAAAAwAgAQAAegAwKQAAewAgAwAAAAMAIAEAAAQAMAIAAAUAIAEAAAAvACABAAAALwAgAwAAAC0AIAEAAC4AMAIAAC8AIAMAAAAtACABAAAuADACAAAvACADAAAALQAgAQAALgAwAgAALwAgBwwAAMEGACATAAD-BQAgowIBAAAAAb4CAQAAAAG_AgIAAAAB3wIBAAAAAeACAQAAAAEBHQAAgwEAIAWjAgEAAAABvgIBAAAAAb8CAgAAAAHfAgEAAAAB4AIBAAAAAQEdAACFAQAwAR0AAIUBADAHDAAAwAYAIBMAAPMFACCjAgEApQQAIb4CAQClBAAhvwICAKgEACHfAgEApQQAIeACAQClBAAhAgAAAC8AIB0AAIgBACAFowIBAKUEACG-AgEApQQAIb8CAgCoBAAh3wIBAKUEACHgAgEApQQAIQIAAAAtACAdAACKAQAgAgAAAC0AIB0AAIoBACADAAAALwAgJAAAgwEAICUAAIgBACABAAAALwAgAQAAAC0AIAUJAAC7BgAgKgAAvAYAICsAAL8GACAsAAC-BgAgLQAAvQYAIAigAgAA9wMAMKECAACRAQAQogIAAPcDADCjAgEAygMAIb4CAQDKAwAhvwICAM0DACHfAgEAygMAIeACAQDKAwAhAwAAAC0AIAEAAJABADApAACRAQAgAwAAAC0AIAEAAC4AMAIAAC8AIAEAAAAMACABAAAADAAgAwAAAAoAIAEAAAsAMAIAAAwAIAMAAAAKACABAAALADACAAAMACADAAAACgAgAQAACwAwAgAADAAgDQMAALoFACAFAAC6BgAgCgAAuwUAIAsAALwFACANAAC9BQAgDgAAvgUAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAEBHQAAmQEAIAejAgEAAAABsQJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHOAgEAAAABAR0AAJsBADABHQAAmwEAMAEAAAAHACANAwAA-AQAIAUAALkGACAKAAD5BAAgCwAA-gQAIA0AAPsEACAOAAD8BAAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACECAAAADAAgHQAAnwEAIAejAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQIAAAAKACAdAAChAQAgAgAAAAoAIB0AAKEBACABAAAABwAgAwAAAAwAICQAAJkBACAlAACfAQAgAQAAAAwAIAEAAAAKACAHCQAAtAYAICoAALUGACArAAC4BgAgLAAAtwYAIC0AALYGACDDAgAAnwQAIM4CAACfBAAgCqACAAD2AwAwoQIAAKkBABCiAgAA9gMAMKMCAQDKAwAhsQJAAMsDACG_AgIAzQMAIcECAQDKAwAhwgIBAMoDACHDAgEA3AMAIc4CAQDcAwAhAwAAAAoAIAEAAKgBADApAACpAQAgAwAAAAoAIAEAAAsAMAIAAAwAIAEAAAARACABAAAAEQAgAwAAAA8AIAEAABAAMAIAABEAIAMAAAAPACABAAAQADACAAARACADAAAADwAgAQAAEAAwAgAAEQAgCQYAALMGACAIAAC4BQAgowIBAAAAAb8CAgAAAAHFAgEAAAABzQIBAAAAAdwCAQAAAAHdAgEAAAAB3gIBAAAAAQEdAACxAQAgB6MCAQAAAAG_AgIAAAABxQIBAAAAAc0CAQAAAAHcAgEAAAAB3QIBAAAAAd4CAQAAAAEBHQAAswEAMAEdAACzAQAwCQYAALIGACAIAACqBQAgowIBAKUEACG_AgIAqAQAIcUCAQClBAAhzQIBAKUEACHcAgEApQQAId0CAQClBAAh3gIBAKUEACECAAAAEQAgHQAAtgEAIAejAgEApQQAIb8CAgCoBAAhxQIBAKUEACHNAgEApQQAIdwCAQClBAAh3QIBAKUEACHeAgEApQQAIQIAAAAPACAdAAC4AQAgAgAAAA8AIB0AALgBACADAAAAEQAgJAAAsQEAICUAALYBACABAAAAEQAgAQAAAA8AIAUJAACtBgAgKgAArgYAICsAALEGACAsAACwBgAgLQAArwYAIAqgAgAA9QMAMKECAAC_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_gEAIAIAAAAYACAdAAD-AQAgAwAAABoAICQAAPcBACAlAAD8AQAgAQAAABoAIAEAAAAYACAFCQAAmgYAICoAAJsGACArAACeBgAgLAAAnQYAIC0AAJwGACAKoAIAAO8DADChAgAAhQIAEKICAADvAwAwowIBAMoDACHNAgEAygMAIc8CCADMAwAh0AICAM0DACHRAgEAygMAIdICIADwAwAh0wJAAMsDACEDAAAAGAAgAQAAhAIAMCkAAIUCACADAAAAGAAgAQAAGQAwAgAAGgAgDAUAAO4DACAGAADtAwAgDAAA7AMAIKACAADrAwAwoQIAABwAEKICAADrAwAwowIBAAAAAbECQADjAwAhvgIBAAAAAcwCAQDiAwAhzQIBAAAAAc4CAQAAAAEBAAAAiAIAIAEAAACIAgAgBgUAAJkGACAGAACYBgAgDAAAlwYAIL4CAACfBAAgzQIAAJ8EACDOAgAAnwQAIAMAAAAcACABAACLAgAwAgAAiAIAIAMAAAAcACABAACLAgAwAgAAiAIAIAMAAAAcACABAACLAgAwAgAAiAIAIAkFAACRBQAgBgAA7AQAIAwAAOsEACCjAgEAAAABsQJAAAAAAb4CAQAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAEBHQAAjwIAIAajAgEAAAABsQJAAAAAAb4CAQAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAEBHQAAkQIAMAEdAACRAgAwAQAAAAMAIAEAAAAKACABAAAABwAgCQUAAJAFACAGAADqBAAgDAAA6QQAIKMCAQClBAAhsQJAAKYEACG-AgEAvAQAIcwCAQClBAAhzQIBALwEACHOAgEAvAQAIQIAAACIAgAgHQAAlwIAIAajAgEApQQAIbECQACmBAAhvgIBALwEACHMAgEApQQAIc0CAQC8BAAhzgIBALwEACECAAAAHAAgHQAAmQIAIAIAAAAcACAdAACZAgAgAQAAAAMAIAEAAAAKACABAAAABwAgAwAAAIgCACAkAACPAgAgJQAAlwIAIAEAAACIAgAgAQAAABwAIAYJAACUBgAgLAAAlgYAIC0AAJUGACC-AgAAnwQAIM0CAACfBAAgzgIAAJ8EACAJoAIAAOoDADChAgAAowIAEKICAADqAwAwowIBAMoDACGxAkAAywMAIb4CAQDcAwAhzAIBAMoDACHNAgEA3AMAIc4CAQDcAwAhAwAAABwAIAEAAKICADApAACjAgAgAwAAABwAIAEAAIsCADACAACIAgAgB6ACAADnAwAwoQIAAKkCABCiAgAA5wMAMKMCAgAAAAHJAgIA6AMAIcoCQADpAwAhywJAAOkDACEBAAAApgIAIAEAAACmAgAgB6ACAADnAwAwoQIAAKkCABCiAgAA5wMAMKMCAgDoAwAhyQICAOgDACHKAkAA6QMAIcsCQADpAwAhAsoCAACfBAAgywIAAJ8EACADAAAAqQIAIAEAAKoCADACAACmAgAgAwAAAKkCACABAACqAgAwAgAApgIAIAMAAACpAgAgAQAAqgIAMAIAAKYCACAEowICAAAAAckCAgAAAAHKAkAAAAABywJAAAAAAQEdAACuAgAgBKMCAgAAAAHJAgIAAAABygJAAAAAAcsCQAAAAAEBHQAAsAIAMAEdAACwAgAwBKMCAgCoBAAhyQICAKgEACHKAkAAqQQAIcsCQACpBAAhAgAAAKYCACAdAACzAgAgBKMCAgCoBAAhyQICAKgEACHKAkAAqQQAIcsCQACpBAAhAgAAAKkCACAdAAC1AgAgAgAAAKkCACAdAAC1AgAgAwAAAKYCACAkAACuAgAgJQAAswIAIAEAAACmAgAgAQAAAKkCACAHCQAAjwYAICoAAJAGACArAACTBgAgLAAAkgYAIC0AAJEGACDKAgAAnwQAIMsCAACfBAAgB6ACAADmAwAwoQIAALwCABCiAgAA5gMAMKMCAgDNAwAhyQICAM0DACHKAkAAzgMAIcsCQADOAwAhAwAAAKkCACABAAC7AgAwKQAAvAIAIAMAAACpAgAgAQAAqgIAMAIAAKYCACAFoAIAAOUDADChAgAAwgIAEKICAADlAwAwxwIBAAAAAcgCAQDiAwAhAQAAAL8CACABAAAAvwIAIAWgAgAA5QMAMKECAADCAgAQogIAAOUDADDHAgEA4gMAIcgCAQDiAwAhAAMAAADCAgAgAQAAwwIAMAIAAL8CACADAAAAwgIAIAEAAMMCADACAAC_AgAgAwAAAMICACABAADDAgAwAgAAvwIAIALHAgEAAAAByAIBAAAAAQEdAADHAgAgAscCAQAAAAHIAgEAAAABAR0AAMkCADABHQAAyQIAMALHAgEApQQAIcgCAQClBAAhAgAAAL8CACAdAADMAgAgAscCAQClBAAhyAIBAKUEACECAAAAwgIAIB0AAM4CACACAAAAwgIAIB0AAM4CACADAAAAvwIAICQAAMcCACAlAADMAgAgAQAAAL8CACABAAAAwgIAIAMJAACMBgAgLAAAjgYAIC0AAI0GACAFoAIAAOQDADChAgAA1QIAEKICAADkAwAwxwIBAMoDACHIAgEAygMAIQMAAADCAgAgAQAA1AIAMCkAANUCACADAAAAwgIAIAEAAMMCADACAAC_AgAgBqACAADhAwAwoQIAANsCABCiAgAA4QMAMKMCAQAAAAHFAgEA4gMAIcYCQADjAwAhAQAAANgCACABAAAA2AIAIAagAgAA4QMAMKECAADbAgAQogIAAOEDADCjAgEA4gMAIcUCAQDiAwAhxgJAAOMDACEAAwAAANsCACABAADcAgAwAgAA2AIAIAMAAADbAgAgAQAA3AIAMAIAANgCACADAAAA2wIAIAEAANwCADACAADYAgAgA6MCAQAAAAHFAgEAAAABxgJAAAAAAQEdAADgAgAgA6MCAQAAAAHFAgEAAAABxgJAAAAAAQEdAADiAgAwAR0AAOICADADowIBAKUEACHFAgEApQQAIcYCQACmBAAhAgAAANgCACAdAADlAgAgA6MCAQClBAAhxQIBAKUEACHGAkAApgQAIQIAAADbAgAgHQAA5wIAIAIAAADbAgAgHQAA5wIAIAMAAADYAgAgJAAA4AIAICUAAOUCACABAAAA2AIAIAEAAADbAgAgAwkAAIkGACAsAACLBgAgLQAAigYAIAagAgAA4AMAMKECAADuAgAQogIAAOADADCjAgEAygMAIcUCAQDKAwAhxgJAAMsDACEDAAAA2wIAIAEAAO0CADApAADuAgAgAwAAANsCACABAADcAgAwAgAA2AIAIAEAAABFACABAAAARQAgAwAAAAcAIAEAAEQAMAIAAEUAIAMAAAAHACABAABEADACAABFACADAAAABwAgAQAARAAwAgAARQAgCgMAAIUGACAEAACGBgAgDQAAiAYAIA8AAIcGACCjAgEAAAABsQJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcUCAQAAAAEBHQAA9gIAIAajAgEAAAABsQJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcUCAQAAAAEBHQAA-AIAMAEdAAD4AgAwCgMAAOAEACAEAADhBAAgDQAA4wQAIA8AAOIEACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhxQIBAKUEACECAAAARQAgHQAA-wIAIAajAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhxQIBAKUEACECAAAABwAgHQAA_QIAIAIAAAAHACAdAAD9AgAgAwAAAEUAICQAAPYCACAlAAD7AgAgAQAAAEUAIAEAAAAHACAFCQAA2wQAICoAANwEACArAADfBAAgLAAA3gQAIC0AAN0EACAJoAIAAN8DADChAgAAhAMAEKICAADfAwAwowIBAMoDACGxAkAAywMAIb8CAgDNAwAhwQIBAMoDACHCAgEAygMAIcUCAQDKAwAhAwAAAAcAIAEAAIMDADApAACEAwAgAwAAAAcAIAEAAEQAMAIAAEUAIAEAAABJACABAAAASQAgAwAAAEcAIAEAAEgAMAIAAEkAIAMAAABHACABAABIADACAABJACADAAAARwAgAQAASAAwAgAASQAgCwMAANgEACAEAADZBAAgEQAA2gQAIKMCAQAAAAGxAkAAAAABsgJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgIAAAABAR0AAIwDACAIowIBAAAAAbECQAAAAAGyAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAcQCAgAAAAEBHQAAjgMAMAEdAACOAwAwCwMAAL0EACAEAAC-BAAgEQAAvwQAIKMCAQClBAAhsQJAAKYEACGyAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhxAICAKgEACECAAAASQAgHQAAkQMAIAijAgEApQQAIbECQACmBAAhsgJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIcQCAgCoBAAhAgAAAEcAIB0AAJMDACACAAAARwAgHQAAkwMAIAMAAABJACAkAACMAwAgJQAAkQMAIAEAAABJACABAAAARwAgBgkAALcEACAqAAC4BAAgKwAAuwQAICwAALoEACAtAAC5BAAgwwIAAJ8EACALoAIAANsDADChAgAAmgMAEKICAADbAwAwowIBAMoDACGxAkAAywMAIbICQADLAwAhvwICAM0DACHBAgEAygMAIcICAQDKAwAhwwIBANwDACHEAgIAzQMAIQMAAABHACABAACZAwAwKQAAmgMAIAMAAABHACABAABIADACAABJACABAAAANwAgAQAAADcAIAMAAAA1ACABAAA2ADACAAA3ACADAAAANQAgAQAANgAwAgAANwAgAwAAADUAIAEAADYAMAIAADcAIAYMAAC2BAAgEAAAtQQAIKQCAQAAAAG-AgEAAAABvwICAAAAAcACQAAAAAEBHQAAogMAIASkAgEAAAABvgIBAAAAAb8CAgAAAAHAAkAAAAABAR0AAKQDADABHQAApAMAMAYMAAC0BAAgEAAAswQAIKQCAQClBAAhvgIBAKUEACG_AgIAqAQAIcACQACmBAAhAgAAADcAIB0AAKcDACAEpAIBAKUEACG-AgEApQQAIb8CAgCoBAAhwAJAAKYEACECAAAANQAgHQAAqQMAIAIAAAA1ACAdAACpAwAgAwAAADcAICQAAKIDACAlAACnAwAgAQAAADcAIAEAAAA1ACAFCQAArgQAICoAAK8EACArAACyBAAgLAAAsQQAIC0AALAEACAHoAIAANoDADChAgAAsAMAEKICAADaAwAwpAIBAMoDACG-AgEAygMAIb8CAgDNAwAhwAJAAMsDACEDAAAANQAgAQAArwMAMCkAALADACADAAAANQAgAQAANgAwAgAANwAgAQAAADMAIAEAAAAzACADAAAAMQAgAQAAMgAwAgAAMwAgAwAAADEAIAEAADIAMAIAADMAIAMAAAAxACABAAAyADACAAAzACASEAAArAQAIBIAAK0EACCjAgEAAAABpAIBAAAAAaUCAQAAAAGmAkAAAAABpwIIAAAAAagCCAAAAAGpAgIAAAABqgICAAAAAasCAgAAAAGsAgIAAAABrQICAAAAAa4CAgAAAAGvAkAAAAABsAJAAAAAAbECQAAAAAGyAkAAAAABAR0AALgDACAQowIBAAAAAaQCAQAAAAGlAgEAAAABpgJAAAAAAacCCAAAAAGoAggAAAABqQICAAAAAaoCAgAAAAGrAgIAAAABrAICAAAAAa0CAgAAAAGuAgIAAAABrwJAAAAAAbACQAAAAAGxAkAAAAABsgJAAAAAAQEdAAC6AwAwAR0AALoDADASEAAAqgQAIBIAAKsEACCjAgEApQQAIaQCAQClBAAhpQIBAKUEACGmAkAApgQAIacCCACnBAAhqAIIAKcEACGpAgIAqAQAIaoCAgCoBAAhqwICAKgEACGsAgIAqAQAIa0CAgCoBAAhrgICAKgEACGvAkAApgQAIbACQACpBAAhsQJAAKYEACGyAkAApgQAIQIAAAAzACAdAAC9AwAgEKMCAQClBAAhpAIBAKUEACGlAgEApQQAIaYCQACmBAAhpwIIAKcEACGoAggApwQAIakCAgCoBAAhqgICAKgEACGrAgIAqAQAIawCAgCoBAAhrQICAKgEACGuAgIAqAQAIa8CQACmBAAhsAJAAKkEACGxAkAApgQAIbICQACmBAAhAgAAADEAIB0AAL8DACACAAAAMQAgHQAAvwMAIAMAAAAzACAkAAC4AwAgJQAAvQMAIAEAAAAzACABAAAAMQAgBgkAAKAEACAqAAChBAAgKwAApAQAICwAAKMEACAtAACiBAAgsAIAAJ8EACAToAIAAMkDADChAgAAxgMAEKICAADJAwAwowIBAMoDACGkAgEAygMAIaUCAQDKAwAhpgJAAMsDACGnAggAzAMAIagCCADMAwAhqQICAM0DACGqAgIAzQMAIasCAgDNAwAhrAICAM0DACGtAgIAzQMAIa4CAgDNAwAhrwJAAMsDACGwAkAAzgMAIbECQADLAwAhsgJAAMsDACEDAAAAMQAgAQAAxQMAMCkAAMYDACADAAAAMQAgAQAAMgAwAgAAMwAgE6ACAADJAwAwoQIAAMYDABCiAgAAyQMAMKMCAQDKAwAhpAIBAMoDACGlAgEAygMAIaYCQADLAwAhpwIIAMwDACGoAggAzAMAIakCAgDNAwAhqgICAM0DACGrAgIAzQMAIawCAgDNAwAhrQICAM0DACGuAgIAzQMAIa8CQADLAwAhsAJAAM4DACGxAkAAywMAIbICQADLAwAhDgkAANMDACAsAADZAwAgLQAA2QMAILMCAQAAAAG0AgEAAAAEtQIBAAAABLYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEA2AMAIbsCAQAAAAG8AgEAAAABvQIBAAAAAQsJAADTAwAgLAAA1wMAIC0AANcDACCzAkAAAAABtAJAAAAABLUCQAAAAAS2AkAAAAABtwJAAAAAAbgCQAAAAAG5AkAAAAABugJAANYDACENCQAA0wMAICoAANQDACArAADUAwAgLAAA1AMAIC0AANQDACCzAggAAAABtAIIAAAABLUCCAAAAAS2AggAAAABtwIIAAAAAbgCCAAAAAG5AggAAAABugIIANUDACENCQAA0wMAICoAANQDACArAADTAwAgLAAA0wMAIC0AANMDACCzAgIAAAABtAICAAAABLUCAgAAAAS2AgIAAAABtwICAAAAAbgCAgAAAAG5AgIAAAABugICANIDACELCQAA0AMAICwAANEDACAtAADRAwAgswJAAAAAAbQCQAAAAAW1AkAAAAAFtgJAAAAAAbcCQAAAAAG4AkAAAAABuQJAAAAAAboCQADPAwAhCwkAANADACAsAADRAwAgLQAA0QMAILMCQAAAAAG0AkAAAAAFtQJAAAAABbYCQAAAAAG3AkAAAAABuAJAAAAAAbkCQAAAAAG6AkAAzwMAIQizAgIAAAABtAICAAAABbUCAgAAAAW2AgIAAAABtwICAAAAAbgCAgAAAAG5AgIAAAABugICANADACEIswJAAAAAAbQCQAAAAAW1AkAAAAAFtgJAAAAAAbcCQAAAAAG4AkAAAAABuQJAAAAAAboCQADRAwAhDQkAANMDACAqAADUAwAgKwAA0wMAICwAANMDACAtAADTAwAgswICAAAAAbQCAgAAAAS1AgIAAAAEtgICAAAAAbcCAgAAAAG4AgIAAAABuQICAAAAAboCAgDSAwAhCLMCAgAAAAG0AgIAAAAEtQICAAAABLYCAgAAAAG3AgIAAAABuAICAAAAAbkCAgAAAAG6AgIA0wMAIQizAggAAAABtAIIAAAABLUCCAAAAAS2AggAAAABtwIIAAAAAbgCCAAAAAG5AggAAAABugIIANQDACENCQAA0wMAICoAANQDACArAADUAwAgLAAA1AMAIC0AANQDACCzAggAAAABtAIIAAAABLUCCAAAAAS2AggAAAABtwIIAAAAAbgCCAAAAAG5AggAAAABugIIANUDACELCQAA0wMAICwAANcDACAtAADXAwAgswJAAAAAAbQCQAAAAAS1AkAAAAAEtgJAAAAAAbcCQAAAAAG4AkAAAAABuQJAAAAAAboCQADWAwAhCLMCQAAAAAG0AkAAAAAEtQJAAAAABLYCQAAAAAG3AkAAAAABuAJAAAAAAbkCQAAAAAG6AkAA1wMAIQ4JAADTAwAgLAAA2QMAIC0AANkDACCzAgEAAAABtAIBAAAABLUCAQAAAAS2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBANgDACG7AgEAAAABvAIBAAAAAb0CAQAAAAELswIBAAAAAbQCAQAAAAS1AgEAAAAEtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAboCAQDZAwAhuwIBAAAAAbwCAQAAAAG9AgEAAAABB6ACAADaAwAwoQIAALADABCiAgAA2gMAMKQCAQDKAwAhvgIBAMoDACG_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_AgIAzQMAIcECAQDKAwAhwgIBAMoDACHDAgEA3AMAIc4CAQDcAwAhCKACAAD3AwAwoQIAAJEBABCiAgAA9wMAMKMCAQDKAwAhvgIBAMoDACG_AgIAzQMAId8CAQDKAwAh4AIBAMoDACEKoAIAAPgDADChAgAAewAQogIAAPgDADCjAgEAygMAIbECQADLAwAhvwICAM0DACHBAgEAygMAIcICAQDKAwAhwwIBANwDACHOAgEA3AMAIQigAgAA-QMAMKECAABjABCiAgAA-QMAMKMCAQDKAwAhsQJAAMsDACG_AgIAzQMAIcICAQDKAwAh4QIBAMoDACEMBAAA-wMAIA8AAPwDACAWAAD9AwAgFwAA_gMAIKACAAD6AwAwoQIAAFAAEKICAAD6AwAwowIBAOIDACGxAkAA4wMAIb8CAgDoAwAhwgIBAOIDACHhAgEA4gMAIQPiAgAAAwAg4wIAAAMAIOQCAAADACAD4gIAAAoAIOMCAAAKACDkAgAACgAgA-ICAAAHACDjAgAABwAg5AIAAAcAIAPiAgAARwAg4wIAAEcAIOQCAABHACAOAwAAgQQAIAQAAIIEACARAACDBAAgoAIAAP8DADChAgAARwAQogIAAP8DADCjAgEA4gMAIbECQADjAwAhsgJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIcQCAgDoAwAhC7MCAQAAAAG0AgEAAAAFtQIBAAAABbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEA3gMAIbsCAQAAAAG8AgEAAAABvQIBAAAAAQ4EAAD7AwAgDwAA_AMAIBYAAP0DACAXAAD-AwAgoAIAAPoDADChAgAAUAAQogIAAPoDADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHCAgEA4gMAIeECAQDiAwAh6QIAAFAAIOoCAABQACAD4gIAADUAIOMCAAA1ACDkAgAANQAgA-ICAAAxACDjAgAAMQAg5AIAADEAIA0DAACBBAAgBAAA-wMAIA0AAIUEACAPAAD8AwAgoAIAAIQEADChAgAABwAQogIAAIQEADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhxQIBAOIDACEOBQAA7gMAIAYAAO0DACAMAADsAwAgoAIAAOsDADChAgAAHAAQogIAAOsDADCjAgEA4gMAIbECQADjAwAhvgIBAIAEACHMAgEA4gMAIc0CAQCABAAhzgIBAIAEACHpAgAAHAAg6gIAABwAIAKkAgEAAAABvgIBAAAAAQkMAACJBAAgEAAAiAQAIKACAACHBAAwoQIAADUAEKICAACHBAAwpAIBAOIDACG-AgEA4gMAIb8CAgDoAwAhwAJAAOMDACEQAwAAgQQAIAQAAIIEACARAACDBAAgoAIAAP8DADChAgAARwAQogIAAP8DADCjAgEA4gMAIbECQADjAwAhsgJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIcQCAgDoAwAh6QIAAEcAIOoCAABHACASAwAAgQQAIAUAAO4DACANAACFBAAgDgAAnAQAIBQAAJ4EACAVAACCBAAgoAIAAJ0EADChAgAAAwAQogIAAJ0EADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIekCAAADACDqAgAAAwAgAqQCAQAAAAGlAgEAAAABFRAAAIgEACASAACNBAAgoAIAAIsEADChAgAAMQAQogIAAIsEADCjAgEA4gMAIaQCAQDiAwAhpQIBAOIDACGmAkAA4wMAIacCCACMBAAhqAIIAIwEACGpAgIA6AMAIaoCAgDoAwAhqwICAOgDACGsAgIA6AMAIa0CAgDoAwAhrgICAOgDACGvAkAA4wMAIbACQADpAwAhsQJAAOMDACGyAkAA4wMAIQizAggAAAABtAIIAAAABLUCCAAAAAS2AggAAAABtwIIAAAAAbgCCAAAAAG5AggAAAABugIIANQDACEMDAAAiQQAIBMAAIMEACCgAgAAjgQAMKECAAAtABCiAgAAjgQAMKMCAQDiAwAhvgIBAOIDACG_AgIA6AMAId8CAQDiAwAh4AIBAOIDACHpAgAALQAg6gIAAC0AIAoMAACJBAAgEwAAgwQAIKACAACOBAAwoQIAAC0AEKICAACOBAAwowIBAOIDACG-AgEA4gMAIb8CAgDoAwAh3wIBAOIDACHgAgEA4gMAIQK-AgEAAAAB1QIBAAAAAQLNAgEAAAAB1QIBAAAAAQ8GAADtAwAgDAAA7AMAIKACAACRBAAwoQIAACEAEKICAACRBAAwowIBAOIDACGyAkAA4wMAIb4CAQCABAAhzQIBAIAEACHRAgEAgAQAIdQCAQDiAwAh1QIBAOIDACHWAgIA6AMAIdcCAQDiAwAh2AIBAIAEACELBgAAlAQAIKACAACSBAAwoQIAABgAEKICAACSBAAwowIBAOIDACHNAgEA4gMAIc8CCACMBAAh0AICAOgDACHRAgEA4gMAIdICIACTBAAh0wJAAOMDACECswIgAAAAAboCIADyAwAhEgMAAIEEACAFAADuAwAgCgAAmgQAIAsAAJsEACANAACFBAAgDgAAnAQAIKACAACZBAAwoQIAAAoAEKICAACZBAAwowIBAOIDACGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhzgIBAIAEACHpAgAACgAg6gIAAAoAIAkHAACWBAAgoAIAAJUEADChAgAAEwAQogIAAJUEADCjAgEA4gMAIb8CAgDoAwAh2QIBAOIDACHaAgEA4gMAIdsCIACTBAAhDgYAAJQEACAIAACYBAAgoAIAAJcEADChAgAADwAQogIAAJcEADCjAgEA4gMAIb8CAgDoAwAhxQIBAOIDACHNAgEA4gMAIdwCAQDiAwAh3QIBAOIDACHeAgEA4gMAIekCAAAPACDqAgAADwAgDAYAAJQEACAIAACYBAAgoAIAAJcEADChAgAADwAQogIAAJcEADCjAgEA4gMAIb8CAgDoAwAhxQIBAOIDACHNAgEA4gMAIdwCAQDiAwAh3QIBAOIDACHeAgEA4gMAIQPiAgAAEwAg4wIAABMAIOQCAAATACAQAwAAgQQAIAUAAO4DACAKAACaBAAgCwAAmwQAIA0AAIUEACAOAACcBAAgoAIAAJkEADChAgAACgAQogIAAJkEADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIQPiAgAADwAg4wIAAA8AIOQCAAAPACAD4gIAABgAIOMCAAAYACDkAgAAGAAgA-ICAAAhACDjAgAAIQAg5AIAACEAIBADAACBBAAgBQAA7gMAIA0AAIUEACAOAACcBAAgFAAAngQAIBUAAIIEACCgAgAAnQQAMKECAAADABCiAgAAnQQAMKMCAQDiAwAhsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIc4CAQCABAAhA-ICAAAtACDjAgAALQAg5AIAAC0AIAAAAAAAAAEQAQAAAAEBEEAAAAABBRAIAAAAAfMCCAAAAAH0AggAAAAB9QIIAAAAAfYCCAAAAAEFEAIAAAAB8wICAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAQEQQAAAAAEFJAAA9wcAICUAAP0HACDrAgAA-AcAIOwCAAD8BwAg8AIAAEkAIAUkAAD1BwAgJQAA-gcAIOsCAAD2BwAg7AIAAPkHACDwAgAALwAgAyQAAPcHACDrAgAA-AcAIPACAABJACADJAAA9QcAIOsCAAD2BwAg8AIAAC8AIAAAAAAABSQAAO0HACAlAADzBwAg6wIAAO4HACDsAgAA8gcAIPACAABJACAFJAAA6wcAICUAAPAHACDrAgAA7AcAIOwCAADvBwAg8AIAAAUAIAMkAADtBwAg6wIAAO4HACDwAgAASQAgAyQAAOsHACDrAgAA7AcAIPACAAAFACAAAAAAAAEQAQAAAAEFJAAA5AcAICUAAOkHACDrAgAA5QcAIOwCAADoBwAg8AIAAAEAIAsQAADQBAAwJAAAzAQAMCUAANEEADDrAgAAzQQAMOwCAADOBAAw7QIAAM8EACDuAgAA0AQAMO8CAADQBAAw8AIAANAEADDxAgAA0gQAMPICAADTBAAwCxAAAMQEADAkAADABAAwJQAAxQQAMOsCAADBBAAw7AIAAMIEADDtAgAAwwQAIO4CAADEBAAw7wIAAMQEADDwAgAAxAQAMPECAADGBAAw8gIAAMcEADAQEgAArQQAIKMCAQAAAAGlAgEAAAABpgJAAAAAAacCCAAAAAGoAggAAAABqQICAAAAAaoCAgAAAAGrAgIAAAABrAICAAAAAa0CAgAAAAGuAgIAAAABrwJAAAAAAbACQAAAAAGxAkAAAAABsgJAAAAAAQIAAAAzACAkAADLBAAgAwAAADMAICQAAMsEACAlAADKBAAgAR0AAOcHADAWEAAAiAQAIBIAAI0EACCgAgAAiwQAMKECAAAxABCiAgAAiwQAMKMCAQAAAAGkAgEA4gMAIaUCAQDiAwAhpgJAAOMDACGnAggAjAQAIagCCACMBAAhqQICAOgDACGqAgIA6AMAIasCAgDoAwAhrAICAOgDACGtAgIA6AMAIa4CAgDoAwAhrwJAAOMDACGwAkAA6QMAIbECQADjAwAhsgJAAOMDACHmAgAAigQAIAIAAAAzACAdAADKBAAgAgAAAMgEACAdAADJBAAgE6ACAADHBAAwoQIAAMgEABCiAgAAxwQAMKMCAQDiAwAhpAIBAOIDACGlAgEA4gMAIaYCQADjAwAhpwIIAIwEACGoAggAjAQAIakCAgDoAwAhqgICAOgDACGrAgIA6AMAIawCAgDoAwAhrQICAOgDACGuAgIA6AMAIa8CQADjAwAhsAJAAOkDACGxAkAA4wMAIbICQADjAwAhE6ACAADHBAAwoQIAAMgEABCiAgAAxwQAMKMCAQDiAwAhpAIBAOIDACGlAgEA4gMAIaYCQADjAwAhpwIIAIwEACGoAggAjAQAIakCAgDoAwAhqgICAOgDACGrAgIA6AMAIawCAgDoAwAhrQICAOgDACGuAgIA6AMAIa8CQADjAwAhsAJAAOkDACGxAkAA4wMAIbICQADjAwAhD6MCAQClBAAhpQIBAKUEACGmAkAApgQAIacCCACnBAAhqAIIAKcEACGpAgIAqAQAIaoCAgCoBAAhqwICAKgEACGsAgIAqAQAIa0CAgCoBAAhrgICAKgEACGvAkAApgQAIbACQACpBAAhsQJAAKYEACGyAkAApgQAIRASAACrBAAgowIBAKUEACGlAgEApQQAIaYCQACmBAAhpwIIAKcEACGoAggApwQAIakCAgCoBAAhqgICAKgEACGrAgIAqAQAIawCAgCoBAAhrQICAKgEACGuAgIAqAQAIa8CQACmBAAhsAJAAKkEACGxAkAApgQAIbICQACmBAAhEBIAAK0EACCjAgEAAAABpQIBAAAAAaYCQAAAAAGnAggAAAABqAIIAAAAAakCAgAAAAGqAgIAAAABqwICAAAAAawCAgAAAAGtAgIAAAABrgICAAAAAa8CQAAAAAGwAkAAAAABsQJAAAAAAbICQAAAAAEEDAAAtgQAIL4CAQAAAAG_AgIAAAABwAJAAAAAAQIAAAA3ACAkAADXBAAgAwAAADcAICQAANcEACAlAADWBAAgAR0AAOYHADAKDAAAiQQAIBAAAIgEACCgAgAAhwQAMKECAAA1ABCiAgAAhwQAMKQCAQDiAwAhvgIBAOIDACG_AgIA6AMAIcACQADjAwAh5QIAAIYEACACAAAANwAgHQAA1gQAIAIAAADUBAAgHQAA1QQAIAegAgAA0wQAMKECAADUBAAQogIAANMEADCkAgEA4gMAIb4CAQDiAwAhvwICAOgDACHAAkAA4wMAIQegAgAA0wQAMKECAADUBAAQogIAANMEADCkAgEA4gMAIb4CAQDiAwAhvwICAOgDACHAAkAA4wMAIQO-AgEApQQAIb8CAgCoBAAhwAJAAKYEACEEDAAAtAQAIL4CAQClBAAhvwICAKgEACHAAkAApgQAIQQMAAC2BAAgvgIBAAAAAb8CAgAAAAHAAkAAAAABAyQAAOQHACDrAgAA5QcAIPACAAABACAEJAAAzAQAMOsCAADNBAAw7QIAAM8EACDwAgAA0AQAMAQkAADABAAw6wIAAMEEADDtAgAAwwQAIPACAADEBAAwAAAAAAAFJAAAsgcAICUAAOIHACDrAgAAswcAIOwCAADhBwAg8AIAAAEAIAsQAADDBQAwJAAAvwUAMCUAAMQFADDrAgAAwAUAMOwCAADBBQAw7QIAAMIFACDuAgAAwwUAMO8CAADDBQAw8AIAAMMFADDxAgAAxQUAMPICAADGBQAwCxAAAPEEADAkAADtBAAwJQAA8gQAMOsCAADuBAAw7AIAAO8EADDtAgAA8AQAIO4CAADxBAAw7wIAAPEEADDwAgAA8QQAMPECAADzBAAw8gIAAPQEADAHJAAA5AQAICUAAOcEACDrAgAA5QQAIOwCAADmBAAg7gIAABwAIO8CAAAcACDwAgAAiAIAIAcGAADsBAAgDAAA6wQAIKMCAQAAAAGxAkAAAAABvgIBAAAAAcwCAQAAAAHNAgEAAAABAgAAAIgCACAkAADkBAAgAwAAABwAICQAAOQEACAlAADoBAAgCQAAABwAIAYAAOoEACAMAADpBAAgHQAA6AQAIKMCAQClBAAhsQJAAKYEACG-AgEAvAQAIcwCAQClBAAhzQIBALwEACEHBgAA6gQAIAwAAOkEACCjAgEApQQAIbECQACmBAAhvgIBALwEACHMAgEApQQAIc0CAQC8BAAhByQAANkHACAlAADfBwAg6wIAANoHACDsAgAA3gcAIO4CAAADACDvAgAAAwAg8AIAAAUAIAckAADXBwAgJQAA3AcAIOsCAADYBwAg7AIAANsHACDuAgAACgAg7wIAAAoAIPACAAAMACADJAAA2QcAIOsCAADaBwAg8AIAAAUAIAMkAADXBwAg6wIAANgHACDwAgAADAAgCwMAALoFACAKAAC7BQAgCwAAvAUAIA0AAL0FACAOAAC-BQAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABAgAAAAwAICQAALkFACADAAAADAAgJAAAuQUAICUAAPcEACABHQAA1gcAMBADAACBBAAgBQAA7gMAIAoAAJoEACALAACbBAAgDQAAhQQAIA4AAJwEACCgAgAAmQQAMKECAAAKABCiAgAAmQQAMKMCAQAAAAGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhzgIBAIAEACECAAAADAAgHQAA9wQAIAIAAAD1BAAgHQAA9gQAIAqgAgAA9AQAMKECAAD1BAAQogIAAPQEADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIQqgAgAA9AQAMKECAAD1BAAQogIAAPQEADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIQajAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACELAwAA-AQAIAoAAPkEACALAAD6BAAgDQAA-wQAIA4AAPwEACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACEFJAAAwwcAICUAANQHACDrAgAAxAcAIOwCAADTBwAg8AIAAAEAIAsQAACjBQAwJAAAnwUAMCUAAKQFADDrAgAAoAUAMOwCAAChBQAw7QIAAKIFACDuAgAAowUAMO8CAACjBQAw8AIAAKMFADDxAgAApQUAMPICAACmBQAwCxAAAJYFADAkAACSBQAwJQAAlwUAMOsCAACTBQAw7AIAAJQFADDtAgAAlQUAIO4CAACWBQAw7wIAAJYFADDwAgAAlgUAMPECAACYBQAw8gIAAJkFADAHJAAAiwUAICUAAI4FACDrAgAAjAUAIOwCAACNBQAg7gIAABwAIO8CAAAcACDwAgAAiAIAIAsQAACBBQAwJAAA_QQAMCUAAIIFADDrAgAA_gQAMOwCAAD_BAAw7QIAAIAFACDuAgAAgQUAMO8CAACBBQAw8AIAAIEFADDxAgAAgwUAMPICAACEBQAwCgwAAIoFACCjAgEAAAABsgJAAAAAAb4CAQAAAAHRAgEAAAAB1AIBAAAAAdUCAQAAAAHWAgIAAAAB1wIBAAAAAdgCAQAAAAECAAAAIwAgJAAAiQUAIAMAAAAjACAkAACJBQAgJQAAhwUAIAEdAADSBwAwEQYAAO0DACAMAADsAwAgoAIAAJEEADChAgAAIQAQogIAAJEEADCjAgEAAAABsgJAAOMDACG-AgEAgAQAIc0CAQCABAAh0QIBAIAEACHUAgEA4gMAIdUCAQDiAwAh1gICAOgDACHXAgEA4gMAIdgCAQCABAAh5wIAAI8EACDoAgAAkAQAIAIAAAAjACAdAACHBQAgAgAAAIUFACAdAACGBQAgDaACAACEBQAwoQIAAIUFABCiAgAAhAUAMKMCAQDiAwAhsgJAAOMDACG-AgEAgAQAIc0CAQCABAAh0QIBAIAEACHUAgEA4gMAIdUCAQDiAwAh1gICAOgDACHXAgEA4gMAIdgCAQCABAAhDaACAACEBQAwoQIAAIUFABCiAgAAhAUAMKMCAQDiAwAhsgJAAOMDACG-AgEAgAQAIc0CAQCABAAh0QIBAIAEACHUAgEA4gMAIdUCAQDiAwAh1gICAOgDACHXAgEA4gMAIdgCAQCABAAhCaMCAQClBAAhsgJAAKYEACG-AgEAvAQAIdECAQC8BAAh1AIBAKUEACHVAgEApQQAIdYCAgCoBAAh1wIBAKUEACHYAgEAvAQAIQoMAACIBQAgowIBAKUEACGyAkAApgQAIb4CAQC8BAAh0QIBALwEACHUAgEApQQAIdUCAQClBAAh1gICAKgEACHXAgEApQQAIdgCAQC8BAAhByQAAM0HACAlAADQBwAg6wIAAM4HACDsAgAAzwcAIO4CAAADACDvAgAAAwAg8AIAAAUAIAoMAACKBQAgowIBAAAAAbICQAAAAAG-AgEAAAAB0QIBAAAAAdQCAQAAAAHVAgEAAAAB1gICAAAAAdcCAQAAAAHYAgEAAAABAyQAAM0HACDrAgAAzgcAIPACAAAFACAHBQAAkQUAIAwAAOsEACCjAgEAAAABsQJAAAAAAb4CAQAAAAHMAgEAAAABzgIBAAAAAQIAAACIAgAgJAAAiwUAIAMAAAAcACAkAACLBQAgJQAAjwUAIAkAAAAcACAFAACQBQAgDAAA6QQAIB0AAI8FACCjAgEApQQAIbECQACmBAAhvgIBALwEACHMAgEApQQAIc4CAQC8BAAhBwUAAJAFACAMAADpBAAgowIBAKUEACGxAkAApgQAIb4CAQC8BAAhzAIBAKUEACHOAgEAvAQAIQckAADIBwAgJQAAywcAIOsCAADJBwAg7AIAAMoHACDuAgAABwAg7wIAAAcAIPACAABFACADJAAAyAcAIOsCAADJBwAg8AIAAEUAIAajAgEAAAABzwIIAAAAAdACAgAAAAHRAgEAAAAB0gIgAAAAAdMCQAAAAAECAAAAGgAgJAAAngUAIAMAAAAaACAkAACeBQAgJQAAnQUAIAEdAADHBwAwCwYAAJQEACCgAgAAkgQAMKECAAAYABCiAgAAkgQAMKMCAQAAAAHNAgEA4gMAIc8CCACMBAAh0AICAOgDACHRAgEA4gMAIdICIACTBAAh0wJAAOMDACECAAAAGgAgHQAAnQUAIAIAAACaBQAgHQAAmwUAIAqgAgAAmQUAMKECAACaBQAQogIAAJkFADCjAgEA4gMAIc0CAQDiAwAhzwIIAIwEACHQAgIA6AMAIdECAQDiAwAh0gIgAJMEACHTAkAA4wMAIQqgAgAAmQUAMKECAACaBQAQogIAAJkFADCjAgEA4gMAIc0CAQDiAwAhzwIIAIwEACHQAgIA6AMAIdECAQDiAwAh0gIgAJMEACHTAkAA4wMAIQajAgEApQQAIc8CCACnBAAh0AICAKgEACHRAgEApQQAIdICIACcBQAh0wJAAKYEACEBECAAAAABBqMCAQClBAAhzwIIAKcEACHQAgIAqAQAIdECAQClBAAh0gIgAJwFACHTAkAApgQAIQajAgEAAAABzwIIAAAAAdACAgAAAAHRAgEAAAAB0gIgAAAAAdMCQAAAAAEHCAAAuAUAIKMCAQAAAAG_AgIAAAABxQIBAAAAAdwCAQAAAAHdAgEAAAAB3gIBAAAAAQIAAAARACAkAAC3BQAgAwAAABEAICQAALcFACAlAACpBQAgAR0AAMYHADAMBgAAlAQAIAgAAJgEACCgAgAAlwQAMKECAAAPABCiAgAAlwQAMKMCAQAAAAG_AgIA6AMAIcUCAQDiAwAhzQIBAOIDACHcAgEA4gMAId0CAQDiAwAh3gIBAOIDACECAAAAEQAgHQAAqQUAIAIAAACnBQAgHQAAqAUAIAqgAgAApgUAMKECAACnBQAQogIAAKYFADCjAgEA4gMAIb8CAgDoAwAhxQIBAOIDACHNAgEA4gMAIdwCAQDiAwAh3QIBAOIDACHeAgEA4gMAIQqgAgAApgUAMKECAACnBQAQogIAAKYFADCjAgEA4gMAIb8CAgDoAwAhxQIBAOIDACHNAgEA4gMAIdwCAQDiAwAh3QIBAOIDACHeAgEA4gMAIQajAgEApQQAIb8CAgCoBAAhxQIBAKUEACHcAgEApQQAId0CAQClBAAh3gIBAKUEACEHCAAAqgUAIKMCAQClBAAhvwICAKgEACHFAgEApQQAIdwCAQClBAAh3QIBAKUEACHeAgEApQQAIQsQAACvBQAwJAAAqwUAMCUAALAFADDrAgAArAUAMOwCAACtBQAw7QIAAK4FACDuAgAArwUAMO8CAACvBQAw8AIAAK8FADDxAgAAsQUAMPICAACyBQAwBKMCAQAAAAG_AgIAAAAB2gIBAAAAAdsCIAAAAAECAAAAFQAgJAAAtgUAIAMAAAAVACAkAAC2BQAgJQAAtQUAIAEdAADFBwAwCQcAAJYEACCgAgAAlQQAMKECAAATABCiAgAAlQQAMKMCAQAAAAG_AgIA6AMAIdkCAQDiAwAh2gIBAOIDACHbAiAAkwQAIQIAAAAVACAdAAC1BQAgAgAAALMFACAdAAC0BQAgCKACAACyBQAwoQIAALMFABCiAgAAsgUAMKMCAQDiAwAhvwICAOgDACHZAgEA4gMAIdoCAQDiAwAh2wIgAJMEACEIoAIAALIFADChAgAAswUAEKICAACyBQAwowIBAOIDACG_AgIA6AMAIdkCAQDiAwAh2gIBAOIDACHbAiAAkwQAIQSjAgEApQQAIb8CAgCoBAAh2gIBAKUEACHbAiAAnAUAIQSjAgEApQQAIb8CAgCoBAAh2gIBAKUEACHbAiAAnAUAIQSjAgEAAAABvwICAAAAAdoCAQAAAAHbAiAAAAABBwgAALgFACCjAgEAAAABvwICAAAAAcUCAQAAAAHcAgEAAAAB3QIBAAAAAd4CAQAAAAEEJAAAqwUAMOsCAACsBQAw7QIAAK4FACDwAgAArwUAMAsDAAC6BQAgCgAAuwUAIAsAALwFACANAAC9BQAgDgAAvgUAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQMkAADDBwAg6wIAAMQHACDwAgAAAQAgBCQAAJ8FADDrAgAAoAUAMO0CAACiBQAg8AIAAKMFADAEJAAAkgUAMOsCAACTBQAw7QIAAJUFACDwAgAAlgUAMAMkAACLBQAg6wIAAIwFACDwAgAAiAIAIAQkAAD9BAAw6wIAAP4EADDtAgAAgAUAIPACAACBBQAwCwMAAIAGACANAACCBgAgDgAAgwYAIBQAAIEGACAVAACEBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABAgAAAAUAICQAAP8FACADAAAABQAgJAAA_wUAICUAAMkFACABHQAAwgcAMBADAACBBAAgBQAA7gMAIA0AAIUEACAOAACcBAAgFAAAngQAIBUAAIIEACCgAgAAnQQAMKECAAADABCiAgAAnQQAMKMCAQAAAAGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhzgIBAIAEACECAAAABQAgHQAAyQUAIAIAAADHBQAgHQAAyAUAIAqgAgAAxgUAMKECAADHBQAQogIAAMYFADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIQqgAgAAxgUAMKECAADHBQAQogIAAMYFADCjAgEA4gMAIbECQADjAwAhvwICAOgDACHBAgEA4gMAIcICAQDiAwAhwwIBAIAEACHOAgEAgAQAIQajAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACELAwAAygUAIA0AAMwFACAOAADNBQAgFAAAywUAIBUAAM4FACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACEFJAAAtAcAICUAAMAHACDrAgAAtQcAIOwCAAC_BwAg8AIAAAEAIAsQAADsBQAwJAAA6AUAMCUAAO0FADDrAgAA6QUAMOwCAADqBQAw7QIAAOsFACDuAgAA7AUAMO8CAADsBQAw8AIAAOwFADDxAgAA7gUAMPICAADvBQAwByQAAOMFACAlAADmBQAg6wIAAOQFACDsAgAA5QUAIO4CAAAcACDvAgAAHAAg8AIAAIgCACALEAAAgQUAMCQAANgFADAlAADcBQAw6wIAANkFADDsAgAA2gUAMO0CAADbBQAg7gIAAIEFADDvAgAAgQUAMPACAACBBQAw8QIAAN0FADDyAgAAhAUAMAsQAADQBAAwJAAAzwUAMCUAANMFADDrAgAA0AUAMOwCAADRBQAw7QIAANIFACDuAgAA0AQAMO8CAADQBAAw8AIAANAEADDxAgAA1AUAMPICAADTBAAwBBAAALUEACCkAgEAAAABvwICAAAAAcACQAAAAAECAAAANwAgJAAA1wUAIAMAAAA3ACAkAADXBQAgJQAA1gUAIAEdAAC-BwAwAgAAADcAIB0AANYFACACAAAA1AQAIB0AANUFACADpAIBAKUEACG_AgIAqAQAIcACQACmBAAhBBAAALMEACCkAgEApQQAIb8CAgCoBAAhwAJAAKYEACEEEAAAtQQAIKQCAQAAAAG_AgIAAAABwAJAAAAAAQoGAADiBQAgowIBAAAAAbICQAAAAAHNAgEAAAAB0QIBAAAAAdQCAQAAAAHVAgEAAAAB1gICAAAAAdcCAQAAAAHYAgEAAAABAgAAACMAICQAAOEFACADAAAAIwAgJAAA4QUAICUAAN8FACABHQAAvQcAMAIAAAAjACAdAADfBQAgAgAAAIUFACAdAADeBQAgCaMCAQClBAAhsgJAAKYEACHNAgEAvAQAIdECAQC8BAAh1AIBAKUEACHVAgEApQQAIdYCAgCoBAAh1wIBAKUEACHYAgEAvAQAIQoGAADgBQAgowIBAKUEACGyAkAApgQAIc0CAQC8BAAh0QIBALwEACHUAgEApQQAIdUCAQClBAAh1gICAKgEACHXAgEApQQAIdgCAQC8BAAhByQAALgHACAlAAC7BwAg6wIAALkHACDsAgAAugcAIO4CAAAKACDvAgAACgAg8AIAAAwAIAoGAADiBQAgowIBAAAAAbICQAAAAAHNAgEAAAAB0QIBAAAAAdQCAQAAAAHVAgEAAAAB1gICAAAAAdcCAQAAAAHYAgEAAAABAyQAALgHACDrAgAAuQcAIPACAAAMACAHBQAAkQUAIAYAAOwEACCjAgEAAAABsQJAAAAAAcwCAQAAAAHNAgEAAAABzgIBAAAAAQIAAACIAgAgJAAA4wUAIAMAAAAcACAkAADjBQAgJQAA5wUAIAkAAAAcACAFAACQBQAgBgAA6gQAIB0AAOcFACCjAgEApQQAIbECQACmBAAhzAIBAKUEACHNAgEAvAQAIc4CAQC8BAAhBwUAAJAFACAGAADqBAAgowIBAKUEACGxAkAApgQAIcwCAQClBAAhzQIBALwEACHOAgEAvAQAIQUTAAD-BQAgowIBAAAAAb8CAgAAAAHfAgEAAAAB4AIBAAAAAQIAAAAvACAkAAD9BQAgAwAAAC8AICQAAP0FACAlAADyBQAgAR0AALcHADAKDAAAiQQAIBMAAIMEACCgAgAAjgQAMKECAAAtABCiAgAAjgQAMKMCAQAAAAG-AgEA4gMAIb8CAgDoAwAh3wIBAOIDACHgAgEA4gMAIQIAAAAvACAdAADyBQAgAgAAAPAFACAdAADxBQAgCKACAADvBQAwoQIAAPAFABCiAgAA7wUAMKMCAQDiAwAhvgIBAOIDACG_AgIA6AMAId8CAQDiAwAh4AIBAOIDACEIoAIAAO8FADChAgAA8AUAEKICAADvBQAwowIBAOIDACG-AgEA4gMAIb8CAgDoAwAh3wIBAOIDACHgAgEA4gMAIQSjAgEApQQAIb8CAgCoBAAh3wIBAKUEACHgAgEApQQAIQUTAADzBQAgowIBAKUEACG_AgIAqAQAId8CAQClBAAh4AIBAKUEACELEAAAxAQAMCQAAPQFADAlAAD4BQAw6wIAAPUFADDsAgAA9gUAMO0CAAD3BQAg7gIAAMQEADDvAgAAxAQAMPACAADEBAAw8QIAAPkFADDyAgAAxwQAMBAQAACsBAAgowIBAAAAAaQCAQAAAAGmAkAAAAABpwIIAAAAAagCCAAAAAGpAgIAAAABqgICAAAAAasCAgAAAAGsAgIAAAABrQICAAAAAa4CAgAAAAGvAkAAAAABsAJAAAAAAbECQAAAAAGyAkAAAAABAgAAADMAICQAAPwFACADAAAAMwAgJAAA_AUAICUAAPsFACABHQAAtgcAMAIAAAAzACAdAAD7BQAgAgAAAMgEACAdAAD6BQAgD6MCAQClBAAhpAIBAKUEACGmAkAApgQAIacCCACnBAAhqAIIAKcEACGpAgIAqAQAIaoCAgCoBAAhqwICAKgEACGsAgIAqAQAIa0CAgCoBAAhrgICAKgEACGvAkAApgQAIbACQACpBAAhsQJAAKYEACGyAkAApgQAIRAQAACqBAAgowIBAKUEACGkAgEApQQAIaYCQACmBAAhpwIIAKcEACGoAggApwQAIakCAgCoBAAhqgICAKgEACGrAgIAqAQAIawCAgCoBAAhrQICAKgEACGuAgIAqAQAIa8CQACmBAAhsAJAAKkEACGxAkAApgQAIbICQACmBAAhEBAAAKwEACCjAgEAAAABpAIBAAAAAaYCQAAAAAGnAggAAAABqAIIAAAAAakCAgAAAAGqAgIAAAABqwICAAAAAawCAgAAAAGtAgIAAAABrgICAAAAAa8CQAAAAAGwAkAAAAABsQJAAAAAAbICQAAAAAEFEwAA_gUAIKMCAQAAAAG_AgIAAAAB3wIBAAAAAeACAQAAAAEEJAAA9AUAMOsCAAD1BQAw7QIAAPcFACDwAgAAxAQAMAsDAACABgAgDQAAggYAIA4AAIMGACAUAACBBgAgFQAAhAYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQMkAAC0BwAg6wIAALUHACDwAgAAAQAgBCQAAOgFADDrAgAA6QUAMO0CAADrBQAg8AIAAOwFADADJAAA4wUAIOsCAADkBQAg8AIAAIgCACAEJAAA2AUAMOsCAADZBQAw7QIAANsFACDwAgAAgQUAMAQkAADPBQAw6wIAANAFADDtAgAA0gUAIPACAADQBAAwAyQAALIHACDrAgAAswcAIPACAAABACAEJAAAvwUAMOsCAADABQAw7QIAAMIFACDwAgAAwwUAMAQkAADtBAAw6wIAAO4EADDtAgAA8AQAIPACAADxBAAwAyQAAOQEACDrAgAA5QQAIPACAACIAgAgAAAAAAAAAAAAAAAAAAAIAwAAhAcAIAUAAJkGACANAACHBwAgDgAAjgcAIBQAAI8HACAVAACFBwAgwwIAAJ8EACDOAgAAnwQAIAgDAACEBwAgBQAAmQYAIAoAAIwHACALAACNBwAgDQAAhwcAIA4AAI4HACDDAgAAnwQAIM4CAACfBAAgBAMAAIQHACAEAACABwAgDQAAhwcAIA8AAIEHACAAAAAAAAUkAACtBwAgJQAAsAcAIOsCAACuBwAg7AIAAK8HACDwAgAADAAgAyQAAK0HACDrAgAArgcAIPACAAAMACAAAAAAAAAAAAAABSQAAKgHACAlAACrBwAg6wIAAKkHACDsAgAAqgcAIPACAAARACADJAAAqAcAIOsCAACpBwAg8AIAABEAIAAAAAAABSQAAKMHACAlAACmBwAg6wIAAKQHACDsAgAApQcAIPACAAAMACADJAAAowcAIOsCAACkBwAg8AIAAAwAIAAAAAAAByQAAJ4HACAlAAChBwAg6wIAAJ8HACDsAgAAoAcAIO4CAAAHACDvAgAABwAg8AIAAEUAIAMkAACeBwAg6wIAAJ8HACDwAgAARQAgAAAAAAAFJAAAmQcAICUAAJwHACDrAgAAmgcAIOwCAACbBwAg8AIAAAUAIAMkAACZBwAg6wIAAJoHACDwAgAABQAgAAAAAAAHJAAAlAcAICUAAJcHACDrAgAAlQcAIOwCAACWBwAg7gIAAAcAIO8CAAAHACDwAgAARQAgAyQAAJQHACDrAgAAlQcAIPACAABFACAAAAAAAAsQAADDBQAwJAAA8wYAMCUAAPcGADDrAgAA9AYAMOwCAAD1BgAw7QIAAPYGACDuAgAAwwUAMO8CAADDBQAw8AIAAMMFADDxAgAA-AYAMPICAADGBQAwCxAAAPEEADAkAADqBgAwJQAA7gYAMOsCAADrBgAw7AIAAOwGADDtAgAA7QYAIO4CAADxBAAw7wIAAPEEADDwAgAA8QQAMPECAADvBgAw8gIAAPQEADALEAAA4gYAMCQAAN4GADAlAADjBgAw6wIAAN8GADDsAgAA4AYAMO0CAADhBgAg7gIAAOIGADDvAgAA4gYAMPACAADiBgAw8QIAAOQGADDyAgAA5QYAMAsQAADWBgAwJAAA0gYAMCUAANcGADDrAgAA0wYAMOwCAADUBgAw7QIAANUGACDuAgAA1gYAMO8CAADWBgAw8AIAANYGADDxAgAA2AYAMPICAADZBgAwCQQAANkEACARAADaBAAgowIBAAAAAbECQAAAAAGyAkAAAAABvwICAAAAAcICAQAAAAHDAgEAAAABxAICAAAAAQIAAABJACAkAADdBgAgAwAAAEkAICQAAN0GACAlAADcBgAgAR0AAJMHADAOAwAAgQQAIAQAAIIEACARAACDBAAgoAIAAP8DADChAgAARwAQogIAAP8DADCjAgEAAAABsQJAAOMDACGyAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhxAICAOgDACECAAAASQAgHQAA3AYAIAIAAADaBgAgHQAA2wYAIAugAgAA2QYAMKECAADaBgAQogIAANkGADCjAgEA4gMAIbECQADjAwAhsgJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHDAgEAgAQAIcQCAgDoAwAhC6ACAADZBgAwoQIAANoGABCiAgAA2QYAMKMCAQDiAwAhsQJAAOMDACGyAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcMCAQCABAAhxAICAOgDACEHowIBAKUEACGxAkAApgQAIbICQACmBAAhvwICAKgEACHCAgEApQQAIcMCAQC8BAAhxAICAKgEACEJBAAAvgQAIBEAAL8EACCjAgEApQQAIbECQACmBAAhsgJAAKYEACG_AgIAqAQAIcICAQClBAAhwwIBALwEACHEAgIAqAQAIQkEAADZBAAgEQAA2gQAIKMCAQAAAAGxAkAAAAABsgJAAAAAAb8CAgAAAAHCAgEAAAABwwIBAAAAAcQCAgAAAAEIBAAAhgYAIA0AAIgGACAPAACHBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAcUCAQAAAAECAAAARQAgJAAA6QYAIAMAAABFACAkAADpBgAgJQAA6AYAIAEdAACSBwAwDQMAAIEEACAEAAD7AwAgDQAAhQQAIA8AAPwDACCgAgAAhAQAMKECAAAHABCiAgAAhAQAMKMCAQAAAAGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcUCAQDiAwAhAgAAAEUAIB0AAOgGACACAAAA5gYAIB0AAOcGACAJoAIAAOUGADChAgAA5gYAEKICAADlBgAwowIBAOIDACGxAkAA4wMAIb8CAgDoAwAhwQIBAOIDACHCAgEA4gMAIcUCAQDiAwAhCaACAADlBgAwoQIAAOYGABCiAgAA5QYAMKMCAQDiAwAhsQJAAOMDACG_AgIA6AMAIcECAQDiAwAhwgIBAOIDACHFAgEA4gMAIQWjAgEApQQAIbECQACmBAAhvwICAKgEACHCAgEApQQAIcUCAQClBAAhCAQAAOEEACANAADjBAAgDwAA4gQAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcICAQClBAAhxQIBAKUEACEIBAAAhgYAIA0AAIgGACAPAACHBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAcUCAQAAAAELBQAAugYAIAoAALsFACALAAC8BQAgDQAAvQUAIA4AAL4FACCjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAECAAAADAAgJAAA8gYAIAMAAAAMACAkAADyBgAgJQAA8QYAIAEdAACRBwAwAgAAAAwAIB0AAPEGACACAAAA9QQAIB0AAPAGACAGowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhCwUAALkGACAKAAD5BAAgCwAA-gQAIA0AAPsEACAOAAD8BAAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhCwUAALoGACAKAAC7BQAgCwAAvAUAIA0AAL0FACAOAAC-BQAgowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAcMCAQAAAAHOAgEAAAABCwUAAMgGACANAACCBgAgDgAAgwYAIBQAAIEGACAVAACEBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAcMCAQAAAAHOAgEAAAABAgAAAAUAICQAAPsGACADAAAABQAgJAAA-wYAICUAAPoGACABHQAAkAcAMAIAAAAFACAdAAD6BgAgAgAAAMcFACAdAAD5BgAgBqMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQsFAADHBgAgDQAAzAUAIA4AAM0FACAUAADLBQAgFQAAzgUAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQsFAADIBgAgDQAAggYAIA4AAIMGACAUAACBBgAgFQAAhAYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQQkAADzBgAw6wIAAPQGADDtAgAA9gYAIPACAADDBQAwBCQAAOoGADDrAgAA6wYAMO0CAADtBgAg8AIAAPEEADAEJAAA3gYAMOsCAADfBgAw7QIAAOEGACDwAgAA4gYAMAQkAADSBgAw6wIAANMGADDtAgAA1QYAIPACAADWBgAwAAAAAAQEAACABwAgDwAAgQcAIBYAAIIHACAXAACDBwAgAAAGBQAAmQYAIAYAAJgGACAMAACXBgAgvgIAAJ8EACDNAgAAnwQAIM4CAACfBAAgBAMAAIQHACAEAACFBwAgEQAAhgcAIMMCAACfBAAgAgwAAJcGACATAACGBwAgAgYAAJgGACAIAACLBwAgAAAAAAAGowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAcMCAQAAAAHOAgEAAAABBqMCAQAAAAGxAkAAAAABvwICAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQWjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAABxQIBAAAAAQejAgEAAAABsQJAAAAAAbICQAAAAAG_AgIAAAABwgIBAAAAAcMCAQAAAAHEAgIAAAABCQMAAIUGACANAACIBgAgDwAAhwYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABxQIBAAAAAQIAAABFACAkAACUBwAgAwAAAAcAICQAAJQHACAlAACYBwAgCwAAAAcAIAMAAOAEACANAADjBAAgDwAA4gQAIB0AAJgHACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhxQIBAKUEACEJAwAA4AQAIA0AAOMEACAPAADiBAAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcUCAQClBAAhDAMAAIAGACAFAADIBgAgDQAAggYAIA4AAIMGACAVAACEBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQIAAAAFACAkAACZBwAgAwAAAAMAICQAAJkHACAlAACdBwAgDgAAAAMAIAMAAMoFACAFAADHBgAgDQAAzAUAIA4AAM0FACAVAADOBQAgHQAAnQcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhDAMAAMoFACAFAADHBgAgDQAAzAUAIA4AAM0FACAVAADOBQAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEJAwAAhQYAIAQAAIYGACANAACIBgAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHFAgEAAAABAgAAAEUAICQAAJ4HACADAAAABwAgJAAAngcAICUAAKIHACALAAAABwAgAwAA4AQAIAQAAOEEACANAADjBAAgHQAAogcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHFAgEApQQAIQkDAADgBAAgBAAA4QQAIA0AAOMEACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhxQIBAKUEACEMAwAAugUAIAUAALoGACALAAC8BQAgDQAAvQUAIA4AAL4FACCjAgEAAAABsQJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHOAgEAAAABAgAAAAwAICQAAKMHACADAAAACgAgJAAAowcAICUAAKcHACAOAAAACgAgAwAA-AQAIAUAALkGACALAAD6BAAgDQAA-wQAIA4AAPwEACAdAACnBwAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEMAwAA-AQAIAUAALkGACALAAD6BAAgDQAA-wQAIA4AAPwEACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQgGAACzBgAgowIBAAAAAb8CAgAAAAHFAgEAAAABzQIBAAAAAdwCAQAAAAHdAgEAAAAB3gIBAAAAAQIAAAARACAkAACoBwAgAwAAAA8AICQAAKgHACAlAACsBwAgCgAAAA8AIAYAALIGACAdAACsBwAgowIBAKUEACG_AgIAqAQAIcUCAQClBAAhzQIBAKUEACHcAgEApQQAId0CAQClBAAh3gIBAKUEACEIBgAAsgYAIKMCAQClBAAhvwICAKgEACHFAgEApQQAIc0CAQClBAAh3AIBAKUEACHdAgEApQQAId4CAQClBAAhDAMAALoFACAFAAC6BgAgCgAAuwUAIA0AAL0FACAOAAC-BQAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQIAAAAMACAkAACtBwAgAwAAAAoAICQAAK0HACAlAACxBwAgDgAAAAoAIAMAAPgEACAFAAC5BgAgCgAA-QQAIA0AAPsEACAOAAD8BAAgHQAAsQcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhDAMAAPgEACAFAAC5BgAgCgAA-QQAIA0AAPsEACAOAAD8BAAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEIBAAA_AYAIA8AAP0GACAXAAD_BgAgowIBAAAAAbECQAAAAAG_AgIAAAABwgIBAAAAAeECAQAAAAECAAAAAQAgJAAAsgcAIAgPAAD9BgAgFgAA_gYAIBcAAP8GACCjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAAB4QIBAAAAAQIAAAABACAkAAC0BwAgD6MCAQAAAAGkAgEAAAABpgJAAAAAAacCCAAAAAGoAggAAAABqQICAAAAAaoCAgAAAAGrAgIAAAABrAICAAAAAa0CAgAAAAGuAgIAAAABrwJAAAAAAbACQAAAAAGxAkAAAAABsgJAAAAAAQSjAgEAAAABvwICAAAAAd8CAQAAAAHgAgEAAAABDAMAALoFACAFAAC6BgAgCgAAuwUAIAsAALwFACANAAC9BQAgowIBAAAAAbECQAAAAAG_AgIAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABzgIBAAAAAQIAAAAMACAkAAC4BwAgAwAAAAoAICQAALgHACAlAAC8BwAgDgAAAAoAIAMAAPgEACAFAAC5BgAgCgAA-QQAIAsAAPoEACANAAD7BAAgHQAAvAcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhDAMAAPgEACAFAAC5BgAgCgAA-QQAIAsAAPoEACANAAD7BAAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEJowIBAAAAAbICQAAAAAHNAgEAAAAB0QIBAAAAAdQCAQAAAAHVAgEAAAAB1gICAAAAAdcCAQAAAAHYAgEAAAABA6QCAQAAAAG_AgIAAAABwAJAAAAAAQMAAABQACAkAAC0BwAgJQAAwQcAIAoAAABQACAPAADPBgAgFgAA0AYAIBcAANEGACAdAADBBwAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQgPAADPBgAgFgAA0AYAIBcAANEGACCjAgEApQQAIbECQACmBAAhvwICAKgEACHCAgEApQQAIeECAQClBAAhBqMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQgEAAD8BgAgFgAA_gYAIBcAAP8GACCjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAAB4QIBAAAAAQIAAAABACAkAADDBwAgBKMCAQAAAAG_AgIAAAAB2gIBAAAAAdsCIAAAAAEGowIBAAAAAb8CAgAAAAHFAgEAAAAB3AIBAAAAAd0CAQAAAAHeAgEAAAABBqMCAQAAAAHPAggAAAAB0AICAAAAAdECAQAAAAHSAiAAAAAB0wJAAAAAAQkDAACFBgAgBAAAhgYAIA8AAIcGACCjAgEAAAABsQJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcUCAQAAAAECAAAARQAgJAAAyAcAIAMAAAAHACAkAADIBwAgJQAAzAcAIAsAAAAHACADAADgBAAgBAAA4QQAIA8AAOIEACAdAADMBwAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcUCAQClBAAhCQMAAOAEACAEAADhBAAgDwAA4gQAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHFAgEApQQAIQwDAACABgAgBQAAyAYAIA0AAIIGACAUAACBBgAgFQAAhAYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAECAAAABQAgJAAAzQcAIAMAAAADACAkAADNBwAgJQAA0QcAIA4AAAADACADAADKBQAgBQAAxwYAIA0AAMwFACAUAADLBQAgFQAAzgUAIB0AANEHACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQwDAADKBQAgBQAAxwYAIA0AAMwFACAUAADLBQAgFQAAzgUAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhCaMCAQAAAAGyAkAAAAABvgIBAAAAAdECAQAAAAHUAgEAAAAB1QIBAAAAAdYCAgAAAAHXAgEAAAAB2AIBAAAAAQMAAABQACAkAADDBwAgJQAA1QcAIAoAAABQACAEAADOBgAgFgAA0AYAIBcAANEGACAdAADVBwAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQgEAADOBgAgFgAA0AYAIBcAANEGACCjAgEApQQAIbECQACmBAAhvwICAKgEACHCAgEApQQAIeECAQClBAAhBqMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQwDAAC6BQAgBQAAugYAIAoAALsFACALAAC8BQAgDgAAvgUAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAECAAAADAAgJAAA1wcAIAwDAACABgAgBQAAyAYAIA4AAIMGACAUAACBBgAgFQAAhAYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAECAAAABQAgJAAA2QcAIAMAAAAKACAkAADXBwAgJQAA3QcAIA4AAAAKACADAAD4BAAgBQAAuQYAIAoAAPkEACALAAD6BAAgDgAA_AQAIB0AAN0HACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQwDAAD4BAAgBQAAuQYAIAoAAPkEACALAAD6BAAgDgAA_AQAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhAwAAAAMAICQAANkHACAlAADgBwAgDgAAAAMAIAMAAMoFACAFAADHBgAgDgAAzQUAIBQAAMsFACAVAADOBQAgHQAA4AcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIc4CAQC8BAAhDAMAAMoFACAFAADHBgAgDgAAzQUAIBQAAMsFACAVAADOBQAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEDAAAAUAAgJAAAsgcAICUAAOMHACAKAAAAUAAgBAAAzgYAIA8AAM8GACAXAADRBgAgHQAA4wcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcICAQClBAAh4QIBAKUEACEIBAAAzgYAIA8AAM8GACAXAADRBgAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQgEAAD8BgAgDwAA_QYAIBYAAP4GACCjAgEAAAABsQJAAAAAAb8CAgAAAAHCAgEAAAAB4QIBAAAAAQIAAAABACAkAADkBwAgA74CAQAAAAG_AgIAAAABwAJAAAAAAQ-jAgEAAAABpQIBAAAAAaYCQAAAAAGnAggAAAABqAIIAAAAAakCAgAAAAGqAgIAAAABqwICAAAAAawCAgAAAAGtAgIAAAABrgICAAAAAa8CQAAAAAGwAkAAAAABsQJAAAAAAbICQAAAAAEDAAAAUAAgJAAA5AcAICUAAOoHACAKAAAAUAAgBAAAzgYAIA8AAM8GACAWAADQBgAgHQAA6gcAIKMCAQClBAAhsQJAAKYEACG_AgIAqAQAIcICAQClBAAh4QIBAKUEACEIBAAAzgYAIA8AAM8GACAWAADQBgAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwgIBAKUEACHhAgEApQQAIQwDAACABgAgBQAAyAYAIA0AAIIGACAOAACDBgAgFAAAgQYAIKMCAQAAAAGxAkAAAAABvwICAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAc4CAQAAAAECAAAABQAgJAAA6wcAIAoDAADYBAAgEQAA2gQAIKMCAQAAAAGxAkAAAAABsgJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgIAAAABAgAAAEkAICQAAO0HACADAAAAAwAgJAAA6wcAICUAAPEHACAOAAAAAwAgAwAAygUAIAUAAMcGACANAADMBQAgDgAAzQUAIBQAAMsFACAdAADxBwAgowIBAKUEACGxAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhzgIBALwEACEMAwAAygUAIAUAAMcGACANAADMBQAgDgAAzQUAIBQAAMsFACCjAgEApQQAIbECQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHOAgEAvAQAIQMAAABHACAkAADtBwAgJQAA9AcAIAwAAABHACADAAC9BAAgEQAAvwQAIB0AAPQHACCjAgEApQQAIbECQACmBAAhsgJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIcQCAgCoBAAhCgMAAL0EACARAAC_BAAgowIBAKUEACGxAkAApgQAIbICQACmBAAhvwICAKgEACHBAgEApQQAIcICAQClBAAhwwIBALwEACHEAgIAqAQAIQYMAADBBgAgowIBAAAAAb4CAQAAAAG_AgIAAAAB3wIBAAAAAeACAQAAAAECAAAALwAgJAAA9QcAIAoDAADYBAAgBAAA2QQAIKMCAQAAAAGxAkAAAAABsgJAAAAAAb8CAgAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgIAAAABAgAAAEkAICQAAPcHACADAAAALQAgJAAA9QcAICUAAPsHACAIAAAALQAgDAAAwAYAIB0AAPsHACCjAgEApQQAIb4CAQClBAAhvwICAKgEACHfAgEApQQAIeACAQClBAAhBgwAAMAGACCjAgEApQQAIb4CAQClBAAhvwICAKgEACHfAgEApQQAIeACAQClBAAhAwAAAEcAICQAAPcHACAlAAD-BwAgDAAAAEcAIAMAAL0EACAEAAC-BAAgHQAA_gcAIKMCAQClBAAhsQJAAKYEACGyAkAApgQAIb8CAgCoBAAhwQIBAKUEACHCAgEApQQAIcMCAQC8BAAhxAICAKgEACEKAwAAvQQAIAQAAL4EACCjAgEApQQAIbECQACmBAAhsgJAAKYEACG_AgIAqAQAIcECAQClBAAhwgIBAKUEACHDAgEAvAQAIcQCAgCoBAAhBQQGAgkAFA9DBBZGAxdKDwcDAAEFCAMJABMNPQkOPgoUMA0VPxAFAwABBAkCCQAMDSoJDw0EBwMAAQUOAwkACwoSBQsbCA0dCQ4kCgMGAAQIFgYJAAcBBwAFAQgXAAEGAAQDBSADBh8EDB4CAgYmBAwlAgMKJwALKAAOKQACBCsADywAAwkAEgwAAhM0DgIQAA8SAA0EAwABBDgQCQARETkOAgwAAhAADwIEOgAROwABEzwAAw5BABRAABVCAAQESwAPTAAWTQAXTgAAAAAFCQAZKgAaKwAbLAAcLQAdAAAAAAAFCQAZKgAaKwAbLAAcLQAdAgMAAQVwAwIDAAEFdgMFCQAiKgAjKwAkLAAlLQAmAAAAAAAFCQAiKgAjKwAkLAAlLQAmAQwAAgEMAAIFCQArKgAsKwAtLAAuLQAvAAAAAAAFCQArKgAsKwAtLAAuLQAvAgMAAQWeAQMCAwABBaQBAwUJADQqADUrADYsADctADgAAAAAAAUJADQqADUrADYsADctADgBBgAEAQYABAUJAD0qAD4rAD8sAEAtAEEAAAAAAAUJAD0qAD4rAD8sAEAtAEEBBwAFAQcABQUJAEYqAEcrAEgsAEktAEoAAAAAAAUJAEYqAEcrAEgsAEktAEoCBuMBBAziAQICBuoBBAzpAQIFCQBPKgBQKwBRLABSLQBTAAAAAAAFCQBPKgBQKwBRLABSLQBTAQYABAEGAAQFCQBYKgBZKwBaLABbLQBcAAAAAAAFCQBYKgBZKwBaLABbLQBcAwWWAgMGlQIEDJQCAgMFngIDBp0CBAycAgIDCQBhLABiLQBjAAAAAwkAYSwAYi0AYwAAAAUJAGkqAGorAGssAGwtAG0AAAAAAAUJAGkqAGorAGssAGwtAG0AAAADCQBzLAB0LQB1AAAAAwkAcywAdC0AdQAAAAMJAHssAHwtAH0AAAADCQB7LAB8LQB9AQMAAQEDAAEFCQCCASoAgwErAIQBLACFAS0AhgEAAAAAAAUJAIIBKgCDASsAhAEsAIUBLQCGAQEDAAEBAwABBQkAiwEqAIwBKwCNASwAjgEtAI8BAAAAAAAFCQCLASoAjAErAI0BLACOAS0AjwECDAACEAAPAgwAAhAADwUJAJQBKgCVASsAlgEsAJcBLQCYAQAAAAAABQkAlAEqAJUBKwCWASwAlwEtAJgBAhAADxIADQIQAA8SAA0FCQCdASoAngErAJ8BLACgAS0AoQEAAAAAAAUJAJ0BKgCeASsAnwEsAKABLQChARgCARlPARpSARtTARxUAR5WAR9YFSBZFiFbASJdFSNeFyZfASdgAShhFS5kGC9lHjBmAjFnAjJoAjNpAjRqAjVsAjZuFTdvHzhyAjl0FTp1IDt3Ajx4Aj15FT58IT99J0B-DUF_DUKAAQ1DgQENRIIBDUWEAQ1GhgEVR4cBKEiJAQ1JiwEVSowBKUuNAQ1MjgENTY8BFU6SASpPkwEwUJQBBFGVAQRSlgEEU5cBBFSYAQRVmgEEVpwBFVedATFYoAEEWaIBFVqjATJbpQEEXKYBBF2nARVeqgEzX6sBOWCsAQVhrQEFYq4BBWOvAQVksAEFZbIBBWa0ARVntQE6aLcBBWm5ARVqugE7a7sBBWy8AQVtvQEVbsABPG_BAUJwwgEGccMBBnLEAQZzxQEGdMYBBnXIAQZ2ygEVd8sBQ3jNAQZ5zwEVetABRHvRAQZ80gEGfdMBFX7WAUV_1wFLgAHYAQqBAdkBCoIB2gEKgwHbAQqEAdwBCoUB3gEKhgHgARWHAeEBTIgB5QEKiQHnARWKAegBTYsB6wEKjAHsAQqNAe0BFY4B8AFOjwHxAVSQAfIBCJEB8wEIkgH0AQiTAfUBCJQB9gEIlQH4AQiWAfoBFZcB-wFVmAH9AQiZAf8BFZoBgAJWmwGBAgicAYICCJ0BgwIVngGGAlefAYcCXaABiQIJoQGKAgmiAYwCCaMBjQIJpAGOAgmlAZACCaYBkgIVpwGTAl6oAZgCCakBmgIVqgGbAl-rAZ8CCawBoAIJrQGhAhWuAaQCYK8BpQJksAGnAmWxAagCZbIBqwJlswGsAmW0Aa0CZbUBrwJltgGxAhW3AbICZrgBtAJluQG2AhW6AbcCZ7sBuAJlvAG5AmW9AboCFb4BvQJovwG-Am7AAcACb8EBwQJvwgHEAm_DAcUCb8QBxgJvxQHIAm_GAcoCFccBywJwyAHNAm_JAc8CFcoB0AJxywHRAm_MAdICb80B0wIVzgHWAnLPAdcCdtAB2QJ30QHaAnfSAd0Cd9MB3gJ31AHfAnfVAeECd9YB4wIV1wHkAnjYAeYCd9kB6AIV2gHpAnnbAeoCd9wB6wJ33QHsAhXeAe8Cet8B8AJ-4AHxAgPhAfICA-IB8wID4wH0AgPkAfUCA-UB9wID5gH5AhXnAfoCf-gB_AID6QH-AhXqAf8CgAHrAYADA-wBgQMD7QGCAxXuAYUDgQHvAYYDhwHwAYcDD_EBiAMP8gGJAw_zAYoDD_QBiwMP9QGNAw_2AY8DFfcBkAOIAfgBkgMP-QGUAxX6AZUDiQH7AZYDD_wBlwMP_QGYAxX-AZsDigH_AZwDkAGAAp0DEIECngMQggKfAxCDAqADEIQCoQMQhQKjAxCGAqUDFYcCpgORAYgCqAMQiQKqAxWKAqsDkgGLAqwDEIwCrQMQjQKuAxWOArEDkwGPArIDmQGQArMDDpECtAMOkgK1Aw6TArYDDpQCtwMOlQK5Aw6WArsDFZcCvAOaAZgCvgMOmQLAAxWaAsEDmwGbAsIDDpwCwwMOnQLEAxWeAscDnAGfAsgDogE"
}
async function decodeBase64AsWasm(wasmBase64: string): Promise {
@@ -317,6 +317,36 @@ export interface PrismaClient<
* ```
*/
get materialGroup(): Prisma.MaterialGroupDelegate;
+
+ /**
+ * `prisma.spacedRepetitionSet`: Exposes CRUD operations for the **SpacedRepetitionSet** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more SpacedRepetitionSets
+ * const spacedRepetitionSets = await prisma.spacedRepetitionSet.findMany()
+ * ```
+ */
+ get spacedRepetitionSet(): Prisma.SpacedRepetitionSetDelegate;
+
+ /**
+ * `prisma.spacedRepetitionSetDeck`: Exposes CRUD operations for the **SpacedRepetitionSetDeck** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more SpacedRepetitionSetDecks
+ * const spacedRepetitionSetDecks = await prisma.spacedRepetitionSetDeck.findMany()
+ * ```
+ */
+ get spacedRepetitionSetDeck(): Prisma.SpacedRepetitionSetDeckDelegate;
+
+ /**
+ * `prisma.spacedRepetitionCardState`: Exposes CRUD operations for the **SpacedRepetitionCardState** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more SpacedRepetitionCardStates
+ * const spacedRepetitionCardStates = await prisma.spacedRepetitionCardState.findMany()
+ * ```
+ */
+ get spacedRepetitionCardState(): Prisma.SpacedRepetitionCardStateDelegate;
}
export function getPrismaClientClass(): PrismaClientConstructor {
diff --git a/src/generated/prisma/internal/prismaNamespace.ts b/src/generated/prisma/internal/prismaNamespace.ts
index 7f2be5f..def2789 100644
--- a/src/generated/prisma/internal/prismaNamespace.ts
+++ b/src/generated/prisma/internal/prismaNamespace.ts
@@ -396,7 +396,10 @@ export const ModelName = {
AuthSecurity: 'AuthSecurity',
Setting: 'Setting',
StudyActivity: 'StudyActivity',
- MaterialGroup: 'MaterialGroup'
+ MaterialGroup: 'MaterialGroup',
+ SpacedRepetitionSet: 'SpacedRepetitionSet',
+ SpacedRepetitionSetDeck: 'SpacedRepetitionSetDeck',
+ SpacedRepetitionCardState: 'SpacedRepetitionCardState'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -412,7 +415,7 @@ export type TypeMap
+ fields: Prisma.SpacedRepetitionSetFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.SpacedRepetitionSetFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.SpacedRepetitionSetFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.SpacedRepetitionSetFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.SpacedRepetitionSetFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.SpacedRepetitionSetFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.SpacedRepetitionSetCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.SpacedRepetitionSetCreateManyArgs
+ result: BatchPayload
+ }
+ createManyAndReturn: {
+ args: Prisma.SpacedRepetitionSetCreateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ delete: {
+ args: Prisma.SpacedRepetitionSetDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.SpacedRepetitionSetUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.SpacedRepetitionSetDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.SpacedRepetitionSetUpdateManyArgs
+ result: BatchPayload
+ }
+ updateManyAndReturn: {
+ args: Prisma.SpacedRepetitionSetUpdateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ upsert: {
+ args: Prisma.SpacedRepetitionSetUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.SpacedRepetitionSetAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.SpacedRepetitionSetGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.SpacedRepetitionSetCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ SpacedRepetitionSetDeck: {
+ payload: Prisma.$SpacedRepetitionSetDeckPayload
+ fields: Prisma.SpacedRepetitionSetDeckFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.SpacedRepetitionSetDeckFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.SpacedRepetitionSetDeckFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.SpacedRepetitionSetDeckFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.SpacedRepetitionSetDeckFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.SpacedRepetitionSetDeckFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.SpacedRepetitionSetDeckCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.SpacedRepetitionSetDeckCreateManyArgs
+ result: BatchPayload
+ }
+ createManyAndReturn: {
+ args: Prisma.SpacedRepetitionSetDeckCreateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ delete: {
+ args: Prisma.SpacedRepetitionSetDeckDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.SpacedRepetitionSetDeckUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.SpacedRepetitionSetDeckDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.SpacedRepetitionSetDeckUpdateManyArgs
+ result: BatchPayload
+ }
+ updateManyAndReturn: {
+ args: Prisma.SpacedRepetitionSetDeckUpdateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ upsert: {
+ args: Prisma.SpacedRepetitionSetDeckUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.SpacedRepetitionSetDeckAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.SpacedRepetitionSetDeckGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.SpacedRepetitionSetDeckCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ SpacedRepetitionCardState: {
+ payload: Prisma.$SpacedRepetitionCardStatePayload
+ fields: Prisma.SpacedRepetitionCardStateFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.SpacedRepetitionCardStateFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.SpacedRepetitionCardStateFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.SpacedRepetitionCardStateFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.SpacedRepetitionCardStateFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.SpacedRepetitionCardStateFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.SpacedRepetitionCardStateCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.SpacedRepetitionCardStateCreateManyArgs
+ result: BatchPayload
+ }
+ createManyAndReturn: {
+ args: Prisma.SpacedRepetitionCardStateCreateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ delete: {
+ args: Prisma.SpacedRepetitionCardStateDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.SpacedRepetitionCardStateUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.SpacedRepetitionCardStateDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.SpacedRepetitionCardStateUpdateManyArgs
+ result: BatchPayload
+ }
+ updateManyAndReturn: {
+ args: Prisma.SpacedRepetitionCardStateUpdateManyAndReturnArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ upsert: {
+ args: Prisma.SpacedRepetitionCardStateUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.SpacedRepetitionCardStateAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.SpacedRepetitionCardStateGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.SpacedRepetitionCardStateCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
}
} & {
other: {
@@ -1566,6 +1791,52 @@ export const MaterialGroupScalarFieldEnum = {
export type MaterialGroupScalarFieldEnum = (typeof MaterialGroupScalarFieldEnum)[keyof typeof MaterialGroupScalarFieldEnum]
+export const SpacedRepetitionSetScalarFieldEnum = {
+ id: 'id',
+ classId: 'classId',
+ name: 'name',
+ description: 'description',
+ newCardsPerDay: 'newCardsPerDay',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type SpacedRepetitionSetScalarFieldEnum = (typeof SpacedRepetitionSetScalarFieldEnum)[keyof typeof SpacedRepetitionSetScalarFieldEnum]
+
+
+export const SpacedRepetitionSetDeckScalarFieldEnum = {
+ setId: 'setId',
+ deckId: 'deckId',
+ sortOrder: 'sortOrder',
+ addedAt: 'addedAt'
+} as const
+
+export type SpacedRepetitionSetDeckScalarFieldEnum = (typeof SpacedRepetitionSetDeckScalarFieldEnum)[keyof typeof SpacedRepetitionSetDeckScalarFieldEnum]
+
+
+export const SpacedRepetitionCardStateScalarFieldEnum = {
+ id: 'id',
+ setId: 'setId',
+ flashcardId: 'flashcardId',
+ due: 'due',
+ stability: 'stability',
+ difficulty: 'difficulty',
+ elapsedDays: 'elapsedDays',
+ scheduledDays: 'scheduledDays',
+ learningSteps: 'learningSteps',
+ reps: 'reps',
+ lapses: 'lapses',
+ state: 'state',
+ firstReviewedAt: 'firstReviewedAt',
+ lastReview: 'lastReview',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type SpacedRepetitionCardStateScalarFieldEnum = (typeof SpacedRepetitionCardStateScalarFieldEnum)[keyof typeof SpacedRepetitionCardStateScalarFieldEnum]
+
+
export const SortOrder = {
asc: 'asc',
desc: 'desc'
@@ -1745,6 +2016,9 @@ export type GlobalOmitConfig = {
setting?: Prisma.SettingOmit
studyActivity?: Prisma.StudyActivityOmit
materialGroup?: Prisma.MaterialGroupOmit
+ spacedRepetitionSet?: Prisma.SpacedRepetitionSetOmit
+ spacedRepetitionSetDeck?: Prisma.SpacedRepetitionSetDeckOmit
+ spacedRepetitionCardState?: Prisma.SpacedRepetitionCardStateOmit
}
/* Types for Logging */
diff --git a/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/generated/prisma/internal/prismaNamespaceBrowser.ts
index 7b45804..fcba065 100644
--- a/src/generated/prisma/internal/prismaNamespaceBrowser.ts
+++ b/src/generated/prisma/internal/prismaNamespaceBrowser.ts
@@ -63,7 +63,10 @@ export const ModelName = {
AuthSecurity: 'AuthSecurity',
Setting: 'Setting',
StudyActivity: 'StudyActivity',
- MaterialGroup: 'MaterialGroup'
+ MaterialGroup: 'MaterialGroup',
+ SpacedRepetitionSet: 'SpacedRepetitionSet',
+ SpacedRepetitionSetDeck: 'SpacedRepetitionSetDeck',
+ SpacedRepetitionCardState: 'SpacedRepetitionCardState'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -231,6 +234,52 @@ export const MaterialGroupScalarFieldEnum = {
export type MaterialGroupScalarFieldEnum = (typeof MaterialGroupScalarFieldEnum)[keyof typeof MaterialGroupScalarFieldEnum]
+export const SpacedRepetitionSetScalarFieldEnum = {
+ id: 'id',
+ classId: 'classId',
+ name: 'name',
+ description: 'description',
+ newCardsPerDay: 'newCardsPerDay',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type SpacedRepetitionSetScalarFieldEnum = (typeof SpacedRepetitionSetScalarFieldEnum)[keyof typeof SpacedRepetitionSetScalarFieldEnum]
+
+
+export const SpacedRepetitionSetDeckScalarFieldEnum = {
+ setId: 'setId',
+ deckId: 'deckId',
+ sortOrder: 'sortOrder',
+ addedAt: 'addedAt'
+} as const
+
+export type SpacedRepetitionSetDeckScalarFieldEnum = (typeof SpacedRepetitionSetDeckScalarFieldEnum)[keyof typeof SpacedRepetitionSetDeckScalarFieldEnum]
+
+
+export const SpacedRepetitionCardStateScalarFieldEnum = {
+ id: 'id',
+ setId: 'setId',
+ flashcardId: 'flashcardId',
+ due: 'due',
+ stability: 'stability',
+ difficulty: 'difficulty',
+ elapsedDays: 'elapsedDays',
+ scheduledDays: 'scheduledDays',
+ learningSteps: 'learningSteps',
+ reps: 'reps',
+ lapses: 'lapses',
+ state: 'state',
+ firstReviewedAt: 'firstReviewedAt',
+ lastReview: 'lastReview',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type SpacedRepetitionCardStateScalarFieldEnum = (typeof SpacedRepetitionCardStateScalarFieldEnum)[keyof typeof SpacedRepetitionCardStateScalarFieldEnum]
+
+
export const SortOrder = {
asc: 'asc',
desc: 'desc'
diff --git a/src/generated/prisma/models.ts b/src/generated/prisma/models.ts
index b7bcb19..a499c10 100644
--- a/src/generated/prisma/models.ts
+++ b/src/generated/prisma/models.ts
@@ -21,4 +21,7 @@ export type * from './models/AuthSecurity'
export type * from './models/Setting'
export type * from './models/StudyActivity'
export type * from './models/MaterialGroup'
+export type * from './models/SpacedRepetitionSet'
+export type * from './models/SpacedRepetitionSetDeck'
+export type * from './models/SpacedRepetitionCardState'
export type * from './commonInputTypes'
\ No newline at end of file
diff --git a/src/generated/prisma/models/Class.ts b/src/generated/prisma/models/Class.ts
index 1fb089c..61db3ea 100644
--- a/src/generated/prisma/models/Class.ts
+++ b/src/generated/prisma/models/Class.ts
@@ -219,6 +219,7 @@ export type ClassWhereInput = {
decks?: Prisma.DeckListRelationFilter
quizSets?: Prisma.QuizSetListRelationFilter
materialGroups?: Prisma.MaterialGroupListRelationFilter
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetListRelationFilter
}
export type ClassOrderByWithRelationInput = {
@@ -230,6 +231,7 @@ export type ClassOrderByWithRelationInput = {
decks?: Prisma.DeckOrderByRelationAggregateInput
quizSets?: Prisma.QuizSetOrderByRelationAggregateInput
materialGroups?: Prisma.MaterialGroupOrderByRelationAggregateInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetOrderByRelationAggregateInput
}
export type ClassWhereUniqueInput = Prisma.AtLeast<{
@@ -244,6 +246,7 @@ export type ClassWhereUniqueInput = Prisma.AtLeast<{
decks?: Prisma.DeckListRelationFilter
quizSets?: Prisma.QuizSetListRelationFilter
materialGroups?: Prisma.MaterialGroupListRelationFilter
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetListRelationFilter
}, "id" | "slug">
export type ClassOrderByWithAggregationInput = {
@@ -279,6 +282,7 @@ export type ClassCreateInput = {
decks?: Prisma.DeckCreateNestedManyWithoutClassInput
quizSets?: Prisma.QuizSetCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetCreateNestedManyWithoutClassInput
}
export type ClassUncheckedCreateInput = {
@@ -290,6 +294,7 @@ export type ClassUncheckedCreateInput = {
decks?: Prisma.DeckUncheckedCreateNestedManyWithoutClassInput
quizSets?: Prisma.QuizSetUncheckedCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupUncheckedCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedCreateNestedManyWithoutClassInput
}
export type ClassUpdateInput = {
@@ -301,6 +306,7 @@ export type ClassUpdateInput = {
decks?: Prisma.DeckUpdateManyWithoutClassNestedInput
quizSets?: Prisma.QuizSetUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUpdateManyWithoutClassNestedInput
}
export type ClassUncheckedUpdateInput = {
@@ -312,6 +318,7 @@ export type ClassUncheckedUpdateInput = {
decks?: Prisma.DeckUncheckedUpdateManyWithoutClassNestedInput
quizSets?: Prisma.QuizSetUncheckedUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUncheckedUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedUpdateManyWithoutClassNestedInput
}
export type ClassCreateManyInput = {
@@ -433,6 +440,20 @@ export type ClassUpdateOneRequiredWithoutMaterialGroupsNestedInput = {
update?: Prisma.XOR, Prisma.ClassUncheckedUpdateWithoutMaterialGroupsInput>
}
+export type ClassCreateNestedOneWithoutSpacedRepetitionSetsInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.ClassCreateOrConnectWithoutSpacedRepetitionSetsInput
+ connect?: Prisma.ClassWhereUniqueInput
+}
+
+export type ClassUpdateOneRequiredWithoutSpacedRepetitionSetsNestedInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.ClassCreateOrConnectWithoutSpacedRepetitionSetsInput
+ upsert?: Prisma.ClassUpsertWithoutSpacedRepetitionSetsInput
+ connect?: Prisma.ClassWhereUniqueInput
+ update?: Prisma.XOR, Prisma.ClassUncheckedUpdateWithoutSpacedRepetitionSetsInput>
+}
+
export type ClassCreateWithoutDecksInput = {
id?: string
slug: string
@@ -441,6 +462,7 @@ export type ClassCreateWithoutDecksInput = {
createdAt?: Date | string
quizSets?: Prisma.QuizSetCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetCreateNestedManyWithoutClassInput
}
export type ClassUncheckedCreateWithoutDecksInput = {
@@ -451,6 +473,7 @@ export type ClassUncheckedCreateWithoutDecksInput = {
createdAt?: Date | string
quizSets?: Prisma.QuizSetUncheckedCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupUncheckedCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedCreateNestedManyWithoutClassInput
}
export type ClassCreateOrConnectWithoutDecksInput = {
@@ -477,6 +500,7 @@ export type ClassUpdateWithoutDecksInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
quizSets?: Prisma.QuizSetUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUpdateManyWithoutClassNestedInput
}
export type ClassUncheckedUpdateWithoutDecksInput = {
@@ -487,6 +511,7 @@ export type ClassUncheckedUpdateWithoutDecksInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
quizSets?: Prisma.QuizSetUncheckedUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUncheckedUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedUpdateManyWithoutClassNestedInput
}
export type ClassCreateWithoutQuizSetsInput = {
@@ -497,6 +522,7 @@ export type ClassCreateWithoutQuizSetsInput = {
createdAt?: Date | string
decks?: Prisma.DeckCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetCreateNestedManyWithoutClassInput
}
export type ClassUncheckedCreateWithoutQuizSetsInput = {
@@ -507,6 +533,7 @@ export type ClassUncheckedCreateWithoutQuizSetsInput = {
createdAt?: Date | string
decks?: Prisma.DeckUncheckedCreateNestedManyWithoutClassInput
materialGroups?: Prisma.MaterialGroupUncheckedCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedCreateNestedManyWithoutClassInput
}
export type ClassCreateOrConnectWithoutQuizSetsInput = {
@@ -533,6 +560,7 @@ export type ClassUpdateWithoutQuizSetsInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
decks?: Prisma.DeckUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUpdateManyWithoutClassNestedInput
}
export type ClassUncheckedUpdateWithoutQuizSetsInput = {
@@ -543,6 +571,7 @@ export type ClassUncheckedUpdateWithoutQuizSetsInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
decks?: Prisma.DeckUncheckedUpdateManyWithoutClassNestedInput
materialGroups?: Prisma.MaterialGroupUncheckedUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedUpdateManyWithoutClassNestedInput
}
export type ClassCreateWithoutMaterialGroupsInput = {
@@ -553,6 +582,7 @@ export type ClassCreateWithoutMaterialGroupsInput = {
createdAt?: Date | string
decks?: Prisma.DeckCreateNestedManyWithoutClassInput
quizSets?: Prisma.QuizSetCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetCreateNestedManyWithoutClassInput
}
export type ClassUncheckedCreateWithoutMaterialGroupsInput = {
@@ -563,6 +593,7 @@ export type ClassUncheckedCreateWithoutMaterialGroupsInput = {
createdAt?: Date | string
decks?: Prisma.DeckUncheckedCreateNestedManyWithoutClassInput
quizSets?: Prisma.QuizSetUncheckedCreateNestedManyWithoutClassInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedCreateNestedManyWithoutClassInput
}
export type ClassCreateOrConnectWithoutMaterialGroupsInput = {
@@ -589,6 +620,7 @@ export type ClassUpdateWithoutMaterialGroupsInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
decks?: Prisma.DeckUpdateManyWithoutClassNestedInput
quizSets?: Prisma.QuizSetUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUpdateManyWithoutClassNestedInput
}
export type ClassUncheckedUpdateWithoutMaterialGroupsInput = {
@@ -599,6 +631,67 @@ export type ClassUncheckedUpdateWithoutMaterialGroupsInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
decks?: Prisma.DeckUncheckedUpdateManyWithoutClassNestedInput
quizSets?: Prisma.QuizSetUncheckedUpdateManyWithoutClassNestedInput
+ spacedRepetitionSets?: Prisma.SpacedRepetitionSetUncheckedUpdateManyWithoutClassNestedInput
+}
+
+export type ClassCreateWithoutSpacedRepetitionSetsInput = {
+ id?: string
+ slug: string
+ name: string
+ sortOrder?: number
+ createdAt?: Date | string
+ decks?: Prisma.DeckCreateNestedManyWithoutClassInput
+ quizSets?: Prisma.QuizSetCreateNestedManyWithoutClassInput
+ materialGroups?: Prisma.MaterialGroupCreateNestedManyWithoutClassInput
+}
+
+export type ClassUncheckedCreateWithoutSpacedRepetitionSetsInput = {
+ id?: string
+ slug: string
+ name: string
+ sortOrder?: number
+ createdAt?: Date | string
+ decks?: Prisma.DeckUncheckedCreateNestedManyWithoutClassInput
+ quizSets?: Prisma.QuizSetUncheckedCreateNestedManyWithoutClassInput
+ materialGroups?: Prisma.MaterialGroupUncheckedCreateNestedManyWithoutClassInput
+}
+
+export type ClassCreateOrConnectWithoutSpacedRepetitionSetsInput = {
+ where: Prisma.ClassWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type ClassUpsertWithoutSpacedRepetitionSetsInput = {
+ update: Prisma.XOR
+ create: Prisma.XOR
+ where?: Prisma.ClassWhereInput
+}
+
+export type ClassUpdateToOneWithWhereWithoutSpacedRepetitionSetsInput = {
+ where?: Prisma.ClassWhereInput
+ data: Prisma.XOR
+}
+
+export type ClassUpdateWithoutSpacedRepetitionSetsInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ slug?: Prisma.StringFieldUpdateOperationsInput | string
+ name?: Prisma.StringFieldUpdateOperationsInput | string
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ decks?: Prisma.DeckUpdateManyWithoutClassNestedInput
+ quizSets?: Prisma.QuizSetUpdateManyWithoutClassNestedInput
+ materialGroups?: Prisma.MaterialGroupUpdateManyWithoutClassNestedInput
+}
+
+export type ClassUncheckedUpdateWithoutSpacedRepetitionSetsInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ slug?: Prisma.StringFieldUpdateOperationsInput | string
+ name?: Prisma.StringFieldUpdateOperationsInput | string
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ decks?: Prisma.DeckUncheckedUpdateManyWithoutClassNestedInput
+ quizSets?: Prisma.QuizSetUncheckedUpdateManyWithoutClassNestedInput
+ materialGroups?: Prisma.MaterialGroupUncheckedUpdateManyWithoutClassNestedInput
}
@@ -610,12 +703,14 @@ export type ClassCountOutputType = {
decks: number
quizSets: number
materialGroups: number
+ spacedRepetitionSets: number
}
export type ClassCountOutputTypeSelect = {
decks?: boolean | ClassCountOutputTypeCountDecksArgs
quizSets?: boolean | ClassCountOutputTypeCountQuizSetsArgs
materialGroups?: boolean | ClassCountOutputTypeCountMaterialGroupsArgs
+ spacedRepetitionSets?: boolean | ClassCountOutputTypeCountSpacedRepetitionSetsArgs
}
/**
@@ -649,6 +744,13 @@ export type ClassCountOutputTypeCountMaterialGroupsArgs = {
+ where?: Prisma.SpacedRepetitionSetWhereInput
+}
+
export type ClassSelect = runtime.Types.Extensions.GetSelect<{
id?: boolean
@@ -659,6 +761,7 @@ export type ClassSelect
quizSets?: boolean | Prisma.Class$quizSetsArgs
materialGroups?: boolean | Prisma.Class$materialGroupsArgs
+ spacedRepetitionSets?: boolean | Prisma.Class$spacedRepetitionSetsArgs
_count?: boolean | Prisma.ClassCountOutputTypeDefaultArgs
}, ExtArgs["result"]["class"]>
@@ -691,6 +794,7 @@ export type ClassInclude
quizSets?: boolean | Prisma.Class$quizSetsArgs
materialGroups?: boolean | Prisma.Class$materialGroupsArgs
+ spacedRepetitionSets?: boolean | Prisma.Class$spacedRepetitionSetsArgs
_count?: boolean | Prisma.ClassCountOutputTypeDefaultArgs
}
export type ClassIncludeCreateManyAndReturn = {}
@@ -702,6 +806,7 @@ export type $ClassPayload[]
quizSets: Prisma.$QuizSetPayload[]
materialGroups: Prisma.$MaterialGroupPayload[]
+ spacedRepetitionSets: Prisma.$SpacedRepetitionSetPayload[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
@@ -1106,6 +1211,7 @@ export interface Prisma__ClassClient = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
quizSets = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
materialGroups = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
+ spacedRepetitionSets = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
/**
* Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1602,6 +1708,30 @@ export type Class$materialGroupsArgs = {
+ /**
+ * Select specific fields to fetch from the SpacedRepetitionSet
+ */
+ select?: Prisma.SpacedRepetitionSetSelect | null
+ /**
+ * Omit specific fields from the SpacedRepetitionSet
+ */
+ omit?: Prisma.SpacedRepetitionSetOmit | null
+ /**
+ * Choose, which related nodes to fetch as well
+ */
+ include?: Prisma.SpacedRepetitionSetInclude | null
+ where?: Prisma.SpacedRepetitionSetWhereInput
+ orderBy?: Prisma.SpacedRepetitionSetOrderByWithRelationInput | Prisma.SpacedRepetitionSetOrderByWithRelationInput[]
+ cursor?: Prisma.SpacedRepetitionSetWhereUniqueInput
+ take?: number
+ skip?: number
+ distinct?: Prisma.SpacedRepetitionSetScalarFieldEnum | Prisma.SpacedRepetitionSetScalarFieldEnum[]
+}
+
/**
* Class without action
*/
diff --git a/src/generated/prisma/models/Deck.ts b/src/generated/prisma/models/Deck.ts
index 5f2141c..5ac039e 100644
--- a/src/generated/prisma/models/Deck.ts
+++ b/src/generated/prisma/models/Deck.ts
@@ -237,6 +237,7 @@ export type DeckWhereInput = {
cards?: Prisma.FlashcardListRelationFilter
shareLink?: Prisma.XOR | null
progress?: Prisma.StudyProgressListRelationFilter
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckListRelationFilter
}
export type DeckOrderByWithRelationInput = {
@@ -252,6 +253,7 @@ export type DeckOrderByWithRelationInput = {
cards?: Prisma.FlashcardOrderByRelationAggregateInput
shareLink?: Prisma.ShareLinkOrderByWithRelationInput
progress?: Prisma.StudyProgressOrderByRelationAggregateInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckOrderByRelationAggregateInput
}
export type DeckWhereUniqueInput = Prisma.AtLeast<{
@@ -270,6 +272,7 @@ export type DeckWhereUniqueInput = Prisma.AtLeast<{
cards?: Prisma.FlashcardListRelationFilter
shareLink?: Prisma.XOR | null
progress?: Prisma.StudyProgressListRelationFilter
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckListRelationFilter
}, "id">
export type DeckOrderByWithAggregationInput = {
@@ -311,6 +314,7 @@ export type DeckCreateInput = {
cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateInput = {
@@ -324,6 +328,7 @@ export type DeckUncheckedCreateInput = {
cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckUpdateInput = {
@@ -337,6 +342,7 @@ export type DeckUpdateInput = {
cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateInput = {
@@ -350,6 +356,7 @@ export type DeckUncheckedUpdateInput = {
cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckCreateManyInput = {
@@ -572,6 +579,20 @@ export type DeckUncheckedUpdateManyWithoutGroupNestedInput = {
deleteMany?: Prisma.DeckScalarWhereInput | Prisma.DeckScalarWhereInput[]
}
+export type DeckCreateNestedOneWithoutSpacedRepetitionMembershipsInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.DeckCreateOrConnectWithoutSpacedRepetitionMembershipsInput
+ connect?: Prisma.DeckWhereUniqueInput
+}
+
+export type DeckUpdateOneRequiredWithoutSpacedRepetitionMembershipsNestedInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.DeckCreateOrConnectWithoutSpacedRepetitionMembershipsInput
+ upsert?: Prisma.DeckUpsertWithoutSpacedRepetitionMembershipsInput
+ connect?: Prisma.DeckWhereUniqueInput
+ update?: Prisma.XOR, Prisma.DeckUncheckedUpdateWithoutSpacedRepetitionMembershipsInput>
+}
+
export type DeckCreateWithoutClassInput = {
id?: string
name: string
@@ -582,6 +603,7 @@ export type DeckCreateWithoutClassInput = {
cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateWithoutClassInput = {
@@ -594,6 +616,7 @@ export type DeckUncheckedCreateWithoutClassInput = {
cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckCreateOrConnectWithoutClassInput = {
@@ -644,6 +667,7 @@ export type DeckCreateWithoutCardsInput = {
group?: Prisma.MaterialGroupCreateNestedOneWithoutDecksInput
shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateWithoutCardsInput = {
@@ -656,6 +680,7 @@ export type DeckUncheckedCreateWithoutCardsInput = {
groupId?: string | null
shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckCreateOrConnectWithoutCardsInput = {
@@ -684,6 +709,7 @@ export type DeckUpdateWithoutCardsInput = {
group?: Prisma.MaterialGroupUpdateOneWithoutDecksNestedInput
shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateWithoutCardsInput = {
@@ -696,6 +722,7 @@ export type DeckUncheckedUpdateWithoutCardsInput = {
groupId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckCreateWithoutProgressInput = {
@@ -708,6 +735,7 @@ export type DeckCreateWithoutProgressInput = {
group?: Prisma.MaterialGroupCreateNestedOneWithoutDecksInput
cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateWithoutProgressInput = {
@@ -720,6 +748,7 @@ export type DeckUncheckedCreateWithoutProgressInput = {
groupId?: string | null
cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckCreateOrConnectWithoutProgressInput = {
@@ -748,6 +777,7 @@ export type DeckUpdateWithoutProgressInput = {
group?: Prisma.MaterialGroupUpdateOneWithoutDecksNestedInput
cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateWithoutProgressInput = {
@@ -760,6 +790,7 @@ export type DeckUncheckedUpdateWithoutProgressInput = {
groupId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckCreateWithoutShareLinkInput = {
@@ -772,6 +803,7 @@ export type DeckCreateWithoutShareLinkInput = {
group?: Prisma.MaterialGroupCreateNestedOneWithoutDecksInput
cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateWithoutShareLinkInput = {
@@ -784,6 +816,7 @@ export type DeckUncheckedCreateWithoutShareLinkInput = {
groupId?: string | null
cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckCreateOrConnectWithoutShareLinkInput = {
@@ -812,6 +845,7 @@ export type DeckUpdateWithoutShareLinkInput = {
group?: Prisma.MaterialGroupUpdateOneWithoutDecksNestedInput
cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateWithoutShareLinkInput = {
@@ -824,6 +858,7 @@ export type DeckUncheckedUpdateWithoutShareLinkInput = {
groupId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckCreateWithoutGroupInput = {
@@ -836,6 +871,7 @@ export type DeckCreateWithoutGroupInput = {
cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckCreateNestedManyWithoutDeckInput
}
export type DeckUncheckedCreateWithoutGroupInput = {
@@ -848,6 +884,7 @@ export type DeckUncheckedCreateWithoutGroupInput = {
cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedCreateNestedManyWithoutDeckInput
}
export type DeckCreateOrConnectWithoutGroupInput = {
@@ -875,6 +912,74 @@ export type DeckUpdateManyWithWhereWithoutGroupInput = {
data: Prisma.XOR
}
+export type DeckCreateWithoutSpacedRepetitionMembershipsInput = {
+ id?: string
+ name: string
+ description?: string | null
+ sortOrder?: number
+ createdAt?: Date | string
+ class: Prisma.ClassCreateNestedOneWithoutDecksInput
+ group?: Prisma.MaterialGroupCreateNestedOneWithoutDecksInput
+ cards?: Prisma.FlashcardCreateNestedManyWithoutDeckInput
+ shareLink?: Prisma.ShareLinkCreateNestedOneWithoutDeckInput
+ progress?: Prisma.StudyProgressCreateNestedManyWithoutDeckInput
+}
+
+export type DeckUncheckedCreateWithoutSpacedRepetitionMembershipsInput = {
+ id?: string
+ classId: string
+ name: string
+ description?: string | null
+ sortOrder?: number
+ createdAt?: Date | string
+ groupId?: string | null
+ cards?: Prisma.FlashcardUncheckedCreateNestedManyWithoutDeckInput
+ shareLink?: Prisma.ShareLinkUncheckedCreateNestedOneWithoutDeckInput
+ progress?: Prisma.StudyProgressUncheckedCreateNestedManyWithoutDeckInput
+}
+
+export type DeckCreateOrConnectWithoutSpacedRepetitionMembershipsInput = {
+ where: Prisma.DeckWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type DeckUpsertWithoutSpacedRepetitionMembershipsInput = {
+ update: Prisma.XOR
+ create: Prisma.XOR
+ where?: Prisma.DeckWhereInput
+}
+
+export type DeckUpdateToOneWithWhereWithoutSpacedRepetitionMembershipsInput = {
+ where?: Prisma.DeckWhereInput
+ data: Prisma.XOR
+}
+
+export type DeckUpdateWithoutSpacedRepetitionMembershipsInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ name?: Prisma.StringFieldUpdateOperationsInput | string
+ description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ class?: Prisma.ClassUpdateOneRequiredWithoutDecksNestedInput
+ group?: Prisma.MaterialGroupUpdateOneWithoutDecksNestedInput
+ cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
+ shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
+ progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+}
+
+export type DeckUncheckedUpdateWithoutSpacedRepetitionMembershipsInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ classId?: Prisma.StringFieldUpdateOperationsInput | string
+ name?: Prisma.StringFieldUpdateOperationsInput | string
+ description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ groupId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
+ cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
+ shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
+ progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+}
+
export type DeckCreateManyClassInput = {
id?: string
name: string
@@ -894,6 +999,7 @@ export type DeckUpdateWithoutClassInput = {
cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateWithoutClassInput = {
@@ -906,6 +1012,7 @@ export type DeckUncheckedUpdateWithoutClassInput = {
cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateManyWithoutClassInput = {
@@ -936,6 +1043,7 @@ export type DeckUpdateWithoutGroupInput = {
cards?: Prisma.FlashcardUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateWithoutGroupInput = {
@@ -948,6 +1056,7 @@ export type DeckUncheckedUpdateWithoutGroupInput = {
cards?: Prisma.FlashcardUncheckedUpdateManyWithoutDeckNestedInput
shareLink?: Prisma.ShareLinkUncheckedUpdateOneWithoutDeckNestedInput
progress?: Prisma.StudyProgressUncheckedUpdateManyWithoutDeckNestedInput
+ spacedRepetitionMemberships?: Prisma.SpacedRepetitionSetDeckUncheckedUpdateManyWithoutDeckNestedInput
}
export type DeckUncheckedUpdateManyWithoutGroupInput = {
@@ -967,11 +1076,13 @@ export type DeckUncheckedUpdateManyWithoutGroupInput = {
export type DeckCountOutputType = {
cards: number
progress: number
+ spacedRepetitionMemberships: number
}
export type DeckCountOutputTypeSelect = {
cards?: boolean | DeckCountOutputTypeCountCardsArgs
progress?: boolean | DeckCountOutputTypeCountProgressArgs
+ spacedRepetitionMemberships?: boolean | DeckCountOutputTypeCountSpacedRepetitionMembershipsArgs
}
/**
@@ -998,6 +1109,13 @@ export type DeckCountOutputTypeCountProgressArgs = {
+ where?: Prisma.SpacedRepetitionSetDeckWhereInput
+}
+
export type DeckSelect = runtime.Types.Extensions.GetSelect<{
id?: boolean
@@ -1012,6 +1130,7 @@ export type DeckSelect
shareLink?: boolean | Prisma.Deck$shareLinkArgs
progress?: boolean | Prisma.Deck$progressArgs
+ spacedRepetitionMemberships?: boolean | Prisma.Deck$spacedRepetitionMembershipsArgs
_count?: boolean | Prisma.DeckCountOutputTypeDefaultArgs
}, ExtArgs["result"]["deck"]>
@@ -1056,6 +1175,7 @@ export type DeckInclude
shareLink?: boolean | Prisma.Deck$shareLinkArgs
progress?: boolean | Prisma.Deck$progressArgs
+ spacedRepetitionMemberships?: boolean | Prisma.Deck$spacedRepetitionMembershipsArgs
_count?: boolean | Prisma.DeckCountOutputTypeDefaultArgs
}
export type DeckIncludeCreateManyAndReturn = {
@@ -1075,6 +1195,7 @@ export type $DeckPayload[]
shareLink: Prisma.$ShareLinkPayload | null
progress: Prisma.$StudyProgressPayload[]
+ spacedRepetitionMemberships: Prisma.$SpacedRepetitionSetDeckPayload[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
@@ -1483,6 +1604,7 @@ export interface Prisma__DeckClient = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
shareLink = {}>(args?: Prisma.Subset>): Prisma.Prisma__ShareLinkClient, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions>
progress = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
+ spacedRepetitionMemberships = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
/**
* Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved.
@@ -2003,6 +2125,30 @@ export type Deck$progressArgs = {
+ /**
+ * Select specific fields to fetch from the SpacedRepetitionSetDeck
+ */
+ select?: Prisma.SpacedRepetitionSetDeckSelect | null
+ /**
+ * Omit specific fields from the SpacedRepetitionSetDeck
+ */
+ omit?: Prisma.SpacedRepetitionSetDeckOmit | null
+ /**
+ * Choose, which related nodes to fetch as well
+ */
+ include?: Prisma.SpacedRepetitionSetDeckInclude | null
+ where?: Prisma.SpacedRepetitionSetDeckWhereInput
+ orderBy?: Prisma.SpacedRepetitionSetDeckOrderByWithRelationInput | Prisma.SpacedRepetitionSetDeckOrderByWithRelationInput[]
+ cursor?: Prisma.SpacedRepetitionSetDeckWhereUniqueInput
+ take?: number
+ skip?: number
+ distinct?: Prisma.SpacedRepetitionSetDeckScalarFieldEnum | Prisma.SpacedRepetitionSetDeckScalarFieldEnum[]
+}
+
/**
* Deck without action
*/
diff --git a/src/generated/prisma/models/Flashcard.ts b/src/generated/prisma/models/Flashcard.ts
index 3a6bc67..58a5bde 100644
--- a/src/generated/prisma/models/Flashcard.ts
+++ b/src/generated/prisma/models/Flashcard.ts
@@ -217,6 +217,7 @@ export type FlashcardWhereInput = {
back?: Prisma.StringFilter<"Flashcard"> | string
sortOrder?: Prisma.IntFilter<"Flashcard"> | number
deck?: Prisma.XOR
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateListRelationFilter
}
export type FlashcardOrderByWithRelationInput = {
@@ -226,6 +227,7 @@ export type FlashcardOrderByWithRelationInput = {
back?: Prisma.SortOrder
sortOrder?: Prisma.SortOrder
deck?: Prisma.DeckOrderByWithRelationInput
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateOrderByRelationAggregateInput
}
export type FlashcardWhereUniqueInput = Prisma.AtLeast<{
@@ -238,6 +240,7 @@ export type FlashcardWhereUniqueInput = Prisma.AtLeast<{
back?: Prisma.StringFilter<"Flashcard"> | string
sortOrder?: Prisma.IntFilter<"Flashcard"> | number
deck?: Prisma.XOR
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateListRelationFilter
}, "id">
export type FlashcardOrderByWithAggregationInput = {
@@ -270,6 +273,7 @@ export type FlashcardCreateInput = {
back: string
sortOrder?: number
deck: Prisma.DeckCreateNestedOneWithoutCardsInput
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateCreateNestedManyWithoutFlashcardInput
}
export type FlashcardUncheckedCreateInput = {
@@ -278,6 +282,7 @@ export type FlashcardUncheckedCreateInput = {
front: string
back: string
sortOrder?: number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUncheckedCreateNestedManyWithoutFlashcardInput
}
export type FlashcardUpdateInput = {
@@ -286,6 +291,7 @@ export type FlashcardUpdateInput = {
back?: Prisma.StringFieldUpdateOperationsInput | string
sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
deck?: Prisma.DeckUpdateOneRequiredWithoutCardsNestedInput
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUpdateManyWithoutFlashcardNestedInput
}
export type FlashcardUncheckedUpdateInput = {
@@ -294,6 +300,7 @@ export type FlashcardUncheckedUpdateInput = {
front?: Prisma.StringFieldUpdateOperationsInput | string
back?: Prisma.StringFieldUpdateOperationsInput | string
sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUncheckedUpdateManyWithoutFlashcardNestedInput
}
export type FlashcardCreateManyInput = {
@@ -361,6 +368,11 @@ export type FlashcardSumOrderByAggregateInput = {
sortOrder?: Prisma.SortOrder
}
+export type FlashcardScalarRelationFilter = {
+ is?: Prisma.FlashcardWhereInput
+ isNot?: Prisma.FlashcardWhereInput
+}
+
export type FlashcardCreateNestedManyWithoutDeckInput = {
create?: Prisma.XOR | Prisma.FlashcardCreateWithoutDeckInput[] | Prisma.FlashcardUncheckedCreateWithoutDeckInput[]
connectOrCreate?: Prisma.FlashcardCreateOrConnectWithoutDeckInput | Prisma.FlashcardCreateOrConnectWithoutDeckInput[]
@@ -403,11 +415,26 @@ export type FlashcardUncheckedUpdateManyWithoutDeckNestedInput = {
deleteMany?: Prisma.FlashcardScalarWhereInput | Prisma.FlashcardScalarWhereInput[]
}
+export type FlashcardCreateNestedOneWithoutSpacedRepetitionStatesInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.FlashcardCreateOrConnectWithoutSpacedRepetitionStatesInput
+ connect?: Prisma.FlashcardWhereUniqueInput
+}
+
+export type FlashcardUpdateOneRequiredWithoutSpacedRepetitionStatesNestedInput = {
+ create?: Prisma.XOR
+ connectOrCreate?: Prisma.FlashcardCreateOrConnectWithoutSpacedRepetitionStatesInput
+ upsert?: Prisma.FlashcardUpsertWithoutSpacedRepetitionStatesInput
+ connect?: Prisma.FlashcardWhereUniqueInput
+ update?: Prisma.XOR, Prisma.FlashcardUncheckedUpdateWithoutSpacedRepetitionStatesInput>
+}
+
export type FlashcardCreateWithoutDeckInput = {
id?: string
front: string
back: string
sortOrder?: number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateCreateNestedManyWithoutFlashcardInput
}
export type FlashcardUncheckedCreateWithoutDeckInput = {
@@ -415,6 +442,7 @@ export type FlashcardUncheckedCreateWithoutDeckInput = {
front: string
back: string
sortOrder?: number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUncheckedCreateNestedManyWithoutFlashcardInput
}
export type FlashcardCreateOrConnectWithoutDeckInput = {
@@ -453,6 +481,54 @@ export type FlashcardScalarWhereInput = {
sortOrder?: Prisma.IntFilter<"Flashcard"> | number
}
+export type FlashcardCreateWithoutSpacedRepetitionStatesInput = {
+ id?: string
+ front: string
+ back: string
+ sortOrder?: number
+ deck: Prisma.DeckCreateNestedOneWithoutCardsInput
+}
+
+export type FlashcardUncheckedCreateWithoutSpacedRepetitionStatesInput = {
+ id?: string
+ deckId: string
+ front: string
+ back: string
+ sortOrder?: number
+}
+
+export type FlashcardCreateOrConnectWithoutSpacedRepetitionStatesInput = {
+ where: Prisma.FlashcardWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type FlashcardUpsertWithoutSpacedRepetitionStatesInput = {
+ update: Prisma.XOR
+ create: Prisma.XOR
+ where?: Prisma.FlashcardWhereInput
+}
+
+export type FlashcardUpdateToOneWithWhereWithoutSpacedRepetitionStatesInput = {
+ where?: Prisma.FlashcardWhereInput
+ data: Prisma.XOR
+}
+
+export type FlashcardUpdateWithoutSpacedRepetitionStatesInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ front?: Prisma.StringFieldUpdateOperationsInput | string
+ back?: Prisma.StringFieldUpdateOperationsInput | string
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ deck?: Prisma.DeckUpdateOneRequiredWithoutCardsNestedInput
+}
+
+export type FlashcardUncheckedUpdateWithoutSpacedRepetitionStatesInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ deckId?: Prisma.StringFieldUpdateOperationsInput | string
+ front?: Prisma.StringFieldUpdateOperationsInput | string
+ back?: Prisma.StringFieldUpdateOperationsInput | string
+ sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+}
+
export type FlashcardCreateManyDeckInput = {
id?: string
front: string
@@ -465,6 +541,7 @@ export type FlashcardUpdateWithoutDeckInput = {
front?: Prisma.StringFieldUpdateOperationsInput | string
back?: Prisma.StringFieldUpdateOperationsInput | string
sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUpdateManyWithoutFlashcardNestedInput
}
export type FlashcardUncheckedUpdateWithoutDeckInput = {
@@ -472,6 +549,7 @@ export type FlashcardUncheckedUpdateWithoutDeckInput = {
front?: Prisma.StringFieldUpdateOperationsInput | string
back?: Prisma.StringFieldUpdateOperationsInput | string
sortOrder?: Prisma.IntFieldUpdateOperationsInput | number
+ spacedRepetitionStates?: Prisma.SpacedRepetitionCardStateUncheckedUpdateManyWithoutFlashcardNestedInput
}
export type FlashcardUncheckedUpdateManyWithoutDeckInput = {
@@ -482,6 +560,35 @@ export type FlashcardUncheckedUpdateManyWithoutDeckInput = {
}
+/**
+ * Count Type FlashcardCountOutputType
+ */
+
+export type FlashcardCountOutputType = {
+ spacedRepetitionStates: number
+}
+
+export type FlashcardCountOutputTypeSelect = {
+ spacedRepetitionStates?: boolean | FlashcardCountOutputTypeCountSpacedRepetitionStatesArgs
+}
+
+/**
+ * FlashcardCountOutputType without action
+ */
+export type FlashcardCountOutputTypeDefaultArgs = {
+ /**
+ * Select specific fields to fetch from the FlashcardCountOutputType
+ */
+ select?: Prisma.FlashcardCountOutputTypeSelect | null
+}
+
+/**
+ * FlashcardCountOutputType without action
+ */
+export type FlashcardCountOutputTypeCountSpacedRepetitionStatesArgs = {
+ where?: Prisma.SpacedRepetitionCardStateWhereInput
+}
+
export type FlashcardSelect = runtime.Types.Extensions.GetSelect<{
id?: boolean
@@ -490,6 +597,8 @@ export type FlashcardSelect
+ spacedRepetitionStates?: boolean | Prisma.Flashcard$spacedRepetitionStatesArgs
+ _count?: boolean | Prisma.FlashcardCountOutputTypeDefaultArgs
}, ExtArgs["result"]["flashcard"]>
export type FlashcardSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{
@@ -521,6 +630,8 @@ export type FlashcardSelectScalar = {
export type FlashcardOmit = runtime.Types.Extensions.GetOmit<"id" | "deckId" | "front" | "back" | "sortOrder", ExtArgs["result"]["flashcard"]>
export type FlashcardInclude = {
deck?: boolean | Prisma.DeckDefaultArgs
+ spacedRepetitionStates?: boolean | Prisma.Flashcard$spacedRepetitionStatesArgs
+ _count?: boolean | Prisma.FlashcardCountOutputTypeDefaultArgs
}
export type FlashcardIncludeCreateManyAndReturn = {
deck?: boolean | Prisma.DeckDefaultArgs
@@ -533,6 +644,7 @@ export type $FlashcardPayload
+ spacedRepetitionStates: Prisma.$SpacedRepetitionCardStatePayload[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
@@ -935,6 +1047,7 @@ readonly fields: FlashcardFieldRefs;
export interface Prisma__FlashcardClient extends Prisma.PrismaPromise {
readonly [Symbol.toStringTag]: "PrismaPromise"
deck = {}>(args?: Prisma.Subset>): Prisma.Prisma__DeckClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions>
+ spacedRepetitionStates = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null>
/**
* Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1367,6 +1480,30 @@ export type FlashcardDeleteManyArgs = {
+ /**
+ * Select specific fields to fetch from the SpacedRepetitionCardState
+ */
+ select?: Prisma.SpacedRepetitionCardStateSelect | null
+ /**
+ * Omit specific fields from the SpacedRepetitionCardState
+ */
+ omit?: Prisma.SpacedRepetitionCardStateOmit | null
+ /**
+ * Choose, which related nodes to fetch as well
+ */
+ include?: Prisma.SpacedRepetitionCardStateInclude | null
+ where?: Prisma.SpacedRepetitionCardStateWhereInput
+ orderBy?: Prisma.SpacedRepetitionCardStateOrderByWithRelationInput | Prisma.SpacedRepetitionCardStateOrderByWithRelationInput[]
+ cursor?: Prisma.SpacedRepetitionCardStateWhereUniqueInput
+ take?: number
+ skip?: number
+ distinct?: Prisma.SpacedRepetitionCardStateScalarFieldEnum | Prisma.SpacedRepetitionCardStateScalarFieldEnum[]
+}
+
/**
* Flashcard without action
*/
diff --git a/src/generated/prisma/models/SpacedRepetitionCardState.ts b/src/generated/prisma/models/SpacedRepetitionCardState.ts
new file mode 100644
index 0000000..f953b10
--- /dev/null
+++ b/src/generated/prisma/models/SpacedRepetitionCardState.ts
@@ -0,0 +1,2004 @@
+
+/* !!! This is code generated by Prisma. Do not edit directly. !!! */
+/* eslint-disable */
+// biome-ignore-all lint: generated file
+// @ts-nocheck
+/*
+ * This file exports the `SpacedRepetitionCardState` model and its related types.
+ *
+ * 🟢 You can import this file directly.
+ */
+import type * as runtime from "@prisma/client/runtime/client"
+import type * as $Enums from "../enums"
+import type * as Prisma from "../internal/prismaNamespace"
+
+/**
+ * Model SpacedRepetitionCardState
+ *
+ */
+export type SpacedRepetitionCardStateModel = runtime.Types.Result.DefaultSelection
+
+export type AggregateSpacedRepetitionCardState = {
+ _count: SpacedRepetitionCardStateCountAggregateOutputType | null
+ _avg: SpacedRepetitionCardStateAvgAggregateOutputType | null
+ _sum: SpacedRepetitionCardStateSumAggregateOutputType | null
+ _min: SpacedRepetitionCardStateMinAggregateOutputType | null
+ _max: SpacedRepetitionCardStateMaxAggregateOutputType | null
+}
+
+export type SpacedRepetitionCardStateAvgAggregateOutputType = {
+ stability: number | null
+ difficulty: number | null
+ elapsedDays: number | null
+ scheduledDays: number | null
+ learningSteps: number | null
+ reps: number | null
+ lapses: number | null
+ state: number | null
+}
+
+export type SpacedRepetitionCardStateSumAggregateOutputType = {
+ stability: number | null
+ difficulty: number | null
+ elapsedDays: number | null
+ scheduledDays: number | null
+ learningSteps: number | null
+ reps: number | null
+ lapses: number | null
+ state: number | null
+}
+
+export type SpacedRepetitionCardStateMinAggregateOutputType = {
+ id: string | null
+ setId: string | null
+ flashcardId: string | null
+ due: Date | null
+ stability: number | null
+ difficulty: number | null
+ elapsedDays: number | null
+ scheduledDays: number | null
+ learningSteps: number | null
+ reps: number | null
+ lapses: number | null
+ state: number | null
+ firstReviewedAt: Date | null
+ lastReview: Date | null
+ createdAt: Date | null
+ updatedAt: Date | null
+}
+
+export type SpacedRepetitionCardStateMaxAggregateOutputType = {
+ id: string | null
+ setId: string | null
+ flashcardId: string | null
+ due: Date | null
+ stability: number | null
+ difficulty: number | null
+ elapsedDays: number | null
+ scheduledDays: number | null
+ learningSteps: number | null
+ reps: number | null
+ lapses: number | null
+ state: number | null
+ firstReviewedAt: Date | null
+ lastReview: Date | null
+ createdAt: Date | null
+ updatedAt: Date | null
+}
+
+export type SpacedRepetitionCardStateCountAggregateOutputType = {
+ id: number
+ setId: number
+ flashcardId: number
+ due: number
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt: number
+ lastReview: number
+ createdAt: number
+ updatedAt: number
+ _all: number
+}
+
+
+export type SpacedRepetitionCardStateAvgAggregateInputType = {
+ stability?: true
+ difficulty?: true
+ elapsedDays?: true
+ scheduledDays?: true
+ learningSteps?: true
+ reps?: true
+ lapses?: true
+ state?: true
+}
+
+export type SpacedRepetitionCardStateSumAggregateInputType = {
+ stability?: true
+ difficulty?: true
+ elapsedDays?: true
+ scheduledDays?: true
+ learningSteps?: true
+ reps?: true
+ lapses?: true
+ state?: true
+}
+
+export type SpacedRepetitionCardStateMinAggregateInputType = {
+ id?: true
+ setId?: true
+ flashcardId?: true
+ due?: true
+ stability?: true
+ difficulty?: true
+ elapsedDays?: true
+ scheduledDays?: true
+ learningSteps?: true
+ reps?: true
+ lapses?: true
+ state?: true
+ firstReviewedAt?: true
+ lastReview?: true
+ createdAt?: true
+ updatedAt?: true
+}
+
+export type SpacedRepetitionCardStateMaxAggregateInputType = {
+ id?: true
+ setId?: true
+ flashcardId?: true
+ due?: true
+ stability?: true
+ difficulty?: true
+ elapsedDays?: true
+ scheduledDays?: true
+ learningSteps?: true
+ reps?: true
+ lapses?: true
+ state?: true
+ firstReviewedAt?: true
+ lastReview?: true
+ createdAt?: true
+ updatedAt?: true
+}
+
+export type SpacedRepetitionCardStateCountAggregateInputType = {
+ id?: true
+ setId?: true
+ flashcardId?: true
+ due?: true
+ stability?: true
+ difficulty?: true
+ elapsedDays?: true
+ scheduledDays?: true
+ learningSteps?: true
+ reps?: true
+ lapses?: true
+ state?: true
+ firstReviewedAt?: true
+ lastReview?: true
+ createdAt?: true
+ updatedAt?: true
+ _all?: true
+}
+
+export type SpacedRepetitionCardStateAggregateArgs = {
+ /**
+ * Filter which SpacedRepetitionCardState to aggregate.
+ */
+ where?: Prisma.SpacedRepetitionCardStateWhereInput
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs}
+ *
+ * Determine the order of SpacedRepetitionCardStates to fetch.
+ */
+ orderBy?: Prisma.SpacedRepetitionCardStateOrderByWithRelationInput | Prisma.SpacedRepetitionCardStateOrderByWithRelationInput[]
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs}
+ *
+ * Sets the start position
+ */
+ cursor?: Prisma.SpacedRepetitionCardStateWhereUniqueInput
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs}
+ *
+ * Take `±n` SpacedRepetitionCardStates from the position of the cursor.
+ */
+ take?: number
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs}
+ *
+ * Skip the first `n` SpacedRepetitionCardStates.
+ */
+ skip?: number
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Count returned SpacedRepetitionCardStates
+ **/
+ _count?: true | SpacedRepetitionCardStateCountAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to average
+ **/
+ _avg?: SpacedRepetitionCardStateAvgAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to sum
+ **/
+ _sum?: SpacedRepetitionCardStateSumAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to find the minimum value
+ **/
+ _min?: SpacedRepetitionCardStateMinAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to find the maximum value
+ **/
+ _max?: SpacedRepetitionCardStateMaxAggregateInputType
+}
+
+export type GetSpacedRepetitionCardStateAggregateType = {
+ [P in keyof T & keyof AggregateSpacedRepetitionCardState]: P extends '_count' | 'count'
+ ? T[P] extends true
+ ? number
+ : Prisma.GetScalarType
+ : Prisma.GetScalarType
+}
+
+
+
+
+export type SpacedRepetitionCardStateGroupByArgs = {
+ where?: Prisma.SpacedRepetitionCardStateWhereInput
+ orderBy?: Prisma.SpacedRepetitionCardStateOrderByWithAggregationInput | Prisma.SpacedRepetitionCardStateOrderByWithAggregationInput[]
+ by: Prisma.SpacedRepetitionCardStateScalarFieldEnum[] | Prisma.SpacedRepetitionCardStateScalarFieldEnum
+ having?: Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput
+ take?: number
+ skip?: number
+ _count?: SpacedRepetitionCardStateCountAggregateInputType | true
+ _avg?: SpacedRepetitionCardStateAvgAggregateInputType
+ _sum?: SpacedRepetitionCardStateSumAggregateInputType
+ _min?: SpacedRepetitionCardStateMinAggregateInputType
+ _max?: SpacedRepetitionCardStateMaxAggregateInputType
+}
+
+export type SpacedRepetitionCardStateGroupByOutputType = {
+ id: string
+ setId: string
+ flashcardId: string
+ due: Date
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt: Date
+ lastReview: Date | null
+ createdAt: Date
+ updatedAt: Date
+ _count: SpacedRepetitionCardStateCountAggregateOutputType | null
+ _avg: SpacedRepetitionCardStateAvgAggregateOutputType | null
+ _sum: SpacedRepetitionCardStateSumAggregateOutputType | null
+ _min: SpacedRepetitionCardStateMinAggregateOutputType | null
+ _max: SpacedRepetitionCardStateMaxAggregateOutputType | null
+}
+
+export type GetSpacedRepetitionCardStateGroupByPayload = Prisma.PrismaPromise<
+ Array<
+ Prisma.PickEnumerable &
+ {
+ [P in ((keyof T) & (keyof SpacedRepetitionCardStateGroupByOutputType))]: P extends '_count'
+ ? T[P] extends boolean
+ ? number
+ : Prisma.GetScalarType
+ : Prisma.GetScalarType
+ }
+ >
+ >
+
+
+
+export type SpacedRepetitionCardStateWhereInput = {
+ AND?: Prisma.SpacedRepetitionCardStateWhereInput | Prisma.SpacedRepetitionCardStateWhereInput[]
+ OR?: Prisma.SpacedRepetitionCardStateWhereInput[]
+ NOT?: Prisma.SpacedRepetitionCardStateWhereInput | Prisma.SpacedRepetitionCardStateWhereInput[]
+ id?: Prisma.StringFilter<"SpacedRepetitionCardState"> | string
+ setId?: Prisma.StringFilter<"SpacedRepetitionCardState"> | string
+ flashcardId?: Prisma.StringFilter<"SpacedRepetitionCardState"> | string
+ due?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ stability?: Prisma.FloatFilter<"SpacedRepetitionCardState"> | number
+ difficulty?: Prisma.FloatFilter<"SpacedRepetitionCardState"> | number
+ elapsedDays?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ scheduledDays?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ learningSteps?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ reps?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ lapses?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ state?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ firstReviewedAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ lastReview?: Prisma.DateTimeNullableFilter<"SpacedRepetitionCardState"> | Date | string | null
+ createdAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ updatedAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ set?: Prisma.XOR
+ flashcard?: Prisma.XOR
+}
+
+export type SpacedRepetitionCardStateOrderByWithRelationInput = {
+ id?: Prisma.SortOrder
+ setId?: Prisma.SortOrder
+ flashcardId?: Prisma.SortOrder
+ due?: Prisma.SortOrder
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+ firstReviewedAt?: Prisma.SortOrder
+ lastReview?: Prisma.SortOrderInput | Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ updatedAt?: Prisma.SortOrder
+ set?: Prisma.SpacedRepetitionSetOrderByWithRelationInput
+ flashcard?: Prisma.FlashcardOrderByWithRelationInput
+}
+
+export type SpacedRepetitionCardStateWhereUniqueInput = Prisma.AtLeast<{
+ id?: string
+ setId_flashcardId?: Prisma.SpacedRepetitionCardStateSetIdFlashcardIdCompoundUniqueInput
+ AND?: Prisma.SpacedRepetitionCardStateWhereInput | Prisma.SpacedRepetitionCardStateWhereInput[]
+ OR?: Prisma.SpacedRepetitionCardStateWhereInput[]
+ NOT?: Prisma.SpacedRepetitionCardStateWhereInput | Prisma.SpacedRepetitionCardStateWhereInput[]
+ setId?: Prisma.StringFilter<"SpacedRepetitionCardState"> | string
+ flashcardId?: Prisma.StringFilter<"SpacedRepetitionCardState"> | string
+ due?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ stability?: Prisma.FloatFilter<"SpacedRepetitionCardState"> | number
+ difficulty?: Prisma.FloatFilter<"SpacedRepetitionCardState"> | number
+ elapsedDays?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ scheduledDays?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ learningSteps?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ reps?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ lapses?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ state?: Prisma.IntFilter<"SpacedRepetitionCardState"> | number
+ firstReviewedAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ lastReview?: Prisma.DateTimeNullableFilter<"SpacedRepetitionCardState"> | Date | string | null
+ createdAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ updatedAt?: Prisma.DateTimeFilter<"SpacedRepetitionCardState"> | Date | string
+ set?: Prisma.XOR
+ flashcard?: Prisma.XOR
+}, "id" | "setId_flashcardId">
+
+export type SpacedRepetitionCardStateOrderByWithAggregationInput = {
+ id?: Prisma.SortOrder
+ setId?: Prisma.SortOrder
+ flashcardId?: Prisma.SortOrder
+ due?: Prisma.SortOrder
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+ firstReviewedAt?: Prisma.SortOrder
+ lastReview?: Prisma.SortOrderInput | Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ updatedAt?: Prisma.SortOrder
+ _count?: Prisma.SpacedRepetitionCardStateCountOrderByAggregateInput
+ _avg?: Prisma.SpacedRepetitionCardStateAvgOrderByAggregateInput
+ _max?: Prisma.SpacedRepetitionCardStateMaxOrderByAggregateInput
+ _min?: Prisma.SpacedRepetitionCardStateMinOrderByAggregateInput
+ _sum?: Prisma.SpacedRepetitionCardStateSumOrderByAggregateInput
+}
+
+export type SpacedRepetitionCardStateScalarWhereWithAggregatesInput = {
+ AND?: Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput | Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput[]
+ OR?: Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput[]
+ NOT?: Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput | Prisma.SpacedRepetitionCardStateScalarWhereWithAggregatesInput[]
+ id?: Prisma.StringWithAggregatesFilter<"SpacedRepetitionCardState"> | string
+ setId?: Prisma.StringWithAggregatesFilter<"SpacedRepetitionCardState"> | string
+ flashcardId?: Prisma.StringWithAggregatesFilter<"SpacedRepetitionCardState"> | string
+ due?: Prisma.DateTimeWithAggregatesFilter<"SpacedRepetitionCardState"> | Date | string
+ stability?: Prisma.FloatWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ difficulty?: Prisma.FloatWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ elapsedDays?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ scheduledDays?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ learningSteps?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ reps?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ lapses?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ state?: Prisma.IntWithAggregatesFilter<"SpacedRepetitionCardState"> | number
+ firstReviewedAt?: Prisma.DateTimeWithAggregatesFilter<"SpacedRepetitionCardState"> | Date | string
+ lastReview?: Prisma.DateTimeNullableWithAggregatesFilter<"SpacedRepetitionCardState"> | Date | string | null
+ createdAt?: Prisma.DateTimeWithAggregatesFilter<"SpacedRepetitionCardState"> | Date | string
+ updatedAt?: Prisma.DateTimeWithAggregatesFilter<"SpacedRepetitionCardState"> | Date | string
+}
+
+export type SpacedRepetitionCardStateCreateInput = {
+ id?: string
+ due: Date | string
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps?: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt?: Date | string
+ lastReview?: Date | string | null
+ createdAt?: Date | string
+ updatedAt?: Date | string
+ set: Prisma.SpacedRepetitionSetCreateNestedOneWithoutCardStatesInput
+ flashcard: Prisma.FlashcardCreateNestedOneWithoutSpacedRepetitionStatesInput
+}
+
+export type SpacedRepetitionCardStateUncheckedCreateInput = {
+ id?: string
+ setId: string
+ flashcardId: string
+ due: Date | string
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps?: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt?: Date | string
+ lastReview?: Date | string | null
+ createdAt?: Date | string
+ updatedAt?: Date | string
+}
+
+export type SpacedRepetitionCardStateUpdateInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ due?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ stability?: Prisma.FloatFieldUpdateOperationsInput | number
+ difficulty?: Prisma.FloatFieldUpdateOperationsInput | number
+ elapsedDays?: Prisma.IntFieldUpdateOperationsInput | number
+ scheduledDays?: Prisma.IntFieldUpdateOperationsInput | number
+ learningSteps?: Prisma.IntFieldUpdateOperationsInput | number
+ reps?: Prisma.IntFieldUpdateOperationsInput | number
+ lapses?: Prisma.IntFieldUpdateOperationsInput | number
+ state?: Prisma.IntFieldUpdateOperationsInput | number
+ firstReviewedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ lastReview?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ set?: Prisma.SpacedRepetitionSetUpdateOneRequiredWithoutCardStatesNestedInput
+ flashcard?: Prisma.FlashcardUpdateOneRequiredWithoutSpacedRepetitionStatesNestedInput
+}
+
+export type SpacedRepetitionCardStateUncheckedUpdateInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ setId?: Prisma.StringFieldUpdateOperationsInput | string
+ flashcardId?: Prisma.StringFieldUpdateOperationsInput | string
+ due?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ stability?: Prisma.FloatFieldUpdateOperationsInput | number
+ difficulty?: Prisma.FloatFieldUpdateOperationsInput | number
+ elapsedDays?: Prisma.IntFieldUpdateOperationsInput | number
+ scheduledDays?: Prisma.IntFieldUpdateOperationsInput | number
+ learningSteps?: Prisma.IntFieldUpdateOperationsInput | number
+ reps?: Prisma.IntFieldUpdateOperationsInput | number
+ lapses?: Prisma.IntFieldUpdateOperationsInput | number
+ state?: Prisma.IntFieldUpdateOperationsInput | number
+ firstReviewedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ lastReview?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type SpacedRepetitionCardStateCreateManyInput = {
+ id?: string
+ setId: string
+ flashcardId: string
+ due: Date | string
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps?: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt?: Date | string
+ lastReview?: Date | string | null
+ createdAt?: Date | string
+ updatedAt?: Date | string
+}
+
+export type SpacedRepetitionCardStateUpdateManyMutationInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ due?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ stability?: Prisma.FloatFieldUpdateOperationsInput | number
+ difficulty?: Prisma.FloatFieldUpdateOperationsInput | number
+ elapsedDays?: Prisma.IntFieldUpdateOperationsInput | number
+ scheduledDays?: Prisma.IntFieldUpdateOperationsInput | number
+ learningSteps?: Prisma.IntFieldUpdateOperationsInput | number
+ reps?: Prisma.IntFieldUpdateOperationsInput | number
+ lapses?: Prisma.IntFieldUpdateOperationsInput | number
+ state?: Prisma.IntFieldUpdateOperationsInput | number
+ firstReviewedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ lastReview?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type SpacedRepetitionCardStateUncheckedUpdateManyInput = {
+ id?: Prisma.StringFieldUpdateOperationsInput | string
+ setId?: Prisma.StringFieldUpdateOperationsInput | string
+ flashcardId?: Prisma.StringFieldUpdateOperationsInput | string
+ due?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ stability?: Prisma.FloatFieldUpdateOperationsInput | number
+ difficulty?: Prisma.FloatFieldUpdateOperationsInput | number
+ elapsedDays?: Prisma.IntFieldUpdateOperationsInput | number
+ scheduledDays?: Prisma.IntFieldUpdateOperationsInput | number
+ learningSteps?: Prisma.IntFieldUpdateOperationsInput | number
+ reps?: Prisma.IntFieldUpdateOperationsInput | number
+ lapses?: Prisma.IntFieldUpdateOperationsInput | number
+ state?: Prisma.IntFieldUpdateOperationsInput | number
+ firstReviewedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ lastReview?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type SpacedRepetitionCardStateListRelationFilter = {
+ every?: Prisma.SpacedRepetitionCardStateWhereInput
+ some?: Prisma.SpacedRepetitionCardStateWhereInput
+ none?: Prisma.SpacedRepetitionCardStateWhereInput
+}
+
+export type SpacedRepetitionCardStateOrderByRelationAggregateInput = {
+ _count?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateSetIdFlashcardIdCompoundUniqueInput = {
+ setId: string
+ flashcardId: string
+}
+
+export type SpacedRepetitionCardStateCountOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ setId?: Prisma.SortOrder
+ flashcardId?: Prisma.SortOrder
+ due?: Prisma.SortOrder
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+ firstReviewedAt?: Prisma.SortOrder
+ lastReview?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ updatedAt?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateAvgOrderByAggregateInput = {
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateMaxOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ setId?: Prisma.SortOrder
+ flashcardId?: Prisma.SortOrder
+ due?: Prisma.SortOrder
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+ firstReviewedAt?: Prisma.SortOrder
+ lastReview?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ updatedAt?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateMinOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ setId?: Prisma.SortOrder
+ flashcardId?: Prisma.SortOrder
+ due?: Prisma.SortOrder
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+ firstReviewedAt?: Prisma.SortOrder
+ lastReview?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ updatedAt?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateSumOrderByAggregateInput = {
+ stability?: Prisma.SortOrder
+ difficulty?: Prisma.SortOrder
+ elapsedDays?: Prisma.SortOrder
+ scheduledDays?: Prisma.SortOrder
+ learningSteps?: Prisma.SortOrder
+ reps?: Prisma.SortOrder
+ lapses?: Prisma.SortOrder
+ state?: Prisma.SortOrder
+}
+
+export type SpacedRepetitionCardStateCreateNestedManyWithoutFlashcardInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutFlashcardInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutFlashcardInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManyFlashcardInputEnvelope
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+}
+
+export type SpacedRepetitionCardStateUncheckedCreateNestedManyWithoutFlashcardInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutFlashcardInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutFlashcardInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManyFlashcardInputEnvelope
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+}
+
+export type SpacedRepetitionCardStateUpdateManyWithoutFlashcardNestedInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutFlashcardInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutFlashcardInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput[]
+ upsert?: Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutFlashcardInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManyFlashcardInputEnvelope
+ set?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ disconnect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ delete?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ update?: Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutFlashcardInput[]
+ updateMany?: Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutFlashcardInput[]
+ deleteMany?: Prisma.SpacedRepetitionCardStateScalarWhereInput | Prisma.SpacedRepetitionCardStateScalarWhereInput[]
+}
+
+export type SpacedRepetitionCardStateUncheckedUpdateManyWithoutFlashcardNestedInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutFlashcardInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutFlashcardInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput[]
+ upsert?: Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutFlashcardInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManyFlashcardInputEnvelope
+ set?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ disconnect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ delete?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ update?: Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutFlashcardInput[]
+ updateMany?: Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutFlashcardInput | Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutFlashcardInput[]
+ deleteMany?: Prisma.SpacedRepetitionCardStateScalarWhereInput | Prisma.SpacedRepetitionCardStateScalarWhereInput[]
+}
+
+export type SpacedRepetitionCardStateCreateNestedManyWithoutSetInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutSetInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutSetInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManySetInputEnvelope
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+}
+
+export type SpacedRepetitionCardStateUncheckedCreateNestedManyWithoutSetInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutSetInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutSetInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManySetInputEnvelope
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+}
+
+export type SpacedRepetitionCardStateUpdateManyWithoutSetNestedInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutSetInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutSetInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput[]
+ upsert?: Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutSetInput | Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutSetInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManySetInputEnvelope
+ set?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ disconnect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ delete?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ update?: Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutSetInput | Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutSetInput[]
+ updateMany?: Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutSetInput | Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutSetInput[]
+ deleteMany?: Prisma.SpacedRepetitionCardStateScalarWhereInput | Prisma.SpacedRepetitionCardStateScalarWhereInput[]
+}
+
+export type SpacedRepetitionCardStateUncheckedUpdateManyWithoutSetNestedInput = {
+ create?: Prisma.XOR | Prisma.SpacedRepetitionCardStateCreateWithoutSetInput[] | Prisma.SpacedRepetitionCardStateUncheckedCreateWithoutSetInput[]
+ connectOrCreate?: Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput | Prisma.SpacedRepetitionCardStateCreateOrConnectWithoutSetInput[]
+ upsert?: Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutSetInput | Prisma.SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutSetInput[]
+ createMany?: Prisma.SpacedRepetitionCardStateCreateManySetInputEnvelope
+ set?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ disconnect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ delete?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ connect?: Prisma.SpacedRepetitionCardStateWhereUniqueInput | Prisma.SpacedRepetitionCardStateWhereUniqueInput[]
+ update?: Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutSetInput | Prisma.SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutSetInput[]
+ updateMany?: Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutSetInput | Prisma.SpacedRepetitionCardStateUpdateManyWithWhereWithoutSetInput[]
+ deleteMany?: Prisma.SpacedRepetitionCardStateScalarWhereInput | Prisma.SpacedRepetitionCardStateScalarWhereInput[]
+}
+
+export type SpacedRepetitionCardStateCreateWithoutFlashcardInput = {
+ id?: string
+ due: Date | string
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps?: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt?: Date | string
+ lastReview?: Date | string | null
+ createdAt?: Date | string
+ updatedAt?: Date | string
+ set: Prisma.SpacedRepetitionSetCreateNestedOneWithoutCardStatesInput
+}
+
+export type SpacedRepetitionCardStateUncheckedCreateWithoutFlashcardInput = {
+ id?: string
+ setId: string
+ due: Date | string
+ stability: number
+ difficulty: number
+ elapsedDays: number
+ scheduledDays: number
+ learningSteps?: number
+ reps: number
+ lapses: number
+ state: number
+ firstReviewedAt?: Date | string
+ lastReview?: Date | string | null
+ createdAt?: Date | string
+ updatedAt?: Date | string
+}
+
+export type SpacedRepetitionCardStateCreateOrConnectWithoutFlashcardInput = {
+ where: Prisma.SpacedRepetitionCardStateWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type SpacedRepetitionCardStateCreateManyFlashcardInputEnvelope = {
+ data: Prisma.SpacedRepetitionCardStateCreateManyFlashcardInput | Prisma.SpacedRepetitionCardStateCreateManyFlashcardInput[]
+}
+
+export type SpacedRepetitionCardStateUpsertWithWhereUniqueWithoutFlashcardInput = {
+ where: Prisma.SpacedRepetitionCardStateWhereUniqueInput
+ update: Prisma.XOR
+ create: Prisma.XOR
+}
+
+export type SpacedRepetitionCardStateUpdateWithWhereUniqueWithoutFlashcardInput = {
+ where: Prisma.SpacedRepetitionCardStateWhereUniqueInput
+ data: Prisma.XOR
+}
+
+export type SpacedRepetitionCardStateUpdateManyWithWhereWithoutFlashcardInput = {
+ where: Prisma.SpacedRepetitionCardStateScalarWhereInput
+ data: Prisma.XOR