{"_id":"express-authrouter","_rev":"27-f647372f97da65a858b2ff08c37972da","name":"express-authrouter","dist-tags":{"latest":"4.0.0"},"versions":{"1.0.0":{"name":"express-authrouter","version":"1.0.0","keywords":["Prisma ORM","ORM","express","login","register","auth express","express auth"],"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"ISC","_id":"express-authrouter@1.0.0","maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"homepage":"https://github.com/DarkSevenX/express-authRouter#readme","bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"dist":{"shasum":"4796928701cb2376a81e79a5bd340ce588258b18","tarball":"https://registry.npmjs.org/express-authrouter/-/express-authrouter-1.0.0.tgz","fileCount":7,"integrity":"sha512-oX8ayn6eU13Gjgi03Uychs+DU5GTOX5SNcc+MesWzdumcfD053v5eYuKVJp9Wx9sKAdTnI6haY3AQ3963wHylA==","signatures":[{"sig":"MEYCIQDAXWSNuGdQ8Lr9Rsx0waLOqOx+ivIFy2ibUflqkHyE/gIhALGDAOjtQiZfy1H658gjEwtZBG1g1q7+vrvBI7AwvOtn","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13841},"main":"src/index.js","type":"module","gitHead":"dc82d17ab88f16c85f94e092bd42b5fc1de824fd","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"},"deprecated":"Version 1.0.0 contains a bug. Please upgrade to a later version.","repository":{"url":"git+https://github.com/DarkSevenX/express-authRouter.git","type":"git"},"_npmVersion":"10.8.2","description":"paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT","directories":{},"_nodeVersion":"20.16.0","dependencies":{"bcrypt":"^5.1.1","express":"^4.19.2","jsonwebtoken":"^9.0.2","express-validator":"^7.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/express-authrouter_1.0.0_1724189122987_0.48372643079264566","host":"s3://npm-registry-packages"}},"3.0.3":{"name":"express-authrouter","version":"3.0.3","keywords":["Prisma ORM","ORM","prisma","auth","express","login","register","auth express","express auth"],"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"ISC","_id":"express-authrouter@3.0.3","maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"homepage":"https://github.com/DarkSevenX/express-authRouter#readme","bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"dist":{"shasum":"1940c954c4aeae6fdddd772811081441eb96f320","tarball":"https://registry.npmjs.org/express-authrouter/-/express-authrouter-3.0.3.tgz","fileCount":7,"integrity":"sha512-EOSxvi4ma6RpKbd7EOt7KMOLHEVDsuoK7NHPch0ltOT+ai+g6sP3RbMgJvLjHAdKi33x+rIN/7RTOGhG1iCATg==","signatures":[{"sig":"MEQCIDwrMA0ZCIq/cRIUg1cwtuuMojtAe/USU7PRwua2f35UAiAA9U0OT19Vp13gNgAupACekoBC4RumouDBedCPItANDQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13457},"main":"src/index.js","type":"module","gitHead":"e64f8b73f3062f80ecf30c7e491c82bd818f871e","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"},"deprecated":"this version contains bugs, fixed on version 3.1.0","repository":{"url":"git+https://github.com/DarkSevenX/express-authRouter.git","type":"git"},"_npmVersion":"10.8.2","description":"paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT","directories":{},"_nodeVersion":"20.16.0","dependencies":{"bcrypt":"^5.1.1","express":"^4.19.2","jsonwebtoken":"^9.0.2","express-validator":"^7.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/express-authrouter_3.0.3_1724205736249_0.5134100286959999","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"express-authrouter","version":"3.1.0","keywords":["Prisma ORM","ORM","prisma","auth","express","login","register","auth express","express auth"],"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"ISC","_id":"express-authrouter@3.1.0","maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"homepage":"https://github.com/DarkSevenX/express-authRouter#readme","bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"dist":{"shasum":"91a14d10923dcbc2ed905efad6caffa9c8f83d65","tarball":"https://registry.npmjs.org/express-authrouter/-/express-authrouter-3.1.0.tgz","fileCount":7,"integrity":"sha512-jUANXVWVlYa8VHDAPMImiD8munaDW925MYOtMnVntSGnPaJWrvlZI4P7ehYJNz8EtFVyFsb6Z45ACjtwJojAfA==","signatures":[{"sig":"MEYCIQCppb+UjbfDSaBYJgOCIXH5mCtMZNKZRFGrU0ULjBjpqwIhAPAFrEkjLdKFcUyzVngcerxf9LgjN7U1GQWhg5aMrbbJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13689},"main":"src/index.js","type":"module","gitHead":"e64f8b73f3062f80ecf30c7e491c82bd818f871e","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"},"repository":{"url":"git+https://github.com/DarkSevenX/express-authRouter.git","type":"git"},"_npmVersion":"10.8.2","description":"paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT","directories":{},"_nodeVersion":"20.16.0","dependencies":{"bcrypt":"^5.1.1","express":"^4.19.2","jsonwebtoken":"^9.0.2","express-validator":"^7.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/express-authrouter_3.1.0_1724594460514_0.3757845201515875","host":"s3://npm-registry-packages"}},"3.2.0":{"name":"express-authrouter","version":"3.2.0","keywords":["Prisma ORM","ORM","prisma","auth","express","login","register","auth express","express auth"],"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"ISC","_id":"express-authrouter@3.2.0","maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"homepage":"https://github.com/DarkSevenX/express-authRouter#readme","bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"dist":{"shasum":"2c018aec7ab11413aee2a6a2f0b110d525422063","tarball":"https://registry.npmjs.org/express-authrouter/-/express-authrouter-3.2.0.tgz","fileCount":7,"integrity":"sha512-MVVTUuOYchF0Bki+5IDB2mPB/g2R0AqIaWsmgHHlw5bvyT4KvqFm+nt/43Tzd/bDM7OysdOxdRP2/E2P4bV+mg==","signatures":[{"sig":"MEYCIQDj0TH4ypquPvCah5otY/jI+lIyqckRN54ev2G8NnL4oAIhANTjfR/lv4e4tBbmDvksjO4KPwLpBOwgashxhsYhzKhv","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17955},"main":"src/index.js","type":"module","gitHead":"ba8c0974e3bb439b23a476318eed80f60bbf1564","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"},"repository":{"url":"git+https://github.com/DarkSevenX/express-authRouter.git","type":"git"},"_npmVersion":"10.8.2","description":"paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT","directories":{},"_nodeVersion":"20.16.0","dependencies":{"bcrypt":"^5.1.1","express":"^4.19.2","jsonwebtoken":"^9.0.2","express-validator":"^7.2.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/express-authrouter_3.2.0_1725342333003_0.35839710825686244","host":"s3://npm-registry-packages"}},"4.0.0":{"name":"express-authrouter","version":"4.0.0","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"engines":{"node":">=18.0.0"},"scripts":{"build":"tsc","prepublishOnly":"npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"keywords":["prisma","auth","express","login","register","jwt","authentication","middleware","express-router"],"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"MIT","description":"Plug-and-play authentication router for Express + Prisma + JWT","peerDependencies":{"@prisma/client":">=5.0.0","express":">=4.0.0"},"dependencies":{"bcrypt":"^5.1.1","express-validator":"^7.2.0","jsonwebtoken":"^9.0.2"},"devDependencies":{"@types/bcrypt":"^6.0.0","@types/express":"^5.0.6","@types/jsonwebtoken":"^9.0.10","@types/node":"^25.5.0","@vitest/coverage-v8":"^4.1.2","express":"^4.19.2","typescript":"^6.0.2","vitest":"^4.1.2"},"repository":{"type":"git","url":"git+https://github.com/DarkSevenX/express-authRouter.git"},"bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"homepage":"https://github.com/DarkSevenX/express-authRouter#readme","gitHead":"68565132ae6affe1e3b247256f4d3dbd8f69d92a","_id":"express-authrouter@4.0.0","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-urfy1Gnj+fqRr2cjmbcl5xrrt5+BtSuX6RjCtiERntjbL0TElDQ8cSDxZdXOi/Vc0PSFqh3NU5qYGwRxjgy67Q==","shasum":"ccfe651567cda53713b25084af795c0d9fe20b79","tarball":"https://registry.npmjs.org/express-authrouter/-/express-authrouter-4.0.0.tgz","fileCount":27,"unpackedSize":39587,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAxNWF0wpHDAsifvY0gpdCMneL0YEOfWWoWerKLvwsYhAiEAliZltrIZlJYZQQtO+zp447g3TyII6jL+1lLe1vZWsHw="}]},"_npmUser":{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"},"directories":{},"maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express-authrouter_4.0.0_1774540260785_0.19774645003746527"},"_hasShrinkwrap":false}},"time":{"created":"2024-08-20T21:25:22.987Z","modified":"2026-03-26T15:51:01.016Z","1.0.1":"2024-08-18T19:48:30.360Z","1.0.2":"2024-08-18T19:57:13.880Z","1.0.3":"2024-08-18T20:50:31.717Z","1.0.4":"2024-08-18T21:02:33.971Z","1.0.5":"2024-08-18T21:06:55.441Z","1.1.0":"2024-08-18T21:09:36.706Z","1.2.0":"2024-08-18T21:12:47.720Z","1.3.0":"2024-08-18T21:20:39.666Z","1.4.0":"2024-08-18T22:01:37.103Z","2.0.0":"2024-08-18T22:14:02.038Z","2.0.1":"2024-08-18T22:16:37.689Z","2.0.2":"2024-08-18T22:22:25.702Z","2.0.3":"2024-08-19T00:37:21.176Z","2.1.0":"2024-08-19T00:58:38.272Z","2.2.0":"2024-08-19T01:24:44.105Z","2.3.0":"2024-08-19T01:44:17.116Z","3.0.0":"2024-08-19T02:34:53.868Z","3.0.1":"2024-08-19T04:09:55.625Z","3.0.2":"2024-08-19T06:25:39.096Z","1.0.0":"2024-08-20T21:25:23.157Z","3.0.3":"2024-08-21T02:02:16.455Z","3.1.0":"2024-08-25T14:01:00.698Z","3.2.0":"2024-09-03T05:45:33.172Z","4.0.0":"2026-03-26T15:51:00.912Z"},"bugs":{"url":"https://github.com/DarkSevenX/express-authRouter/issues"},"author":{"name":"Nelson David Arguedo Ramos - DarkSevenX"},"license":"MIT","homepage":"https://github.com/DarkSevenX/express-authRouter#readme","keywords":["prisma","auth","express","login","register","jwt","authentication","middleware","express-router"],"repository":{"type":"git","url":"git+https://github.com/DarkSevenX/express-authRouter.git"},"description":"Plug-and-play authentication router for Express + Prisma + JWT","maintainers":[{"name":"darkseven","email":"nelsonargumedo2809@gmail.com"}],"readme":"# express-authrouter\r\n\r\n[![npm version](https://img.shields.io/npm/v/express-authrouter.svg)](https://www.npmjs.com/package/express-authrouter)\r\n[![license](https://img.shields.io/npm/l/express-authrouter.svg)](./LICENSE)\r\n[![node](https://img.shields.io/node/v/express-authrouter.svg)](https://nodejs.org)\r\n[![typescript](https://img.shields.io/badge/TypeScript-ready-blue.svg)](https://www.typescriptlang.org/)\r\n\r\nPlug-and-play authentication router for **Express** + **Prisma** + **JWT**.\r\n\r\nTypeScript types are included out of the box — no `@types/` package needed.\r\n\r\nDrop it into any Express app and get `POST /register` and `POST /login` routes, a `protect()` middleware for guarded routes, and optional `express-validator` integration — all in a few lines.\r\n\r\n---\r\n\r\n## Table of contents\r\n\r\n- [Requirements](#requirements)\r\n- [Installation](#installation)\r\n- [Quick start](#quick-start)\r\n- [Prisma schema](#prisma-schema)\r\n- [API](#api)\r\n  - [new Auth(prisma, secret, identities, options)](#new-authprisma-secret-identities-options)\r\n  - [auth.routes()](#authroutes)\r\n  - [auth.protect()](#authprotect)\r\n  - [auth.result()](#authresult)\r\n  - [userModelExists(prisma, userModel?)](#usermodelexistsprisma-usermodel)\r\n- [HTTP reference](#http-reference)\r\n- [Using express-validator](#using-express-validator)\r\n- [Custom model name](#custom-model-name)\r\n- [Error responses](#error-responses)\r\n- [License](#license)\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n| Peer dependency | Minimum version |\r\n|---|---|\r\n| `express` | `^4.0.0` |\r\n| `@prisma/client` | `^5.0.0` |\r\n| Node.js | `18.0.0` |\r\n\r\n---\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install express-authrouter\r\n```\r\n\r\n---\r\n\r\n## Quick start\r\n\r\n```js\r\n// app.js\r\nimport express from 'express'\r\nimport { PrismaClient } from '@prisma/client'\r\nimport Auth from 'express-authrouter'\r\n\r\nconst app = express()\r\nconst prisma = new PrismaClient()\r\n\r\napp.use(express.json())\r\n\r\nconst auth = new Auth(prisma, process.env.JWT_SECRET, ['email'])\r\n\r\n// Public auth routes: POST /auth/register  POST /auth/login\r\napp.use('/auth', auth.routes())\r\n\r\n// Protected route\r\napp.get('/profile', auth.protect(), (req, res) => {\r\n  res.json({ userId: req.user.id })\r\n})\r\n\r\napp.listen(3000)\r\n```\r\n\r\n---\r\n\r\n## Prisma schema\r\n\r\nYour schema must have a model with:\r\n- A unique field for each identity you pass (e.g. `email`).\r\n- A `password` field.\r\n- An `id` field (used as the JWT payload).\r\n\r\n```prisma\r\nmodel User {\r\n  id       Int    @id @default(autoincrement())\r\n  email    String @unique\r\n  password String\r\n}\r\n```\r\n\r\n> The model name in camelCase (`user`, `account`, etc.) must match the `userModel` option — defaults to `'user'`.\r\n\r\n---\r\n\r\n## API\r\n\r\n### `new Auth(prisma, secret, identities, options?)`\r\n\r\n| Parameter | Type | Required | Description |\r\n|---|---|---|---|\r\n| `prisma` | `PrismaClient` | ✅ | Your Prisma client instance. |\r\n| `secret` | `string` | ✅ | Secret key for signing/verifying JWT tokens. Use an env variable. |\r\n| `identities` | `string[]` | ✅ | Fields used as unique user identifiers. The **first** element is used for login lookup. |\r\n| `options` | `AuthOptions` | — | Optional configuration (see below). |\r\n\r\n**`AuthOptions`**\r\n\r\n| Option | Type | Default | Description |\r\n|---|---|---|---|\r\n| `expiresIn` | `string` | `'7d'` | JWT expiration. Accepts any value valid for [jsonwebtoken](https://github.com/auth0/node-jsonwebtoken#readme) (e.g. `'1h'`, `'30d'`). |\r\n| `userModel` | `string` | `'user'` | Prisma model name in camelCase. Change this if your model is named differently (e.g. `'account'`). |\r\n\r\n```js\r\nconst auth = new Auth(prisma, process.env.JWT_SECRET, ['email', 'username'], {\r\n  expiresIn: '1d',\r\n  userModel: 'user'\r\n})\r\n```\r\n\r\n---\r\n\r\n### `auth.routes()`\r\n\r\nReturns an Express `Router` with:\r\n\r\n| Method | Path | Description |\r\n|---|---|---|\r\n| `POST` | `/register` | Creates a new user. Hashes the password and returns a JWT. |\r\n| `POST` | `/login` | Validates credentials and returns a JWT. |\r\n\r\n```js\r\napp.use('/auth', auth.routes())\r\n```\r\n\r\n---\r\n\r\n### `auth.protect()`\r\n\r\nReturns a middleware that validates the JWT from the `Authorization` header.\r\n\r\n```\r\nAuthorization: Bearer <token>\r\n```\r\n\r\nOn success, the decoded token payload is available at `req.user` (contains `id`).\r\n\r\n```js\r\napp.get('/dashboard', auth.protect(), (req, res) => {\r\n  res.json({ userId: req.user.id })\r\n})\r\n```\r\n\r\n---\r\n\r\n### `auth.result()`\r\n\r\nReturns a middleware compatible with `express-validator`. Place it after your validator chain to short-circuit with a `400` response if any validation fails.\r\n\r\n```js\r\nimport { body } from 'express-validator'\r\n\r\napp.post(\r\n  '/auth/register',\r\n  body('email').isEmail().normalizeEmail(),\r\n  body('password').isLength({ min: 8 }),\r\n  auth.result(),        // ← returns 400 if validators above failed\r\n)\r\n```\r\n\r\n---\r\n\r\n### `userModelExists(prisma, userModel?)`\r\n\r\nA named export you can use as a startup check to verify that your Prisma migrations have been applied before the app starts accepting traffic. It is **not** run on every request by default.\r\n\r\n```js\r\nimport Auth, { userModelExists } from 'express-authrouter'\r\n\r\n// Fail fast if the table doesn't exist\r\napp.use(userModelExists(prisma))           // defaults to model 'user'\r\napp.use(userModelExists(prisma, 'account'))\r\n\r\napp.use('/auth', auth.routes())\r\n```\r\n\r\n---\r\n\r\n## HTTP reference\r\n\r\n### `POST /register`\r\n\r\n**Request body**\r\n\r\n```json\r\n{\r\n  \"email\": \"user@example.com\",\r\n  \"password\": \"secret123\"\r\n}\r\n```\r\n\r\nInclude any extra fields you have in your Prisma model — they are forwarded to `prisma.user.create()`.\r\n\r\n**Responses**\r\n\r\n| Status | Body | Meaning |\r\n|---|---|---|\r\n| `201` | `{ \"token\": \"...\" }` | User created. |\r\n| `400` | `{ \"error\": \"...\" }` | Missing required field. |\r\n| `409` | `{ \"error\": \"email is already taken\" }` | Identity already exists. |\r\n| `500` | `{ \"error\": \"...\" }` | Server/database error. |\r\n\r\n---\r\n\r\n### `POST /login`\r\n\r\nThe primary identity (first element of `identities`) is used for lookup.\r\n\r\n**Request body**\r\n\r\n```json\r\n{\r\n  \"email\": \"user@example.com\",\r\n  \"password\": \"secret123\"\r\n}\r\n```\r\n\r\n**Responses**\r\n\r\n| Status | Body | Meaning |\r\n|---|---|---|\r\n| `200` | `{ \"token\": \"...\" }` | Login successful. |\r\n| `400` | `{ \"error\": \"...\" }` | Missing field. |\r\n| `401` | `{ \"error\": \"incorrect password\" }` | Wrong password. |\r\n| `404` | `{ \"error\": \"user not found\" }` | No user found. |\r\n| `500` | `{ \"error\": \"...\" }` | Server/database error. |\r\n\r\n---\r\n\r\n### Protected routes\r\n\r\nSend the token in the `Authorization` header:\r\n\r\n```\r\nAuthorization: Bearer eyJhbGci...\r\n```\r\n\r\n**Responses**\r\n\r\n| Status | Body | Meaning |\r\n|---|---|---|\r\n| `200` | *(your handler's response)* | Token valid. `req.user.id` is available. |\r\n| `403` | `{ \"error\": \"no token provided\" }` | Header missing or malformed. |\r\n| `401` | `{ \"error\": \"...\" }` | Token invalid or expired. |\r\n\r\n---\r\n\r\n## Using express-validator\r\n\r\nAdd validators before mounting the auth router and use `auth.result()` to short-circuit on errors:\r\n\r\n```js\r\nimport { body } from 'express-validator'\r\n\r\napp.use(\r\n  '/auth',\r\n  body('email').isEmail().withMessage('invalid email').normalizeEmail(),\r\n  body('password').isLength({ min: 8 }).withMessage('password must be at least 8 characters'),\r\n  auth.result(),\r\n  auth.routes()\r\n)\r\n```\r\n\r\n---\r\n\r\n## Custom model name\r\n\r\nIf your Prisma model is not `User`, pass `userModel` in the options:\r\n\r\n```prisma\r\nmodel Account {\r\n  id       Int    @id @default(autoincrement())\r\n  email    String @unique\r\n  password String\r\n}\r\n```\r\n\r\n```js\r\nconst auth = new Auth(prisma, process.env.JWT_SECRET, ['email'], {\r\n  userModel: 'account'\r\n})\r\n```\r\n\r\n---\r\n\r\n## Error responses\r\n\r\nAll error responses follow a consistent JSON shape:\r\n\r\n```json\r\n{ \"error\": \"descriptive message here\" }\r\n```\r\n\r\nValidation errors from `auth.result()` use:\r\n\r\n```json\r\n{ \"errors\": [ { \"msg\": \"...\", \"path\": \"...\", ... } ] }\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\n[MIT](./LICENSE) — Nelson David Arguedo Ramos (DarkSevenX)\r\n","readmeFilename":"README.md"}