From bcdb6f7ec64faf0809e4a7cce4245c93a4903bb8 Mon Sep 17 00:00:00 2001 From: Nicolas Burtey Date: Thu, 14 Sep 2023 14:29:37 +0100 Subject: [PATCH] chore: adding oauth2 login and consent code to main repo --- frontend/login-consent/.dockerignore | 1 + frontend/login-consent/.gitignore | 5 + frontend/login-consent/.prettierignore | 1 + frontend/login-consent/.reference-ignore | 3 + frontend/login-consent/Dockerfile | 20 + frontend/login-consent/README.md | 44 + frontend/login-consent/package.json | 51 + frontend/login-consent/public/favicon.ico | Bin 0 -> 36843 bytes frontend/login-consent/src/app.ts | 74 + frontend/login-consent/src/config.ts | 18 + frontend/login-consent/src/routes/consent.ts | 181 ++ frontend/login-consent/src/routes/index.ts | 19 + frontend/login-consent/src/routes/login.ts | 212 ++ frontend/login-consent/src/routes/logout.ts | 70 + .../src/routes/stub/oidc-cert.ts | 89 + frontend/login-consent/tsconfig.json | 14 + frontend/login-consent/views/consent.pug | 35 + frontend/login-consent/views/error.pug | 7 + frontend/login-consent/views/index.pug | 5 + frontend/login-consent/views/layout.pug | 6 + frontend/login-consent/views/login.pug | 20 + frontend/login-consent/views/logout.pug | 12 + frontend/login-consent/views/verification.pug | 21 + frontend/login-consent/yarn.lock | 2323 +++++++++++++++++ 24 files changed, 3231 insertions(+) create mode 100644 frontend/login-consent/.dockerignore create mode 100644 frontend/login-consent/.gitignore create mode 100644 frontend/login-consent/.prettierignore create mode 100644 frontend/login-consent/.reference-ignore create mode 100644 frontend/login-consent/Dockerfile create mode 100644 frontend/login-consent/README.md create mode 100644 frontend/login-consent/package.json create mode 100644 frontend/login-consent/public/favicon.ico create mode 100644 frontend/login-consent/src/app.ts create mode 100644 frontend/login-consent/src/config.ts create mode 100644 frontend/login-consent/src/routes/consent.ts create mode 100644 frontend/login-consent/src/routes/index.ts create mode 100644 frontend/login-consent/src/routes/login.ts create mode 100644 frontend/login-consent/src/routes/logout.ts create mode 100644 frontend/login-consent/src/routes/stub/oidc-cert.ts create mode 100644 frontend/login-consent/tsconfig.json create mode 100644 frontend/login-consent/views/consent.pug create mode 100644 frontend/login-consent/views/error.pug create mode 100644 frontend/login-consent/views/index.pug create mode 100644 frontend/login-consent/views/layout.pug create mode 100644 frontend/login-consent/views/login.pug create mode 100644 frontend/login-consent/views/logout.pug create mode 100644 frontend/login-consent/views/verification.pug create mode 100644 frontend/login-consent/yarn.lock diff --git a/frontend/login-consent/.dockerignore b/frontend/login-consent/.dockerignore new file mode 100644 index 00000000000..2eea525d885 --- /dev/null +++ b/frontend/login-consent/.dockerignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/frontend/login-consent/.gitignore b/frontend/login-consent/.gitignore new file mode 100644 index 00000000000..6b7a133b63c --- /dev/null +++ b/frontend/login-consent/.gitignore @@ -0,0 +1,5 @@ +.bin/ +node_modules/ +.bin/ +.idea +lib/ diff --git a/frontend/login-consent/.prettierignore b/frontend/login-consent/.prettierignore new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/frontend/login-consent/.prettierignore @@ -0,0 +1 @@ + diff --git a/frontend/login-consent/.reference-ignore b/frontend/login-consent/.reference-ignore new file mode 100644 index 00000000000..eee2a89c2ed --- /dev/null +++ b/frontend/login-consent/.reference-ignore @@ -0,0 +1,3 @@ +**/node_modules +docs +CHANGELOG.md diff --git a/frontend/login-consent/Dockerfile b/frontend/login-consent/Dockerfile new file mode 100644 index 00000000000..a8d7e0193b1 --- /dev/null +++ b/frontend/login-consent/Dockerfile @@ -0,0 +1,20 @@ +FROM node:14.15-alpine3.12 + +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +RUN adduser -S ory -D -u 10000 -s /bin/nologin + +COPY package.json package.json +COPY package-lock.json package-lock.json +RUN npm ci --silent + +COPY . /usr/src/app + +RUN npm run build + +USER 10000 + +ENTRYPOINT npm run serve + +EXPOSE 3000 diff --git a/frontend/login-consent/README.md b/frontend/login-consent/README.md new file mode 100644 index 00000000000..39528953f39 --- /dev/null +++ b/frontend/login-consent/README.md @@ -0,0 +1,44 @@ +# login-consent-provider + +This is the User Login and Consent flow for the Galoy stack over the OAuth2 service (Hydra) in NodeJS. + +--- + + + + +- [login-consent-provider](#login-consent-provider) + - [Overview](#overview) + - [Running](#running) + - [FAQ](#faq) + - [TLS Termination](#tls-termination) + + + +--- + +## Overview + +Apart from additions (`./routes/login.ts`, `./routes/consent.ts`) and their +respective templates, only a [CSRF Middleware] has been added. Everything else +is the standard express template. + +Also, a simple helper that makes HTTP requests has been added to +`./services/hydra.js` which uses the `node-fetch` library. + +To set this example up with ORY Hydra, please refer to the +[official documentation](https://www.ory.sh/docs). + +## Running + +Please head over to the +[ORY Hydra 5 Minute Tutorial](https://www.ory.sh/docs/hydra/5min-tutorial) to +see how this works. + +## FAQ + +### TLS Termination + +You can mock TLS Termination by setting environment variable +`MOCK_TLS_TERMINATION` to any value, for example `MOCK_TLS_TERMINATION=y`. This +will add `X-Forwarded-Proto: https` to each HTTP Request Header. diff --git a/frontend/login-consent/package.json b/frontend/login-consent/package.json new file mode 100644 index 00000000000..d9153922f8e --- /dev/null +++ b/frontend/login-consent/package.json @@ -0,0 +1,51 @@ +{ + "name": "galoy-login-consent-logout", + "version": "0.0.1", + "bin": { + "hydra-login-consent-logout": "lib/app.js" + }, + "files": [ + "lib", + "views" + ], + "scripts": { + "build": "tsc", + "serve": "HYDRA_ADMIN_URL=http://localhost:4445 node lib/app.js", + "start": "HYDRA_ADMIN_URL=http://localhost:4445 ts-node-dev --watch public,views --respawn src/app.ts", + "test": "npm-run-all build", + "prepublishOnly": "tsc" + }, + "prettier": "ory-prettier-styles", + "dependencies": { + "@ory/hydra-client": "^2.1.1", + "@types/axios": "^0.14.0", + "@types/cookie-parser": "^1.4.2", + "@types/csurf": "^1.9.36", + "@types/express": "^4.17.7", + "@types/morgan": "^1.9.1", + "@types/url-join": "^4.0.0", + "axios": "^1.5.0", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.5", + "csurf": "^1.11.0", + "debug": "^4.1.1", + "express": "^4.17.3", + "morgan": "^1.10.0", + "node-fetch": "^2.6.7", + "pug": "^2.0.4", + "querystring": "^0.2.0", + "react": "^18.2.0", + "serve-favicon": "^2.5.0", + "typescript": "^3.7.5", + "url-join": "^4.0.1" + }, + "devDependencies": { + "@types/serve-favicon": "^2.5.4", + "license-checker": "^25.0.1", + "npm-run-all": "^4.1.5", + "ory-prettier-styles": "1.3.0", + "prettier": "^2.7.1", + "prettier-plugin-packagejson": "^2.2.18", + "ts-node-dev": "^1.0.0-pre.43" + } +} diff --git a/frontend/login-consent/public/favicon.ico b/frontend/login-consent/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..06739ff07e4ddf46f6feb82073c4c03b2762fae1 GIT binary patch literal 36843 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

%evM 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 vYJX?j_v>r0=Zm&I+bc3(-| { + next(new Error("Not Found")) +}) + +// error handlers + +// development error handler +// will print stacktrace +if (app.get("env") === "development") { + app.use((err: Error, req: Request, res: Response) => { + res.status(500) + res.render("error", { + message: err.message, + error: err, + }) + }) +} + +// production error handler +// no stacktraces leaked to user +app.use((err: Error, req: Request, res: Response) => { + res.status(500) + res.render("error", { + message: err.message, + error: {}, + }) +}) + +app.use((err: Error, req: Request, res: Response, next: NextFunction) => { + console.error(err.stack) + res.status(500).render("error", { + message: JSON.stringify(err, null, 2), + }) +}) + +const listenOn = Number(process.env.PORT || 3000) +app.listen(listenOn, () => { + console.log(`Listening on http://0.0.0.0:${listenOn}`) +}) diff --git a/frontend/login-consent/src/config.ts b/frontend/login-consent/src/config.ts new file mode 100644 index 00000000000..6c62d515c4a --- /dev/null +++ b/frontend/login-consent/src/config.ts @@ -0,0 +1,18 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import { Configuration, OAuth2Api } from "@ory/hydra-client" + +const baseOptions: any = {} + +if (process.env.MOCK_TLS_TERMINATION) { + baseOptions.headers = { "X-Forwarded-Proto": "https" } +} + +const configuration = new Configuration({ + basePath: process.env.HYDRA_ADMIN_URL, +}) + +const hydraClient = new OAuth2Api(configuration) + +export { hydraClient } diff --git a/frontend/login-consent/src/routes/consent.ts b/frontend/login-consent/src/routes/consent.ts new file mode 100644 index 00000000000..59c86e8a2f5 --- /dev/null +++ b/frontend/login-consent/src/routes/consent.ts @@ -0,0 +1,181 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import express from "express" +import url from "url" +import urljoin from "url-join" +import csrf from "csurf" +import { hydraClient } from "../config" +import { oidcConformityMaybeFakeSession } from "./stub/oidc-cert" + +// Sets up csrf protection +const csrfProtection = csrf({ + cookie: { + sameSite: "lax", + }, +}) +const router = express.Router() + +router.get("/", csrfProtection, (req, res, next) => { + // Parses the URL query + const query = url.parse(req.url, true).query + + // The challenge is used to fetch information about the consent request from ORY hydraClient. + const challenge = String(query.consent_challenge) + if (!challenge) { + next(new Error("Expected a consent challenge to be set but received none.")) + return + } + + // This section processes consent requests and either shows the consent UI or + // accepts the consent request right away if the user has given consent to this + // app before + hydraClient + .getOAuth2ConsentRequest({ consentChallenge: challenge }) + // This will be called if the HTTP request was successful + .then(({ data: body }) => { + // If a user has granted this application the requested scope, hydra will tell us to not show the UI. + // Any cast needed because the SDK changes are still unreleased. + // TODO: Remove in a later version. + if (body.skip || (body.client as any)?.skip_consent) { + // You can apply logic here, for example grant another scope, or do whatever... + // ... + + // FIXME: doesn't seem to work + // body.requested_scope?.push("offline") + + // Now it's time to grant the consent request. You could also deny the request if something went terribly wrong + return hydraClient + .acceptOAuth2ConsentRequest({ + consentChallenge: challenge, + acceptOAuth2ConsentRequest: { + // We can grant all scopes that have been requested - hydra already checked for us that no additional scopes + // are requested accidentally. + grant_scope: body.requested_scope, + + // ORY Hydra checks if requested audiences are allowed by the client, so we can simply echo this. + grant_access_token_audience: body.requested_access_token_audience, + + // The session allows us to set session data for id and access tokens + session: { + // This data will be available when introspecting the token. Try to avoid sensitive information here, + // unless you limit who can introspect tokens. + access_token: { card: "alice" }, + // This data will be available in the ID token. + id_token: { who: "bob" }, + }, + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the user back to hydra! + res.redirect(String(body.redirect_to)) + }) + } + + // If consent can't be skipped we MUST show the consent UI. + res.render("consent", { + csrfToken: req.csrfToken(), + challenge: challenge, + // We have a bunch of data available from the response, check out the API docs to find what these values mean + // and what additional data you have available. + requested_scope: body.requested_scope, + user: body.subject, + client: body.client, + action: urljoin(process.env.BASE_URL || "", "/consent"), + }) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + // The consent request has now either been accepted automatically or rendered. +}) + +router.post("/", csrfProtection, (req, res, next) => { + // The challenge is now a hidden input field, so let's take it from the request body instead + const challenge = req.body.challenge + + // Let's see if the user decided to accept or reject the consent request.. + if (req.body.submit === "Deny access") { + // Looks like the consent request was denied by the user + return ( + hydraClient + .rejectOAuth2ConsentRequest({ + consentChallenge: challenge, + rejectOAuth2Request: { + error: "access_denied", + error_description: "The resource owner denied the request", + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the browser back to hydra! + res.redirect(String(body.redirect_to)) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + ) + } + // label:consent-deny-end + + let grantScope = req.body.grant_scope + if (!Array.isArray(grantScope)) { + grantScope = [grantScope] + } + + // The session allows us to set session data for id and access tokens + let session = { + // This data will be available when introspecting the token. Try to avoid sensitive information here, + // unless you limit who can introspect tokens. + access_token: { card: "alice" }, + // This data will be available in the ID token. + id_token: { card: "bob" }, + } + + // Here is also the place to add data to the ID or access token. For example, + // if the scope 'profile' is added, add the family and given name to the ID Token claims: + // if (grantScope.indexOf('profile')) { + // session.id_token.family_name = 'Doe' + // session.id_token.given_name = 'John' + // } + + // Let's fetch the consent request again to be able to set `grantAccessTokenAudience` properly. + hydraClient + .getOAuth2ConsentRequest({ consentChallenge: challenge }) + // This will be called if the HTTP request was successful + .then(({ data: body }) => { + return hydraClient + .acceptOAuth2ConsentRequest({ + consentChallenge: challenge, + acceptOAuth2ConsentRequest: { + // We can grant all scopes that have been requested - hydra already checked for us that no additional scopes + // are requested accidentally. + grant_scope: grantScope, + + // If the environment variable CONFORMITY_FAKE_CLAIMS is set we are assuming that + // the app is built for the automated OpenID Connect Conformity Test Suite. You + // can peak inside the code for some ideas, but be aware that all data is fake + // and this only exists to fake a login system which works in accordance to OpenID Connect. + // + // If that variable is not set, the session will be used as-is. + session: oidcConformityMaybeFakeSession(grantScope, body, session), + + // ORY Hydra checks if requested audiences are allowed by the client, so we can simply echo this. + grant_access_token_audience: body.requested_access_token_audience, + + // This tells hydra to remember this consent request and allow the same client to request the same + // scopes from the same user, without showing the UI, in the future. + remember: Boolean(req.body.remember), + + // When this "remember" session expires, in seconds. Set this to 0 so it will never expire. + remember_for: 3600, + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the user back to hydra! + res.redirect(String(body.redirect_to)) + }) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + // label:docs-accept-consent +}) + +export default router diff --git a/frontend/login-consent/src/routes/index.ts b/frontend/login-consent/src/routes/index.ts new file mode 100644 index 00000000000..55c2f79da7a --- /dev/null +++ b/frontend/login-consent/src/routes/index.ts @@ -0,0 +1,19 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import express from "express" +// import { hydraClient } from "../config" + +const router = express.Router() + +router.get("/", (req, res) => { + res.render("index") +}) + +// hydraClient +// .getOAuth2LoginRequest({ }) +// .then((response) => { +// console.log(response.data) +// }) + +export default router diff --git a/frontend/login-consent/src/routes/login.ts b/frontend/login-consent/src/routes/login.ts new file mode 100644 index 00000000000..5e486edec4b --- /dev/null +++ b/frontend/login-consent/src/routes/login.ts @@ -0,0 +1,212 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import express from "express" +import url from "url" +import urljoin from "url-join" +import csrf from "csurf" +import { hydraClient } from "../config" +import { oidcConformityMaybeFakeAcr } from "./stub/oidc-cert" +import axios from "axios" + +// Sets up csrf protection +const csrfProtection = csrf({ + cookie: { + sameSite: "lax", + }, +}) +const router = express.Router() + +const authUrl = "http://localhost:4002" + +router.get("/", csrfProtection, async (req, res, next) => { + // Parses the URL query + const query = url.parse(req.url, true).query + + // The challenge is used to fetch information about the login request from ORY Hydra. + const challenge = String(query.login_challenge) + if (!challenge) { + next(new Error("Expected a login challenge to be set but received none.")) + return + } + + try { + const { data: body } = await hydraClient.getOAuth2LoginRequest({ + loginChallenge: challenge, + }) + + // If hydra was already able to authenticate the user, skip will be true and we do not need to re-authenticate + // the user. + if (body.skip) { + // You can apply logic here, for example update the number of times the user logged in. + // ... + + // Now it's time to grant the login request. You could also deny the request if something went terribly wrong + // (e.g. your arch-enemy logging in...) + return hydraClient + .acceptOAuth2LoginRequest({ + loginChallenge: challenge, + acceptOAuth2LoginRequest: { + // All we need to do is to confirm that we indeed want to log in the user. + subject: String(body.subject), + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the user back to hydra! + res.redirect(String(body.redirect_to)) + }) + } + + // If authentication can't be skipped we MUST show the login UI. + res.render("login", { + csrfToken: req.csrfToken(), + challenge: challenge, + action: urljoin(process.env.BASE_URL || "", "/login"), + hint: body.oidc_context?.login_hint || "", + }) + } catch (err) { + // This will handle any error that happens when making HTTP calls to hydra + next(err) + } +}) + +router.post("/", csrfProtection, async (req, res, next) => { + // The challenge is now a hidden input field, so let's take it from the request body instead + const challenge = req.body.challenge + + // Let's see if the user decided to accept or reject the consent request.. + if (req.body.submit === "Deny access") { + // Looks like the consent request was denied by the user + return ( + hydraClient + .rejectOAuth2LoginRequest({ + loginChallenge: challenge, + rejectOAuth2Request: { + error: "access_denied", + error_description: "The resource owner denied the request", + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the browser back to hydra! + res.redirect(String(body.redirect_to)) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + ) + } + + const email = req.body.email + + const url = `${authUrl}/auth/email/code` + + const result = await axios.post(url, { + email, + }) + // TODO: manage error on ip rate limit + // TODO: manage error when trying the same email too often + const emailLoginId = result.data.result + + if (emailLoginId) { + console.log({ emailLoginId }) + res.render("verification", { + csrfToken: req.csrfToken(), + challenge: challenge, + email, + emailLoginId, + action: urljoin(process.env.BASE_URL || "", "login/verification"), + }) + } else { + console.warn("no flow returned") + } + + return +}) + +router.post("/verification", csrfProtection, async (req, res, next) => { + // The challenge is now a hidden input field, so let's take it from the request body instead + const challenge = req.body.challenge + const code = req.body.code as String + const emailLoginId = req.body.emailLoginId as String + + const url = `${authUrl}/auth/email/login` + + const res2 = await axios.post(url, { + code, + emailLoginId, + }) + + const authToken = res2.data.result.authToken + const totpRequired = res2.data.result.totpRequired + const userId = res2.data.result.id + + console.log("authToken", authToken) + + // Let's check if the user provided valid credentials. + if (!authToken) { + // Looks like the user provided invalid credentials, let's show the ui again... + + res.render("verification", { + csrfToken: req.csrfToken(), + challenge: challenge, + error: "The email / code combination is not correct", + }) + + return + } + + // TODO: me query to get userId + + // Seems like the user authenticated! Let's tell hydra... + + hydraClient + .getOAuth2LoginRequest({ loginChallenge: challenge }) + .then(({ data: loginRequest }) => + hydraClient + .acceptOAuth2LoginRequest({ + loginChallenge: challenge, + acceptOAuth2LoginRequest: { + // Subject is an alias for user ID. A subject can be a random string, a UUID, an email address, .... + subject: userId, + + // This tells hydra to remember the browser and automatically authenticate the user in future requests. This will + // set the "skip" parameter in the other route to true on subsequent requests! + remember: Boolean(req.body.remember), + + // When the session expires, in seconds. Set this to 0 so it will never expire. + remember_for: 3600, + + // Sets which "level" (e.g. 2-factor authentication) of authentication the user has. The value is really arbitrary + // and optional. In the context of OpenID Connect, a value of 0 indicates the lowest authorization level. + // acr: '0', + // + // If the environment variable CONFORMITY_FAKE_CLAIMS is set we are assuming that + // the app is built for the automated OpenID Connect Conformity Test Suite. You + // can peak inside the code for some ideas, but be aware that all data is fake + // and this only exists to fake a login system which works in accordance to OpenID Connect. + // + // If that variable is not set, the ACR value will be set to the default passed here ('0') + acr: oidcConformityMaybeFakeAcr(loginRequest, "0"), + }, + }) + .then(({ data: body }) => { + // All we need to do now is to redirect the user back to hydra! + res.redirect(String(body.redirect_to)) + }), + ) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + + // You could also deny the login request which tells hydra that no one authenticated! + // hydra.rejectLoginRequest(challenge, { + // error: 'invalid_request', + // errorDescription: 'The user did something stupid...' + // }) + // .then(({body}) => { + // // All we need to do now is to redirect the browser back to hydra! + // res.redirect(String(body.redirectTo)); + // }) + // // This will handle any error that happens when making HTTP calls to hydra + // .catch(next); +}) + +export default router diff --git a/frontend/login-consent/src/routes/logout.ts b/frontend/login-consent/src/routes/logout.ts new file mode 100644 index 00000000000..9357f142a01 --- /dev/null +++ b/frontend/login-consent/src/routes/logout.ts @@ -0,0 +1,70 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import express from "express" +import url from "url" +import urljoin from "url-join" +import csrf from "csurf" +import { hydraClient } from "../config" + +// Sets up csrf protection +const csrfProtection = csrf({ cookie: true }) +const router = express.Router() + +router.get("/", csrfProtection, (req, res, next) => { + // Parses the URL query + const query = url.parse(req.url, true).query + + // The challenge is used to fetch information about the logout request from ORY Hydra. + const challenge = String(query.logout_challenge) + if (!challenge) { + next(new Error("Expected a logout challenge to be set but received none.")) + return + } + + hydraClient + .getOAuth2LogoutRequest({ logoutChallenge: challenge }) + // This will be called if the HTTP request was successful + .then(() => { + // Here we have access to e.g. response.subject, response.sid, ... + + // The most secure way to perform a logout request is by asking the user if he/she really want to log out. + res.render("logout", { + csrfToken: req.csrfToken(), + challenge: challenge, + action: urljoin(process.env.BASE_URL || "", "/logout"), + }) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) +}) + +router.post("/", csrfProtection, (req, res, next) => { + // The challenge is now a hidden input field, so let's take it from the request body instead + const challenge = req.body.challenge + + if (req.body.submit === "No") { + return ( + hydraClient + .rejectOAuth2LogoutRequest({ logoutChallenge: challenge }) + .then(() => { + // The user did not want to log out. Let's redirect him back somewhere or do something else. + res.redirect("https://www.ory.sh/") + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) + ) + } + + // The user agreed to log out, let's accept the logout request. + hydraClient + .acceptOAuth2LogoutRequest({ logoutChallenge: challenge }) + .then(({ data: body }) => { + // All we need to do now is to redirect the user back to hydra! + res.redirect(String(body.redirect_to)) + }) + // This will handle any error that happens when making HTTP calls to hydra + .catch(next) +}) + +export default router diff --git a/frontend/login-consent/src/routes/stub/oidc-cert.ts b/frontend/login-consent/src/routes/stub/oidc-cert.ts new file mode 100644 index 00000000000..59c3c2e6163 --- /dev/null +++ b/frontend/login-consent/src/routes/stub/oidc-cert.ts @@ -0,0 +1,89 @@ +// Copyright © 2023 Ory Corp +// SPDX-License-Identifier: Apache-2.0 + +import { + AcceptOAuth2ConsentRequestSession, + OAuth2ConsentRequest, + OAuth2LoginRequest, +} from "@ory/hydra-client" + +// This file contains logic which is used when running this application as part of the +// OpenID Connect Conformance test suite. You can use it for inspiration, but please +// do not use it in production as is. + +export const oidcConformityMaybeFakeAcr = ( + request: OAuth2LoginRequest, + fallback: string, +) => { + if (process.env.CONFORMITY_FAKE_CLAIMS !== "1") { + return fallback + } + + return request.oidc_context?.acr_values && + request.oidc_context.acr_values.length > 0 + ? request.oidc_context.acr_values[ + request.oidc_context.acr_values.length - 1 + ] + : fallback +} + +export const oidcConformityMaybeFakeSession = ( + grantScope: string[], + request: OAuth2ConsentRequest, + session: AcceptOAuth2ConsentRequestSession, +): AcceptOAuth2ConsentRequestSession => { + if (process.env.CONFORMITY_FAKE_CLAIMS !== "1") { + return session + } + + const idToken: { [key: string]: any } = {} + + // If the email scope was granted, fake the email claims. + if (grantScope.indexOf("email") > -1) { + // But only do so if the email was requested! + idToken.email = "foo@bar.com" + idToken.email_verified = true + } + + // If the phone scope was granted, fake the phone claims. + if (grantScope.indexOf("phone") > -1) { + idToken.phone_number = "1337133713371337" + idToken.phone_number_verified = true + } + + // If the profile scope was granted, fake the profile claims. + if (grantScope.indexOf("profile") > -1) { + idToken.name = "Foo Bar" + idToken.given_name = "Foo" + idToken.family_name = "Bar" + idToken.website = "https://www.ory.sh" + idToken.zoneinfo = "Europe/Belrin" + idToken.birthdate = "1.1.2014" + idToken.gender = "robot" + idToken.profile = "https://www.ory.sh" + idToken.preferred_username = "robot" + idToken.middle_name = "Baz" + idToken.locale = "en-US" + idToken.picture = + "https://raw.githubusercontent.com/ory/web/master/static/images/favico.png" + idToken.updated_at = 1604416603 + idToken.nickname = "foobot" + } + + // If the address scope was granted, fake the address claims. + if (grantScope.indexOf("address") > -1) { + idToken.address = { + country: "Localhost", + region: "Intranet", + street_address: "Local Street 1337", + } + } + + return { + access_token: session.access_token, + id_token: { + ...idToken, + ...session.id_token, + }, + } +} diff --git a/frontend/login-consent/tsconfig.json b/frontend/login-consent/tsconfig.json new file mode 100644 index 00000000000..23dd4578934 --- /dev/null +++ b/frontend/login-consent/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "target": "es5", + "module": "commonjs", + "lib": ["es2019", "dom"], + "outDir": "./lib", + "rootDir": "./src", + "strict": true, + "typeRoots": ["./typings"], + "esModuleInterop": true + }, + "exclude": ["contrib"] +} diff --git a/frontend/login-consent/views/consent.pug b/frontend/login-consent/views/consent.pug new file mode 100644 index 00000000000..fa6239f151b --- /dev/null +++ b/frontend/login-consent/views/consent.pug @@ -0,0 +1,35 @@ +extends layout + +block content + h1 An application requests access to your data! + form(action=action, method="POST") + input(type="hidden", name="challenge", value=challenge) + input(type="hidden", name="_csrf", value=csrfToken) + + if client.logo_uri + img(src=client.logo_uri) + + p. + Hi #{user}, application #{client.client_name || client.client_id} wants access resources on your behalf and to: + + each scope in requested_scope + input(type="checkbox", class="grant_scope", id=scope, value=scope, name="grant_scope", checked) + label(for=scope) #{scope} + br + + p. + Do you want to be asked next time when this application wants to access your data? The application will + not be able to ask for more permissions without your consent. + ul + if client.policy_uri + li + a(href=client.policy_uri) Policy + if client.tos_uri + li + a(href=client.tos_uri) Terms of Service + p + input(type="checkbox", id="remember", name="remember", value="1") + label(for="remember") Do not ask me again + p + input(type="submit", id="accept", name="submit", value="Allow access") + input(type="submit", id="reject", name="submit", value="Deny access") diff --git a/frontend/login-consent/views/error.pug b/frontend/login-consent/views/error.pug new file mode 100644 index 00000000000..f62a6662d7d --- /dev/null +++ b/frontend/login-consent/views/error.pug @@ -0,0 +1,7 @@ +extends layout + +block content + h1= message + + if error + pre #{error.stack} diff --git a/frontend/login-consent/views/index.pug b/frontend/login-consent/views/index.pug new file mode 100644 index 00000000000..420643e9b42 --- /dev/null +++ b/frontend/login-consent/views/index.pug @@ -0,0 +1,5 @@ +extends layout + +block content + h1 You have reached the User Login & Consent Flow reference implementation! + p This application will give you an idea of how you could implement the login and consent endpoints yourself. Keep in mind, that this application does not actually solve user login, it has only one user for testing. diff --git a/frontend/login-consent/views/layout.pug b/frontend/login-consent/views/layout.pug new file mode 100644 index 00000000000..25905480a9e --- /dev/null +++ b/frontend/login-consent/views/layout.pug @@ -0,0 +1,6 @@ +doctype html +html + head + title= title + body + block content diff --git a/frontend/login-consent/views/login.pug b/frontend/login-consent/views/login.pug new file mode 100644 index 00000000000..d83183ec39e --- /dev/null +++ b/frontend/login-consent/views/login.pug @@ -0,0 +1,20 @@ +extends layout + +block content + h1(id="login-title") Please log in + if error + p. + #{error} + form(action=action, method="POST") + input(type="hidden", name="_csrf", value=csrfToken) + input(type="hidden", name="challenge", value=challenge) + table(style="") + tr + td + input(type="tel", id="email", name="email", value=hint, placeholder="shadowy@galoy.io") + td. + input(type="checkbox", id="remember", name="remember", value="1") + label(for="remember") Remember me + br + input(type="submit", id="accept", name="submit", value="Log in") + input(type="submit", id="reject", name="submit", value="Deny access") \ No newline at end of file diff --git a/frontend/login-consent/views/logout.pug b/frontend/login-consent/views/logout.pug new file mode 100644 index 00000000000..9b0b8255e43 --- /dev/null +++ b/frontend/login-consent/views/logout.pug @@ -0,0 +1,12 @@ +extends layout + +block content + h1 Do you wish to log out? + if error + p. + #{error} + form(action=action,method="POST") + input(type="hidden",name="_csrf",value=csrfToken) + input(type="hidden",name="challenge",value=challenge) + input(type="submit",id="accept",value="Yes") + input(type="submit",id="reject",value="No") diff --git a/frontend/login-consent/views/verification.pug b/frontend/login-consent/views/verification.pug new file mode 100644 index 00000000000..f79c68fbe67 --- /dev/null +++ b/frontend/login-consent/views/verification.pug @@ -0,0 +1,21 @@ +extends layout + +block content + h1(id="verification-title") Enter Verification Code + if error + p. + #{error} + form(action=action, method="POST") + input(type="hidden", name="_csrf", value=csrfToken) + input(type="hidden", name="challenge", value=challenge) + input(type="hidden", name="email", value=email) + input(type="hidden", name="emailLoginId", value=emailLoginId) + p The code was sent to your email: #{email}. Please enter it below. + table(style="") + tr + td + input(type="text", id="code", name="code", placeholder="Enter code here") + td. + br + input(type="submit", id="accept", name="submit", value="Submit") + input(type="submit", id="reject", name="submit", value="Deny access") diff --git a/frontend/login-consent/yarn.lock b/frontend/login-consent/yarn.lock new file mode 100644 index 00000000000..bc30b48fb32 --- /dev/null +++ b/frontend/login-consent/yarn.lock @@ -0,0 +1,2323 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@ory/hydra-client@^2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@ory/hydra-client/-/hydra-client-2.1.1.tgz" + integrity sha512-fL1Jna/wBJh9fAObklj+XZS2n3002+Wm3BkDk/BcwZ9ylsDlkdEZK0ZhxPocMkX2bhDZAeCVNe7CDCumSu9Kqw== + dependencies: + axios "^0.21.4" + +"@types/axios@^0.14.0": + version "0.14.0" + resolved "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz" + integrity sha512-KqQnQbdYE54D7oa/UmYVMZKq7CO4l8DEENzOKc4aBRwxCXSlJXGz83flFx5L7AWrOQnmuN3kVsRdt+GZPPjiVQ== + dependencies: + axios "*" + +"@types/babel-types@*", "@types/babel-types@^7.0.0": + version "7.0.9" + resolved "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz" + integrity sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA== + +"@types/babylon@^6.16.2": + version "6.16.5" + resolved "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz" + integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w== + dependencies: + "@types/babel-types" "*" + +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.33" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + +"@types/cookie-parser@^1.4.2": + version "1.4.2" + resolved "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.2.tgz" + integrity sha512-uwcY8m6SDQqciHsqcKDGbo10GdasYsPCYkH3hVegj9qAah6pX5HivOnOuI3WYmyQMnOATV39zv/Ybs0bC/6iVg== + dependencies: + "@types/express" "*" + +"@types/csurf@^1.9.36": + version "1.11.0" + resolved "https://registry.npmjs.org/@types/csurf/-/csurf-1.11.0.tgz" + integrity sha512-IwqGRWImcbIdwumGprYR0EgIZ7GAklOIGaNqe2u7jb0YUilg7yrrxXth11VA/AJK8wQWYHxTQagkCE75oaoBvQ== + dependencies: + "@types/express-serve-static-core" "*" + +"@types/express-serve-static-core@*": + version "4.17.14" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz" + integrity sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.7": + version "4.17.9" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz" + integrity sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/mime@*": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/morgan@^1.9.1": + version "1.9.2" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz" + integrity sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "14.14.10" + resolved "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz" + integrity sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ== + +"@types/qs@*": + version "6.9.5" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/serve-favicon@^2.5.4": + version "2.5.4" + resolved "https://registry.npmjs.org/@types/serve-favicon/-/serve-favicon-2.5.4.tgz" + integrity sha512-ly+yd6J/1myO40DKhZGx835/e+DXuLzA2J6dsRyBOzNnQoCsnGcuqkUkMmJD6Q8K9CSZOf+CyxL707WHa1PZGA== + dependencies: + "@types/express" "*" + +"@types/serve-static@*": + version "1.13.8" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz" + integrity sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/url-join@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/url-join/-/url-join-4.0.0.tgz" + integrity sha512-awrJu8yML4E/xTwr2EMatC+HBnHGoDxc2+ImA9QyeUELI1S7dOCIZcyjki1rkwoA8P2D2NVgLAJLjnclkdLtAw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz" + integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= + dependencies: + acorn "^4.0.4" + +acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + +acorn@^4.0.4, acorn@~4.0.2: + version "4.0.13" + resolved "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +array-find-index@^1.0.1, array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0, asap@~2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@*, axios@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axios@^0.21.4: + version "0.21.4" + resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + +body-parser@1.19.2, body-parser@^1.19.0: + version "1.19.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.7" + raw-body "2.4.3" + type-is "~1.6.18" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +character-parser@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz" + integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= + dependencies: + is-regex "^1.0.3" + +chokidar@^3.4.0: + version "3.4.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.1.2" + +clean-css@^4.1.11: + version "4.2.3" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +constantinople@^3.0.1, constantinople@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz" + integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== + dependencies: + "@types/babel-types" "^7.0.0" + "@types/babylon" "^6.16.2" + babel-types "^6.26.0" + babylon "^6.18.0" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-parser@^1.4.5: + version "1.4.5" + resolved "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz" + integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@0.4.2: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +csrf@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/csrf/-/csrf-3.1.0.tgz" + integrity sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w== + dependencies: + rndm "1.2.0" + tsscmp "1.0.6" + uid-safe "2.1.5" + +csurf@^1.11.0: + version "1.11.0" + resolved "https://registry.npmjs.org/csurf/-/csurf-1.11.0.tgz" + integrity sha512-UCtehyEExKTxgiu8UHdGvHj4tnpE/Qctue03Giq5gPgMQ9cg/ciod5blZQ5a4uCEenNQjxyGuzygLdKUmee/bQ== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + csrf "3.1.0" + http-errors "~1.7.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dateformat@~1.0.4-1.2.3: + version "1.0.12" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" + integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== + +decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detect-newline@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +dezalgo@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctypes@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" + integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= + +dynamic-dedupe@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" + integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= + dependencies: + xtend "^4.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +express@^4.17.3: + version "4.17.3" + resolved "https://registry.npmjs.org/express/-/express-4.17.3.tgz" + integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.19.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.2" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.7" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-glob@^3.0.3: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +follow-redirects@^1.14.0, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +git-hooks-list@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz" + integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== + +glob-parent@^5.1.2, glob-parent@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.1, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz" + integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@~1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.1.1: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-expression@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz" + integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= + dependencies: + acorn "~4.0.2" + object-assign "^4.0.1" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-promise@^2.0.0: + version "2.2.2" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.0.3, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-stringify@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" + integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +jstransformer@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz" + integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= + dependencies: + is-promise "^2.0.0" + promise "^7.0.1" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +license-checker@^25.0.1: + version "25.0.1" + resolved "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz" + integrity sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g== + dependencies: + chalk "^2.4.1" + debug "^3.1.0" + mkdirp "^0.5.1" + nopt "^4.0.1" + read-installed "~4.0.3" + semver "^5.5.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + spdx-satisfies "^4.0.0" + treeify "^1.1.0" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.1.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2, ms@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@^2.6.7: + version "2.6.11" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + dependencies: + whatwg-url "^5.0.0" + +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-normalize-package-bin@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.8.0: + version "1.9.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +ory-prettier-styles@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/ory-prettier-styles/-/ory-prettier-styles-1.3.0.tgz" + integrity sha512-Vfn0G6CyLaadwcCamwe1SQCf37ZQfBDgMrhRI70dE/2fbE3Q43/xu7K5c32I5FGt/EliroWty5yBjmdkj0eWug== + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +prettier-plugin-packagejson@^2.2.18: + version "2.2.18" + resolved "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.2.18.tgz" + integrity sha512-iBjQ3IY6IayFrQHhXvg+YvKprPUUiIJ04Vr9+EbeQPfwGajznArIqrN33c5bi4JcIvmLHGROIMOm9aYakJj/CA== + dependencies: + sort-package-json "1.57.0" + +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +promise@^7.0.1: + version "7.3.1" + resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pug-attrs@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz" + integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ== + dependencies: + constantinople "^3.0.1" + js-stringify "^1.0.1" + pug-runtime "^2.0.5" + +pug-code-gen@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz" + integrity sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA== + dependencies: + constantinople "^3.1.2" + doctypes "^1.1.0" + js-stringify "^1.0.1" + pug-attrs "^2.0.4" + pug-error "^1.3.3" + pug-runtime "^2.0.5" + void-elements "^2.0.1" + with "^5.0.0" + +pug-error@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz" + integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ== + +pug-filters@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz" + integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg== + dependencies: + clean-css "^4.1.11" + constantinople "^3.0.1" + jstransformer "1.0.0" + pug-error "^1.3.3" + pug-walk "^1.1.8" + resolve "^1.1.6" + uglify-js "^2.6.1" + +pug-lexer@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz" + integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA== + dependencies: + character-parser "^2.1.1" + is-expression "^3.0.0" + pug-error "^1.3.3" + +pug-linker@^3.0.6: + version "3.0.6" + resolved "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz" + integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg== + dependencies: + pug-error "^1.3.3" + pug-walk "^1.1.8" + +pug-load@^2.0.12: + version "2.0.12" + resolved "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz" + integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg== + dependencies: + object-assign "^4.1.0" + pug-walk "^1.1.8" + +pug-parser@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz" + integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA== + dependencies: + pug-error "^1.3.3" + token-stream "0.0.1" + +pug-runtime@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz" + integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw== + +pug-strip-comments@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz" + integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw== + dependencies: + pug-error "^1.3.3" + +pug-walk@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz" + integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== + +pug@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz" + integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw== + dependencies: + pug-code-gen "^2.0.2" + pug-filters "^3.1.1" + pug-lexer "^4.1.0" + pug-linker "^3.0.6" + pug-load "^2.0.12" + pug-parser "^5.0.1" + pug-runtime "^2.0.5" + pug-strip-comments "^1.0.4" + +qs@6.9.7: + version "6.9.7" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== + +querystring@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.3: + version "2.4.3" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz" + integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== + dependencies: + bytes "3.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz" + integrity sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ== + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-json@^2.0.0: + version "2.1.2" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== + dependencies: + glob "^7.1.1" + json-parse-even-better-errors "^2.3.0" + normalize-package-data "^2.0.0" + npm-normalize-package-bin "^1.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readdir-scoped-modules@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz" + integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +resolve@^1.0.0, resolve@^1.1.6, resolve@^1.10.0: + version "1.19.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= + dependencies: + align-text "^0.1.1" + +rimraf@^2.6.1: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rndm@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz" + integrity sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w= + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +send@0.17.2: + version "0.17.2" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serve-favicon@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz" + integrity sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA== + dependencies: + etag "~1.8.1" + fresh "0.5.2" + ms "2.1.1" + parseurl "~1.3.2" + safe-buffer "5.1.1" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slide@~1.1.3: + version "1.1.6" + resolved "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== + +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== + +sort-package-json@1.57.0: + version "1.57.0" + resolved "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.57.0.tgz" + integrity sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q== + dependencies: + detect-indent "^6.0.0" + detect-newline "3.1.0" + git-hooks-list "1.0.3" + globby "10.0.0" + is-plain-obj "2.1.0" + sort-object-keys "^1.1.3" + +source-map-support@^0.5.12, source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +spdx-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz" + integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A== + dependencies: + array-find-index "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + +spdx-ranges@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz" + integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== + +spdx-satisfies@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz" + integrity sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA== + dependencies: + spdx-compare "^1.0.0" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string.prototype.padend@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.1.tgz" + integrity sha512-eCzTASPnoCr5Ht+Vn1YXgm8SB015hHKgEIMu9Nr9bQmLhRBxKRfmzSj/IQsxDFc8JInJDDFA0qXwK+xxI7wDkg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +string.prototype.trimend@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +token-stream@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz" + integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +ts-node-dev@^1.0.0-pre.43: + version "1.0.0" + resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.0.0.tgz" + integrity sha512-leA/3TgGtnVU77fGngBwVZztqyDRXirytR7dMtMWZS5b2hGpLl+VDnB0F/gf3A+HEPSzS/KwxgXFP7/LtgX4MQ== + dependencies: + chokidar "^3.4.0" + dateformat "~1.0.4-1.2.3" + dynamic-dedupe "^0.3.0" + minimist "^1.2.5" + mkdirp "^1.0.4" + resolve "^1.0.0" + rimraf "^2.6.1" + source-map-support "^0.5.12" + tree-kill "^1.2.2" + ts-node "^9.0.0" + tsconfig "^7.0.0" + +ts-node@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz" + integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tsconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^3.7.5: + version "3.9.7" + resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + +uglify-js@^2.6.1: + version "2.8.29" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= + +uid-safe@2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz" + integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +void-elements@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +with@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/with/-/with-5.1.1.tgz" + integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= + dependencies: + acorn "^3.1.0" + acorn-globals "^3.0.0" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==