From 9928a206774db7ea8591721b3ccdc9f7627ad61d Mon Sep 17 00:00:00 2001
From: Santiago Lo Coco <slococo@itba.edu.ar>
Date: Mon, 19 Dec 2022 20:24:44 -0300
Subject: [PATCH] Update frontend and fix more bugs

Co-authored-by: Ezequiel Bellver <ebellver@itba.edu.ar>
Co-authored-by: Juan Barmasch <jbarmasch@itba.edu.ar>
---
 .gitignore                                    |    2 +
 bsition/api/endpoints/documents.py            |   16 +-
 bsition/api/models/document.py                |    4 +-
 bsition/backend/elastic/search.py             |    8 +-
 bsition/backend/mongo/documents.py            |    1 +
 bsition/backend/postgres/relations.py         |   13 +
 bsition/frontend/nextjs                       |    1 -
 bsition/frontend/nextjs/.gitignore            |   31 +
 bsition/frontend/nextjs/next-env.d.ts         |    5 +
 bsition/frontend/nextjs/package-lock.json     | 3021 +++++++++++++++++
 bsition/frontend/nextjs/package.json          |   27 +
 bsition/frontend/nextjs/postcss.config.js     |    6 +
 bsition/frontend/nextjs/public/favicon.ico    |  Bin 0 -> 25279 bytes
 .../nextjs/src/components/Document.tsx        |  128 +
 .../frontend/nextjs/src/components/Layout.tsx |   16 +
 .../nextjs/src/components/Sidebar.tsx         |  195 ++
 .../src/components/icons/ArticleIcon.jsx      |   22 +
 .../src/components/icons/CollapsIcon.jsx      |   24 +
 .../src/components/icons/CreateIcon.jsx       |   21 +
 .../src/components/icons/DeleteIcon.jsx       |   21 +
 .../nextjs/src/components/icons/HomeIcon.jsx  |   21 +
 .../nextjs/src/components/icons/LockIcon.jsx  |   21 +
 .../nextjs/src/components/icons/Logo.jsx      |   41 +
 .../src/components/icons/LogoutIcon.jsx       |   21 +
 .../src/components/icons/ManageIcon.jsx       |   21 +
 .../src/components/icons/OptionsIcon.jsx      |   21 +
 .../src/components/icons/PublicIcon.jsx       |   21 +
 .../src/components/icons/SearchIcon.jsx       |   21 +
 .../nextjs/src/components/icons/ShareIcon.jsx |   21 +
 .../nextjs/src/components/icons/UsersIcon.jsx |   24 +
 .../src/components/icons/VideosIcon.jsx       |   22 +
 .../nextjs/src/components/icons/index.js      |   16 +
 bsition/frontend/nextjs/src/pages/_app.tsx    |   17 +
 .../frontend/nextjs/src/pages/api/socket.tsx  |   22 +
 .../nextjs/src/pages/create-document.tsx      |   53 +
 .../nextjs/src/pages/documents/[id].tsx       |  134 +
 .../src/pages/documents/[id]/access.tsx       |  133 +
 bsition/frontend/nextjs/src/pages/index.tsx   |   36 +
 bsition/frontend/nextjs/src/pages/login.tsx   |   55 +
 bsition/frontend/nextjs/src/pages/search.tsx  |   98 +
 .../nextjs/src/styles/Home.module.css         |  116 +
 bsition/frontend/nextjs/src/styles/index.css  |  103 +
 .../src/utils/sockets/messageHandler.tsx      |   13 +
 bsition/frontend/nextjs/tailwind.config.js    |   28 +
 bsition/frontend/nextjs/tsconfig.json         |   30 +
 bsition/frontend/nextjs/yarn.lock             |  964 ++++++
 46 files changed, 5627 insertions(+), 8 deletions(-)
 delete mode 160000 bsition/frontend/nextjs
 create mode 100644 bsition/frontend/nextjs/.gitignore
 create mode 100755 bsition/frontend/nextjs/next-env.d.ts
 create mode 100644 bsition/frontend/nextjs/package-lock.json
 create mode 100644 bsition/frontend/nextjs/package.json
 create mode 100644 bsition/frontend/nextjs/postcss.config.js
 create mode 100644 bsition/frontend/nextjs/public/favicon.ico
 create mode 100644 bsition/frontend/nextjs/src/components/Document.tsx
 create mode 100644 bsition/frontend/nextjs/src/components/Layout.tsx
 create mode 100644 bsition/frontend/nextjs/src/components/Sidebar.tsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/LockIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/Logo.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx
 create mode 100644 bsition/frontend/nextjs/src/components/icons/index.js
 create mode 100644 bsition/frontend/nextjs/src/pages/_app.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/api/socket.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/create-document.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/documents/[id].tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/index.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/login.tsx
 create mode 100644 bsition/frontend/nextjs/src/pages/search.tsx
 create mode 100644 bsition/frontend/nextjs/src/styles/Home.module.css
 create mode 100644 bsition/frontend/nextjs/src/styles/index.css
 create mode 100644 bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx
 create mode 100644 bsition/frontend/nextjs/tailwind.config.js
 create mode 100644 bsition/frontend/nextjs/tsconfig.json
 create mode 100644 bsition/frontend/nextjs/yarn.lock

diff --git a/.gitignore b/.gitignore
index 5d51d4e..6724f7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,3 +71,5 @@ cython_debug/
 *_data
 data/
 test.py
+.next
+node_modules
\ No newline at end of file
diff --git a/bsition/api/endpoints/documents.py b/bsition/api/endpoints/documents.py
index 3a9eb2c..9fba1f8 100644
--- a/bsition/api/endpoints/documents.py
+++ b/bsition/api/endpoints/documents.py
@@ -13,9 +13,14 @@ router = APIRouter()
 
 
 @router.post("")
-def create(aux: Document):
-    mongo.create_document(json.loads(json.dumps(aux.__dict__)))
-    return JSONResponse(content={"detail": "Document created"}, status_code=201)
+def create(aux: Document, user: tuple = Depends(get_current_user)):
+    doc_id = mongo.create_document({
+        "name": aux.name,
+        "owner": user[0],
+        "data": aux.data if aux.data is not None else ""
+    })
+    postgres.give_access_doc(user[0], doc_id, 1)
+    return JSONResponse(content={"detail": "Document created", "id": doc_id}, status_code=201)
 
 
 @router.get("")
@@ -42,6 +47,11 @@ def edit_data(aux: DocumentUpdate, id: str):
 
 
 @router.get("/{id}/access")
+def get_doc_access(id: str):
+    return postgres.access_to_doc(id)
+
+
+@router.get("/{id}/access/me")
 def get_access(id: str, user: tuple = Depends(get_current_user)):
     return postgres.has_access_doc(user[0], id)
 
diff --git a/bsition/api/models/document.py b/bsition/api/models/document.py
index 70b4829..5c56d59 100644
--- a/bsition/api/models/document.py
+++ b/bsition/api/models/document.py
@@ -4,9 +4,7 @@ from pydantic.types import Optional
 
 class Document(BaseModel):
     name: str
-    access: list
-    data: str
-    owner: str
+    data: Optional[str]
 
 
 class DocumentUpdate(BaseModel):
diff --git a/bsition/backend/elastic/search.py b/bsition/backend/elastic/search.py
index b97b306..b3d5db9 100644
--- a/bsition/backend/elastic/search.py
+++ b/bsition/backend/elastic/search.py
@@ -26,7 +26,13 @@ def search(index, query, user_id):
     hits = []
     for hit in resp["hits"]["hits"]:
         hits.append(
-            str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"]
+            # str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"]
+            # str(hit["highlight"]) + " ---- " + "%(name)s: %(data)s" % hit["_source"]
+            {
+                "id": hit['_id'],
+                "name": hit['_source']["name"],
+                "highlight": str(hit["highlight"]["data"])
+            }
         )
         print(hit['_id'], hit['_source'])
 
diff --git a/bsition/backend/mongo/documents.py b/bsition/backend/mongo/documents.py
index 064fa86..158f3fa 100644
--- a/bsition/backend/mongo/documents.py
+++ b/bsition/backend/mongo/documents.py
@@ -33,6 +33,7 @@ def create_document(document):
     doc = document.copy()
     docs_coll.insert_one(document)
     elastic.add_document("test-index", document["_id"], doc)
+    return ObjectId(document["_id"]).__str__()
 
 
 def get_document_by_id(id):
diff --git a/bsition/backend/postgres/relations.py b/bsition/backend/postgres/relations.py
index 0e8d63a..c61c4e8 100644
--- a/bsition/backend/postgres/relations.py
+++ b/bsition/backend/postgres/relations.py
@@ -101,6 +101,19 @@ def has_access(user_id, id, destination):
     return list(cur.fetchall())
 
 
+def access_to_doc(id):
+    conn = get_connection()
+    cur = conn.cursor()
+    cur.execute(
+        sql.SQL(
+            "SELECT user_id, username, access_type FROM doc_access JOIN users ON user_id = users.id WHERE doc_id = {id}"
+        ).format(
+            id=sql.Literal(id),
+        )
+    )
+    return list(cur.fetchall())
+
+
 def is_public(doc_id):
     conn = get_connection()
     cur = conn.cursor()
diff --git a/bsition/frontend/nextjs b/bsition/frontend/nextjs
deleted file mode 160000
index fbe106a..0000000
--- a/bsition/frontend/nextjs
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fbe106a1878ccefb909a994cb16507bbf2a2d6ac
diff --git a/bsition/frontend/nextjs/.gitignore b/bsition/frontend/nextjs/.gitignore
new file mode 100644
index 0000000..560fedf
--- /dev/null
+++ b/bsition/frontend/nextjs/.gitignore
@@ -0,0 +1,31 @@
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
diff --git a/bsition/frontend/nextjs/next-env.d.ts b/bsition/frontend/nextjs/next-env.d.ts
new file mode 100755
index 0000000..4f11a03
--- /dev/null
+++ b/bsition/frontend/nextjs/next-env.d.ts
@@ -0,0 +1,5 @@
+/// <reference types="next" />
+/// <reference types="next/image-types/global" />
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/bsition/frontend/nextjs/package-lock.json b/bsition/frontend/nextjs/package-lock.json
new file mode 100644
index 0000000..636957a
--- /dev/null
+++ b/bsition/frontend/nextjs/package-lock.json
@@ -0,0 +1,3021 @@
+{
+  "name": "nextjs-tailwindcss-typescript-starter",
+  "version": "0.1.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "nextjs-tailwindcss-typescript-starter",
+      "version": "0.1.0",
+      "dependencies": {
+        "classnames": "^2.3.1",
+        "next": "12.1.0",
+        "react": "17.0.2",
+        "react-dom": "17.0.2",
+        "socket.io": "^4.5.1",
+        "socket.io-client": "^4.5.1"
+      },
+      "devDependencies": {
+        "@types/node": "^17.0.21",
+        "@types/react": "^17.0.39",
+        "autoprefixer": "^10.4.2",
+        "postcss": "^8.4.7",
+        "postcss-import": "^14.0.2",
+        "tailwindcss": "^3.0.23",
+        "typescript": "^4.6.2"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.15.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+      "dev": true,
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+      "dev": true,
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.15.7",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@next/env": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz",
+      "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
+    },
+    "node_modules/@next/swc-android-arm64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz",
+      "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-arm64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz",
+      "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-darwin-x64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz",
+      "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm-gnueabihf": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz",
+      "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==",
+      "cpu": [
+        "arm"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-gnu": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz",
+      "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-arm64-musl": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz",
+      "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-gnu": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz",
+      "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-linux-x64-musl": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz",
+      "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-arm64-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz",
+      "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==",
+      "cpu": [
+        "arm64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-ia32-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz",
+      "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==",
+      "cpu": [
+        "ia32"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@next/swc-win32-x64-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz",
+      "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==",
+      "cpu": [
+        "x64"
+      ],
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@socket.io/component-emitter": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+      "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
+    },
+    "node_modules/@types/cookie": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+    },
+    "node_modules/@types/cors": {
+      "version": "2.8.13",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+      "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "17.0.21",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
+      "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
+    },
+    "node_modules/@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "dev": true
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.3",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
+      "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
+      "dev": true
+    },
+    "node_modules/@types/react": {
+      "version": "17.0.39",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz",
+      "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==",
+      "dev": true,
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.1",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz",
+      "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==",
+      "dev": true
+    },
+    "node_modules/accepts": {
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn-node": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^7.0.0",
+        "acorn-walk": "^7.0.0",
+        "xtend": "^4.0.2"
+      }
+    },
+    "node_modules/acorn-node/node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "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==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/arg": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
+      "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
+      "dev": true
+    },
+    "node_modules/autoprefixer": {
+      "version": "10.4.2",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
+      "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
+      "dev": true,
+      "dependencies": {
+        "browserslist": "^4.19.1",
+        "caniuse-lite": "^1.0.30001297",
+        "fraction.js": "^4.1.2",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/base64id": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+      "engines": {
+        "node": "^4.5.0 || >= 5.9"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.19.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+      "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
+      "dev": true,
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001312",
+        "electron-to-chromium": "^1.4.71",
+        "escalade": "^3.1.1",
+        "node-releases": "^2.0.2",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/browserslist"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001312",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+      "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/browserslist"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/chalk/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/classnames": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+      "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "node_modules/cookie": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cors": {
+      "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+      "dependencies": {
+        "object-assign": "^4",
+        "vary": "^1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/cosmiconfig": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+      "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true,
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz",
+      "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==",
+      "dev": true
+    },
+    "node_modules/debug": {
+      "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"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+      "dev": true
+    },
+    "node_modules/detective": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+      "dev": true,
+      "dependencies": {
+        "acorn-node": "^1.6.1",
+        "defined": "^1.0.0",
+        "minimist": "^1.1.1"
+      },
+      "bin": {
+        "detective": "bin/detective.js"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/didyoumean": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+      "dev": true
+    },
+    "node_modules/dlv": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+      "dev": true
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.75",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz",
+      "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==",
+      "dev": true
+    },
+    "node_modules/engine.io": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
+      "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
+      "dependencies": {
+        "@types/cookie": "^0.4.1",
+        "@types/cors": "^2.8.12",
+        "@types/node": ">=10.0.0",
+        "accepts": "~1.3.4",
+        "base64id": "2.0.0",
+        "cookie": "~0.4.1",
+        "cors": "~2.8.5",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.3",
+        "ws": "~8.2.3"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/engine.io-client": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz",
+      "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.3",
+        "ws": "~8.2.3",
+        "xmlhttprequest-ssl": "~2.0.0"
+      }
+    },
+    "node_modules/engine.io-parser": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
+      "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/fast-glob": {
+      "version": "3.2.11",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+      "dev": true,
+      "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"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz",
+      "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==",
+      "dev": true,
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "type": "patreon",
+        "url": "https://www.patreon.com/infusion"
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+      "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+      "dev": true,
+      "dependencies": {
+        "import-from": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/import-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+      "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+      "dev": true,
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/import-from/node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "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==",
+      "dev": true
+    },
+    "node_modules/lilconfig": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz",
+      "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "node_modules/loose-envify": {
+      "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"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/micromatch": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+      "dev": true,
+      "dependencies": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.2.3"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "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"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+      "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+      "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/next": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz",
+      "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==",
+      "dependencies": {
+        "@next/env": "12.1.0",
+        "caniuse-lite": "^1.0.30001283",
+        "postcss": "8.4.5",
+        "styled-jsx": "5.0.0",
+        "use-subscription": "1.5.1"
+      },
+      "bin": {
+        "next": "dist/bin/next"
+      },
+      "engines": {
+        "node": ">=12.22.0"
+      },
+      "optionalDependencies": {
+        "@next/swc-android-arm64": "12.1.0",
+        "@next/swc-darwin-arm64": "12.1.0",
+        "@next/swc-darwin-x64": "12.1.0",
+        "@next/swc-linux-arm-gnueabihf": "12.1.0",
+        "@next/swc-linux-arm64-gnu": "12.1.0",
+        "@next/swc-linux-arm64-musl": "12.1.0",
+        "@next/swc-linux-x64-gnu": "12.1.0",
+        "@next/swc-linux-x64-musl": "12.1.0",
+        "@next/swc-win32-arm64-msvc": "12.1.0",
+        "@next/swc-win32-ia32-msvc": "12.1.0",
+        "@next/swc-win32-x64-msvc": "12.1.0"
+      },
+      "peerDependencies": {
+        "fibers": ">= 3.1.0",
+        "node-sass": "^6.0.0 || ^7.0.0",
+        "react": "^17.0.2 || ^18.0.0-0",
+        "react-dom": "^17.0.2 || ^18.0.0-0",
+        "sass": "^1.3.0"
+      },
+      "peerDependenciesMeta": {
+        "fibers": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/next/node_modules/postcss": {
+      "version": "8.4.5",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+      "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+      "dependencies": {
+        "nanoid": "^3.1.30",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
+      "dev": true
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-hash": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+      "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.7",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
+      "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
+      "dev": true,
+      "dependencies": {
+        "nanoid": "^3.3.1",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      }
+    },
+    "node_modules/postcss-import": {
+      "version": "14.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
+      "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
+      "dev": true,
+      "dependencies": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "postcss": "^8.0.0"
+      }
+    },
+    "node_modules/postcss-js": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+      "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+      "dev": true,
+      "dependencies": {
+        "camelcase-css": "^2.0.1"
+      },
+      "engines": {
+        "node": "^12 || ^14 || >= 16"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.3.3"
+      }
+    },
+    "node_modules/postcss-load-config": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
+      "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
+      "dev": true,
+      "dependencies": {
+        "import-cwd": "^3.0.0",
+        "lilconfig": "^2.0.3",
+        "yaml": "^1.10.2"
+      },
+      "engines": {
+        "node": ">= 10"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ts-node": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/postcss-nested": {
+      "version": "5.0.6",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+      "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+      "dev": true,
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.6"
+      },
+      "engines": {
+        "node": ">=12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.2.14"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.9",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
+      "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
+      "dev": true,
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/react": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.2"
+      },
+      "peerDependencies": {
+        "react": "17.0.2"
+      }
+    },
+    "node_modules/read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "dependencies": {
+        "pify": "^2.3.0"
+      }
+    },
+    "node_modules/read-cache/node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/scheduler": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "node_modules/socket.io": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
+      "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
+      "dependencies": {
+        "accepts": "~1.3.4",
+        "base64id": "~2.0.0",
+        "debug": "~4.3.2",
+        "engine.io": "~6.2.1",
+        "socket.io-adapter": "~2.4.0",
+        "socket.io-parser": "~4.2.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-adapter": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
+      "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
+    },
+    "node_modules/socket.io-client": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz",
+      "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.2.3",
+        "socket.io-parser": "~4.2.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/socket.io-parser": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
+      "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+      "dependencies": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/styled-jsx": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz",
+      "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==",
+      "engines": {
+        "node": ">= 12.0.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0 || 17.x.x || 18.x.x"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        },
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tailwindcss": {
+      "version": "3.0.23",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
+      "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
+      "dev": true,
+      "dependencies": {
+        "arg": "^5.0.1",
+        "chalk": "^4.1.2",
+        "chokidar": "^3.5.3",
+        "color-name": "^1.1.4",
+        "cosmiconfig": "^7.0.1",
+        "detective": "^5.2.0",
+        "didyoumean": "^1.2.2",
+        "dlv": "^1.1.3",
+        "fast-glob": "^3.2.11",
+        "glob-parent": "^6.0.2",
+        "is-glob": "^4.0.3",
+        "normalize-path": "^3.0.0",
+        "object-hash": "^2.2.0",
+        "postcss": "^8.4.6",
+        "postcss-js": "^4.0.0",
+        "postcss-load-config": "^3.1.0",
+        "postcss-nested": "5.0.6",
+        "postcss-selector-parser": "^6.0.9",
+        "postcss-value-parser": "^4.2.0",
+        "quick-lru": "^5.1.1",
+        "resolve": "^1.22.0"
+      },
+      "bin": {
+        "tailwind": "lib/cli.js",
+        "tailwindcss": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "autoprefixer": "^10.0.2",
+        "postcss": "^8.0.9"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/tailwindcss/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/tailwindcss/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "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==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz",
+      "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    },
+    "node_modules/use-subscription": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
+      "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
+      "dependencies": {
+        "object-assign": "^4.1.1"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/ws": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+      "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/xmlhttprequest-ssl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+      "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 6"
+      }
+    }
+  },
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.12.11",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.15.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+      "dev": true
+    },
+    "@babel/highlight": {
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.15.7",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@next/env": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz",
+      "integrity": "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
+    },
+    "@next/swc-android-arm64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.0.tgz",
+      "integrity": "sha512-/280MLdZe0W03stA69iL+v6I+J1ascrQ6FrXBlXGCsGzrfMaGr7fskMa0T5AhQIVQD4nA/46QQWxG//DYuFBcA==",
+      "optional": true
+    },
+    "@next/swc-darwin-arm64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.0.tgz",
+      "integrity": "sha512-R8vcXE2/iONJ1Unf5Ptqjk6LRW3bggH+8drNkkzH4FLEQkHtELhvcmJwkXcuipyQCsIakldAXhRbZmm3YN1vXg==",
+      "optional": true
+    },
+    "@next/swc-darwin-x64": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.0.tgz",
+      "integrity": "sha512-ieAz0/J0PhmbZBB8+EA/JGdhRHBogF8BWaeqR7hwveb6SYEIJaDNQy0I+ZN8gF8hLj63bEDxJAs/cEhdnTq+ug==",
+      "optional": true
+    },
+    "@next/swc-linux-arm-gnueabihf": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.0.tgz",
+      "integrity": "sha512-njUd9hpl6o6A5d08dC0cKAgXKCzm5fFtgGe6i0eko8IAdtAPbtHxtpre3VeSxdZvuGFh+hb0REySQP9T1ttkog==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-gnu": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.0.tgz",
+      "integrity": "sha512-OqangJLkRxVxMhDtcb7Qn1xjzFA3s50EIxY7mljbSCLybU+sByPaWAHY4px97ieOlr2y4S0xdPKkQ3BCAwyo6Q==",
+      "optional": true
+    },
+    "@next/swc-linux-arm64-musl": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.0.tgz",
+      "integrity": "sha512-hB8cLSt4GdmOpcwRe2UzI5UWn6HHO/vLkr5OTuNvCJ5xGDwpPXelVkYW/0+C3g5axbDW2Tym4S+MQCkkH9QfWA==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-gnu": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz",
+      "integrity": "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A==",
+      "optional": true
+    },
+    "@next/swc-linux-x64-musl": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz",
+      "integrity": "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw==",
+      "optional": true
+    },
+    "@next/swc-win32-arm64-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.0.tgz",
+      "integrity": "sha512-T/3gIE6QEfKIJ4dmJk75v9hhNiYZhQYAoYm4iVo1TgcsuaKLFa+zMPh4056AHiG6n9tn2UQ1CFE8EoybEsqsSw==",
+      "optional": true
+    },
+    "@next/swc-win32-ia32-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.0.tgz",
+      "integrity": "sha512-iwnKgHJdqhIW19H9PRPM9j55V6RdcOo6rX+5imx832BCWzkDbyomWnlzBfr6ByUYfhohb8QuH4hSGEikpPqI0Q==",
+      "optional": true
+    },
+    "@next/swc-win32-x64-msvc": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.0.tgz",
+      "integrity": "sha512-aBvcbMwuanDH4EMrL2TthNJy+4nP59Bimn8egqv6GHMVj0a44cU6Au4PjOhLNqEh9l+IpRGBqMTzec94UdC5xg==",
+      "optional": true
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@socket.io/component-emitter": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+      "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
+    },
+    "@types/cookie": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+      "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+    },
+    "@types/cors": {
+      "version": "2.8.13",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
+      "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/node": {
+      "version": "17.0.21",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz",
+      "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
+    },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "dev": true
+    },
+    "@types/prop-types": {
+      "version": "15.7.3",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
+      "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
+      "dev": true
+    },
+    "@types/react": {
+      "version": "17.0.39",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz",
+      "integrity": "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug==",
+      "dev": true,
+      "requires": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "@types/scheduler": {
+      "version": "0.16.1",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz",
+      "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==",
+      "dev": true
+    },
+    "accepts": {
+      "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==",
+      "requires": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      }
+    },
+    "acorn-node": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
+      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.0.0",
+        "acorn-walk": "^7.0.0",
+        "xtend": "^4.0.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        }
+      }
+    },
+    "acorn-walk": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+      "dev": true
+    },
+    "ansi-styles": {
+      "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==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "dev": true,
+      "requires": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      }
+    },
+    "arg": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
+      "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "10.4.2",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
+      "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.19.1",
+        "caniuse-lite": "^1.0.30001297",
+        "fraction.js": "^4.1.2",
+        "normalize-range": "^0.1.2",
+        "picocolors": "^1.0.0",
+        "postcss-value-parser": "^4.2.0"
+      }
+    },
+    "base64id": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+    },
+    "binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "dev": true
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "browserslist": {
+      "version": "4.19.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz",
+      "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001312",
+        "electron-to-chromium": "^1.4.71",
+        "escalade": "^3.1.1",
+        "node-releases": "^2.0.2",
+        "picocolors": "^1.0.0"
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true
+    },
+    "camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "dev": true
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001312",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+      "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ=="
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "dev": true,
+      "requires": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      }
+    },
+    "classnames": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
+      "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
+    },
+    "cors": {
+      "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+      "requires": {
+        "object-assign": "^4",
+        "vary": "^1"
+      }
+    },
+    "cosmiconfig": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+      "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+      "dev": true,
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      }
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true
+    },
+    "csstype": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz",
+      "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==",
+      "dev": true
+    },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+      "dev": true
+    },
+    "detective": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
+      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
+      "dev": true,
+      "requires": {
+        "acorn-node": "^1.6.1",
+        "defined": "^1.0.0",
+        "minimist": "^1.1.1"
+      }
+    },
+    "didyoumean": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+      "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+      "dev": true
+    },
+    "dlv": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+      "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.4.75",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz",
+      "integrity": "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q==",
+      "dev": true
+    },
+    "engine.io": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
+      "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
+      "requires": {
+        "@types/cookie": "^0.4.1",
+        "@types/cors": "^2.8.12",
+        "@types/node": ">=10.0.0",
+        "accepts": "~1.3.4",
+        "base64id": "2.0.0",
+        "cookie": "~0.4.1",
+        "cors": "~2.8.5",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.3",
+        "ws": "~8.2.3"
+      }
+    },
+    "engine.io-client": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz",
+      "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==",
+      "requires": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1",
+        "engine.io-parser": "~5.0.3",
+        "ws": "~8.2.3",
+        "xmlhttprequest-ssl": "~2.0.0"
+      }
+    },
+    "engine.io-parser": {
+      "version": "5.0.4",
+      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
+      "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "fast-glob": {
+      "version": "3.2.11",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+      "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+      "dev": true,
+      "requires": {
+        "@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": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "fraction.js": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz",
+      "integrity": "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg==",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+      "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+      "dev": true,
+      "requires": {
+        "import-from": "^3.0.0"
+      }
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
+    "import-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+      "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "^2.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "json-parse-even-better-errors": {
+      "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==",
+      "dev": true
+    },
+    "lilconfig": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz",
+      "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==",
+      "dev": true
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+      "dev": true,
+      "requires": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.2.3"
+      }
+    },
+    "mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+    },
+    "mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "requires": {
+        "mime-db": "1.52.0"
+      }
+    },
+    "minimist": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+      "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+      "dev": true
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "nanoid": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
+      "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
+    },
+    "negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+    },
+    "next": {
+      "version": "12.1.0",
+      "resolved": "https://registry.npmjs.org/next/-/next-12.1.0.tgz",
+      "integrity": "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==",
+      "requires": {
+        "@next/env": "12.1.0",
+        "@next/swc-android-arm64": "12.1.0",
+        "@next/swc-darwin-arm64": "12.1.0",
+        "@next/swc-darwin-x64": "12.1.0",
+        "@next/swc-linux-arm-gnueabihf": "12.1.0",
+        "@next/swc-linux-arm64-gnu": "12.1.0",
+        "@next/swc-linux-arm64-musl": "12.1.0",
+        "@next/swc-linux-x64-gnu": "12.1.0",
+        "@next/swc-linux-x64-musl": "12.1.0",
+        "@next/swc-win32-arm64-msvc": "12.1.0",
+        "@next/swc-win32-ia32-msvc": "12.1.0",
+        "@next/swc-win32-x64-msvc": "12.1.0",
+        "caniuse-lite": "^1.0.30001283",
+        "postcss": "8.4.5",
+        "styled-jsx": "5.0.0",
+        "use-subscription": "1.5.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "8.4.5",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+          "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+          "requires": {
+            "nanoid": "^3.1.30",
+            "picocolors": "^1.0.0",
+            "source-map-js": "^1.0.1"
+          }
+        }
+      }
+    },
+    "node-releases": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
+      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
+      "dev": true
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-hash": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
+      "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
+      "dev": true
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "dev": true
+    },
+    "picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true
+    },
+    "postcss": {
+      "version": "8.4.7",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
+      "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
+      "dev": true,
+      "requires": {
+        "nanoid": "^3.3.1",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      }
+    },
+    "postcss-import": {
+      "version": "14.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz",
+      "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==",
+      "dev": true,
+      "requires": {
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
+      }
+    },
+    "postcss-js": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
+      "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+      "dev": true,
+      "requires": {
+        "camelcase-css": "^2.0.1"
+      }
+    },
+    "postcss-load-config": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
+      "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
+      "dev": true,
+      "requires": {
+        "import-cwd": "^3.0.0",
+        "lilconfig": "^2.0.3",
+        "yaml": "^1.10.2"
+      }
+    },
+    "postcss-nested": {
+      "version": "5.0.6",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+      "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.6"
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.9",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
+      "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+      "dev": true
+    },
+    "queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true
+    },
+    "quick-lru": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+      "dev": true
+    },
+    "react": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "react-dom": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.2"
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "scheduler": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "socket.io": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
+      "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
+      "requires": {
+        "accepts": "~1.3.4",
+        "base64id": "~2.0.0",
+        "debug": "~4.3.2",
+        "engine.io": "~6.2.1",
+        "socket.io-adapter": "~2.4.0",
+        "socket.io-parser": "~4.2.1"
+      }
+    },
+    "socket.io-adapter": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
+      "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
+    },
+    "socket.io-client": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz",
+      "integrity": "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g==",
+      "requires": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.2",
+        "engine.io-client": "~6.2.3",
+        "socket.io-parser": "~4.2.1"
+      }
+    },
+    "socket.io-parser": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
+      "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
+      "requires": {
+        "@socket.io/component-emitter": "~3.1.0",
+        "debug": "~4.3.1"
+      }
+    },
+    "source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+    },
+    "styled-jsx": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz",
+      "integrity": "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==",
+      "requires": {}
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
+    "tailwindcss": {
+      "version": "3.0.23",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
+      "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
+      "dev": true,
+      "requires": {
+        "arg": "^5.0.1",
+        "chalk": "^4.1.2",
+        "chokidar": "^3.5.3",
+        "color-name": "^1.1.4",
+        "cosmiconfig": "^7.0.1",
+        "detective": "^5.2.0",
+        "didyoumean": "^1.2.2",
+        "dlv": "^1.1.3",
+        "fast-glob": "^3.2.11",
+        "glob-parent": "^6.0.2",
+        "is-glob": "^4.0.3",
+        "normalize-path": "^3.0.0",
+        "object-hash": "^2.2.0",
+        "postcss": "^8.4.6",
+        "postcss-js": "^4.0.0",
+        "postcss-load-config": "^3.1.0",
+        "postcss-nested": "5.0.6",
+        "postcss-selector-parser": "^6.0.9",
+        "postcss-value-parser": "^4.2.0",
+        "quick-lru": "^5.1.1",
+        "resolve": "^1.22.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "glob-parent": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+          "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.3"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "to-regex-range": {
+      "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==",
+      "dev": true,
+      "requires": {
+        "is-number": "^7.0.0"
+      }
+    },
+    "typescript": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz",
+      "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==",
+      "dev": true
+    },
+    "use-subscription": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz",
+      "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==",
+      "requires": {
+        "object-assign": "^4.1.1"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+    },
+    "ws": {
+      "version": "8.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
+      "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
+      "requires": {}
+    },
+    "xmlhttprequest-ssl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
+      "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "dev": true
+    }
+  }
+}
diff --git a/bsition/frontend/nextjs/package.json b/bsition/frontend/nextjs/package.json
new file mode 100644
index 0000000..81ff3ab
--- /dev/null
+++ b/bsition/frontend/nextjs/package.json
@@ -0,0 +1,27 @@
+{
+  "name": "nextjs-tailwindcss-typescript-starter",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "dev": "next dev",
+    "build": "next build",
+    "start": "next start"
+  },
+  "dependencies": {
+    "classnames": "^2.3.1",
+    "next": "12.1.0",
+    "react": "17.0.2",
+    "react-dom": "17.0.2",
+    "socket.io": "^4.5.1",
+    "socket.io-client": "^4.5.1"
+  },
+  "devDependencies": {
+    "@types/node": "^17.0.21",
+    "@types/react": "^17.0.39",
+    "autoprefixer": "^10.4.2",
+    "postcss": "^8.4.7",
+    "postcss-import": "^14.0.2",
+    "tailwindcss": "^3.0.23",
+    "typescript": "^4.6.2"
+  }
+}
diff --git a/bsition/frontend/nextjs/postcss.config.js b/bsition/frontend/nextjs/postcss.config.js
new file mode 100644
index 0000000..dc301c1
--- /dev/null
+++ b/bsition/frontend/nextjs/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+    plugins: [
+        'tailwindcss',
+        'autoprefixer',
+    ]
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/public/favicon.ico b/bsition/frontend/nextjs/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..23c8e34425e8c019fb0f9ba61b4bd7133cd10951
GIT binary patch
literal 25279
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
WbMxS28~jHK5_J`A<w`|V#D4*5F3bS{

literal 0
HcmV?d00001

diff --git a/bsition/frontend/nextjs/src/components/Document.tsx b/bsition/frontend/nextjs/src/components/Document.tsx
new file mode 100644
index 0000000..a7c9e92
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/Document.tsx
@@ -0,0 +1,128 @@
+import io from "socket.io-client";
+import { useState, useEffect } from "react";
+
+let socket;
+
+export default function Document() {
+  const [username, setUsername] = useState("");
+  const [chosenUsername, setChosenUsername] = useState("");
+  const [text, setText] = useState("");
+  const [token, setToken] = useState("");
+
+  useEffect(() => {
+    socketInitializer();
+  }, [chosenUsername]);
+
+  useEffect(() => {
+    const data = new URLSearchParams();
+    data.append("username", "user")
+    data.append("password", "passtest")
+
+    const fetchData = async (data) => {
+        const res = await fetch("http://localhost:8000/api/token", { method: 'POST', body: data})
+        const json = await res.json();
+        setToken(() => json["access_token"])
+      }
+
+      fetchData(data)
+  }, [])
+
+  useEffect(() => {
+    if (token) {
+        const fetchData = async () => {
+            const res = await fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", {
+                method: "GET",
+                headers: {
+                    'Authorization': `Bearer ${token}`
+                }
+            })
+            const json = await res.json();
+            setText(() => json["data"])
+        }
+
+        fetchData()
+    }
+  }, [token])
+
+  useEffect(() => {
+    const interval = setInterval(() => {
+      fetch("http://localhost:8000/api/documents/63866c991b4175934db26981", {
+        method: 'PUT',
+        body: `{"data": "${text}"}`,
+        headers: {
+            'Content-type': 'application/json',
+            'Authorization': `Bearer ${token}`
+        }
+    })
+    }, 500);
+
+    return () => clearInterval(interval);
+  }, [token, text])
+
+  const socketInitializer = async () => {
+    await fetch("/api/socket");
+
+    socket = io();
+
+    socket.emit('create', chosenUsername);
+    console.log(chosenUsername)
+
+    socket.on("newIncomingText", (text) => {
+        setText(() => text);
+        console.log('text' + text);
+      });
+  };
+
+  const sendText = async () => {
+    socket.emit("createdText", text, chosenUsername);
+    setText(() => text);
+  };
+
+  const handleKey = () => {
+    if (text) {
+      sendText();
+    }
+  };
+
+  return (
+    <div className="flex items-center p-4 mx-auto min-h-screen justify-center bg-purple-500">
+      <main className="gap-4 flex flex-col items-center justify-center w-full h-full">
+        {!chosenUsername ? (
+          <>
+            <h3 className="font-bold text-white text-xl">
+              doc_id?
+            </h3>
+            <input
+              type="text"
+              placeholder="Identity..."
+              value={username}
+              className="p-3 rounded-md outline-none"
+              onChange={(e) => setUsername(e.target.value)}
+            />
+            <button
+              onClick={() => {
+                setChosenUsername(username);
+              }}
+              className="bg-white rounded-md px-4 py-2 text-xl"
+            >
+              Go!
+            </button>
+          </>
+        ) : (
+          <>
+            <p className="font-bold text-white text-xl">
+              Your username: {username}
+            </p>
+
+            <textarea
+                placeholder="Type..."
+                onKeyUp={handleKey}
+                value={text}
+                onChange={(e) => setText(e.target.value)}
+            />
+          </>
+        )}
+      </main>
+    </div>
+  );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/components/Layout.tsx b/bsition/frontend/nextjs/src/components/Layout.tsx
new file mode 100644
index 0000000..3fc7a3b
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/Layout.tsx
@@ -0,0 +1,16 @@
+import React from "react";
+import Sidebar from "./Sidebar";
+
+const Layout = ({ children }) => {
+  return (
+    <div className="h-screen flex flex-row justify-start">
+      <Sidebar />
+      <div
+          className="bg-primary flex-1 p-4 text-white justify-center align-center h-full">
+          {children}
+      </div>
+    </div>
+  );
+};
+
+export default Layout;
diff --git a/bsition/frontend/nextjs/src/components/Sidebar.tsx b/bsition/frontend/nextjs/src/components/Sidebar.tsx
new file mode 100644
index 0000000..0710a13
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/Sidebar.tsx
@@ -0,0 +1,195 @@
+import classNames from "classnames";
+import Link from "next/link";
+import { useRouter } from "next/router";
+import React, {useState, useMemo, useEffect} from "react";
+import {
+  ArticleIcon,
+  CollapsIcon,
+  LogoIcon,
+  LogoutIcon,
+  SearchIcon,
+  HomeIcon,
+  CreateIcon
+} from "./icons";
+
+const Sidebar = () => {
+  const [toggleCollapse, setToggleCollapse] = useState(false);
+  const [isCollapsible, setIsCollapsible] = useState(false);
+  const [menuItems, setMenuItems] = useState([
+      { id: 1, label: "Home", icon: HomeIcon, link: "/" },
+      { id: 2, label: "Search", icon: SearchIcon, link: "/search" },
+      { id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" }
+  ]);
+  const [token, setToken] = useState("");
+
+  useEffect(() => {
+      setToken(() => localStorage.getItem("token"))
+  }, [])
+
+  useEffect(() => {
+    if (token) {
+        const fetchData = async () => {
+            const res = await fetch("http://localhost:8000/api/documents", {
+                method: "GET",
+                headers: {
+                    'Authorization': `Bearer ${token}`
+                }
+            })
+            let json = await res.json();
+            let list = [
+                { id: 1, label: "Home", icon: HomeIcon, link: "/" },
+                { id: 2, label: "Search", icon: SearchIcon, link: "/search" },
+                { id: 3, label: "Create document", icon: CreateIcon, link: "/create-document" }
+            ]
+            json.forEach((doc) => {
+                list.push({
+                    id: doc["id"],
+                    label: doc["name"],
+                    icon: ArticleIcon,
+                    link: `/documents/${doc["id"]}`
+                })
+            })
+
+            setMenuItems(() => list)
+        }
+
+        fetchData()
+    }
+  }, [token])
+
+  const router = useRouter();
+
+  const activeMenu = useMemo(
+    () => menuItems.find((menu) => {
+        if (!router.query.id || router.query.id === 'undefined') {
+            return menu.link === router.pathname
+        } else if (!(menu.id === 1 || menu.id === 2 || menu.id === 3)) {
+            return menu.id.toString() === router.query.id
+        }
+        return true
+    }),
+    [menuItems, router.query.id, router.pathname]
+  );
+
+  const wrapperClasses = classNames(
+    "h-screen px-4 pt-8 pb-4 bg-light flex justify-between flex-col",
+    {
+      ["w-80"]: !toggleCollapse,
+      ["w-20"]: toggleCollapse,
+    }
+  );
+
+  const collapseIconClasses = classNames(
+    "p-4 rounded bg-light-lighter absolute right-0",
+    {
+      "rotate-180": toggleCollapse,
+    }
+  );
+
+  const getNavItemClasses = (menu) => {
+    return classNames(
+      "flex items-center cursor-pointer hover:bg-light-lighter rounded w-full overflow-hidden whitespace-nowrap",
+      {
+        ["bg-light-lighter"]: activeMenu.id === menu.id,
+      }
+    );
+  };
+
+  const onMouseOver = () => {
+    setIsCollapsible(!isCollapsible);
+  };
+
+  const handleSidebarToggle = () => {
+    setToggleCollapse(!toggleCollapse);
+  };
+
+  const handleSubmit = async (event) => {
+        event.preventDefault()
+
+        const res = await fetch("http://localhost:8000/api/token", {
+            method: "DELETE",
+            headers: {
+                'Authorization': `Bearer ${token}`
+            }
+        });
+
+        localStorage.removeItem("token")
+        router.push("/")
+    }
+
+  return (
+    <div
+      className={wrapperClasses}
+      onMouseEnter={onMouseOver}
+      onMouseLeave={onMouseOver}
+      style={{ transition: "width 300ms cubic-bezier(0.2, 0, 0, 1) 0s" }}
+    >
+      <div className="flex flex-col">
+        <div className="flex items-center justify-between relative">
+          <div className="flex items-center pl-1 gap-4">
+            <LogoIcon />
+            <span
+              className={classNames("mt-2 text-lg font-medium text-text", {
+                hidden: toggleCollapse,
+              })}
+            >
+              BSition
+            </span>
+          </div>
+          {isCollapsible && (
+            <button
+              className={collapseIconClasses}
+              onClick={handleSidebarToggle}
+            >
+              <CollapsIcon />
+            </button>
+          )}
+
+        </div>
+
+        <div className="flex flex-col items-start mt-24">
+          {menuItems.map(({ icon: Icon, ...menu }) => {
+            const classes = getNavItemClasses(menu);
+            return (
+              <div className={classes} key={menu.id}>
+                <Link href={menu.link}>
+                  <a className="flex py-4 px-3 items-center w-full h-full">
+                    <div style={{ width: "2.5rem" }}>
+                      <Icon />
+                    </div>
+                    {!toggleCollapse && (
+                      <span
+                        className={classNames(
+                          "text-md font-medium text-text-light"
+                        )}
+                      >
+                        {menu.label}
+                      </span>
+                    )}
+                  </a>
+                </Link>
+              </div>
+            );
+          })}
+        </div>
+      </div>
+
+      <div className={`${getNavItemClasses({})} px-3 py-4`}>
+        <div style={{ width: "2.5rem" }}>
+          <LogoutIcon />
+        </div>
+        {!toggleCollapse && (
+            <form onSubmit={handleSubmit}>
+        <button name="Logout" value="logout">
+          <span className={classNames("text-md font-medium text-text-light")}>
+            Logout
+          </span>
+        </button>
+            </form>
+        )}
+      </div>
+    </div>
+  );
+};
+
+export default Sidebar;
diff --git a/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx
new file mode 100644
index 0000000..a136b22
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/ArticleIcon.jsx
@@ -0,0 +1,22 @@
+import * as React from "react";
+
+function ArticleIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+        d="M19 5v14H5V5h14zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
+        fill={fill}
+      />
+      <path d="M14 17H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z" fill={fill} />
+    </svg>
+  );
+}
+
+export default ArticleIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx b/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx
new file mode 100644
index 0000000..706fcb3
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/CollapsIcon.jsx
@@ -0,0 +1,24 @@
+import * as React from "react";
+
+function CollapsIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={16}
+      height={15}
+      fill="none"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+        d="M8.901 1.768L7.134 0 0 7.134l7.134 7.133L8.9 12.5 3.535 7.134l5.366-5.367z"
+        fill={fill}
+      />
+      <path
+        d="M13.384 0L6.25 7.134l7.134 7.133L15.15 12.5 9.785 7.134l5.366-5.367L13.384 0z"
+        fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default CollapsIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx b/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx
new file mode 100644
index 0000000..6c724cb
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/CreateIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function CreateIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 16 16"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default CreateIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx b/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx
new file mode 100644
index 0000000..ab1485a
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/DeleteIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function DeleteIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M7 4a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v2h4a1 1 0 1 1 0 2h-1.069l-.867 12.142A2 2 0 0 1 17.069 22H6.93a2 2 0 0 1-1.995-1.858L4.07 8H3a1 1 0 0 1 0-2h4V4zm2 2h6V4H9v2zM6.074 8l.857 12H17.07l.857-12H6.074z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default DeleteIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx b/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx
new file mode 100644
index 0000000..2f6e04a
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/HomeIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function HomeIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+        d="M3 13h1v7c0 1.103.897 2 2 2h12c1.103 0 2-.897 2-2v-7h1a1.001 1.001 0 00.707-1.707l-9-9a1 1 0 00-1.414 0l-9 9A1 1 0 003 13zm7 7v-5h4v5h-4zm2-15.586l6 6V15l.001 5H16v-5c0-1.103-.897-2-2-2h-4c-1.103 0-2 .897-2 2v5H6v-9.586l6-6z"
+        fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default HomeIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx b/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx
new file mode 100644
index 0000000..c57c82a
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/LockIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function LockIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="-2.5 -2.5 21.5 21.5"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default LockIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/Logo.jsx b/bsition/frontend/nextjs/src/components/icons/Logo.jsx
new file mode 100644
index 0000000..1a44f8a
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/Logo.jsx
@@ -0,0 +1,41 @@
+import * as React from "react";
+
+function Logo({ fill = "#3B81F6", ...rest }) {
+  return (
+    <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="40.000000pt" height="40.000000pt" viewBox="0 0 500.000000 500.000000"
+ preserveAspectRatio="xMidYMid meet">
+
+<g transform="translate(0.000000,500.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M3020 4444 c-138 -12 -603 -47 -855 -64 -159 -11 -371 -27 -470 -35
+-99 -8 -283 -21 -410 -30 -500 -33 -538 -40 -595 -98 -71 -71 -65 49 -65
+-1387 l0 -1295 42 -80 c24 -44 85 -134 136 -200 51 -66 182 -235 291 -375 223
+-288 253 -315 357 -330 35 -5 96 -7 134 -4 39 2 295 18 570 34 748 45 1638 98
+1833 110 258 16 330 45 379 155 17 38 18 115 21 1400 2 748 0 1385 -3 1415 -6
+50 -12 60 -58 105 -29 28 -84 71 -122 98 -39 26 -95 65 -125 86 -356 253 -618
+431 -673 460 -68 35 -70 36 -205 37 -76 1 -157 0 -182 -2z m318 -237 c32 -13
+143 -85 250 -162 106 -77 206 -148 222 -158 27 -17 48 -52 37 -63 -2 -2 -157
+-13 -343 -24 -339 -19 -558 -32 -1504 -91 -278 -17 -529 -29 -558 -26 -29 3
+-72 16 -96 30 -78 44 -396 299 -396 318 0 35 40 48 185 59 77 6 196 15 265 20
+69 6 251 19 405 30 398 27 940 67 1145 84 218 18 312 14 388 -17z m744 -658
+c9 -5 24 -28 32 -51 15 -39 16 -158 14 -1233 -3 -1116 -4 -1192 -21 -1222 -23
+-44 -62 -62 -144 -68 -81 -7 -822 -50 -1108 -65 -110 -6 -342 -19 -515 -30
+-820 -50 -853 -50 -900 -5 -17 16 -35 45 -41 65 -6 23 -9 431 -7 1217 3 1181
+3 1182 24 1210 11 15 32 33 46 40 13 7 108 17 214 23 104 6 374 22 599 35 226
+14 457 27 515 30 58 3 290 17 515 31 757 46 734 45 777 23z"/>
+<path d="M1950 3121 l0 -140 88 -3 87 -3 3 -766 c2 -759 2 -766 -18 -792 -23
+-30 -74 -47 -137 -47 l-43 0 0 -130 0 -130 503 0 c622 0 729 11 901 94 204 99
+310 264 323 503 15 278 -97 443 -376 550 -22 8 -19 11 42 51 151 98 227 240
+227 422 -1 270 -146 439 -434 502 -83 18 -139 21 -628 25 l-538 5 0 -141z
+m1030 -185 c63 -24 116 -62 142 -105 20 -31 23 -49 23 -141 0 -98 -2 -109 -30
+-160 -65 -119 -182 -159 -467 -160 l-128 0 0 296 0 296 208 -4 c161 -4 217 -9
+252 -22z m-7 -861 c165 -35 250 -124 272 -285 8 -56 -10 -161 -35 -211 -28
+-54 -102 -114 -173 -140 -56 -20 -85 -23 -289 -27 l-228 -4 0 341 0 341 193 0
+c128 0 215 -5 260 -15z"/>
+</g>
+</svg>
+  );
+}
+
+export default Logo;
diff --git a/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx b/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx
new file mode 100644
index 0000000..42f5464
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/LogoutIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function LogoutIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={16}
+      height={19}
+      fill="none"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+        d="M8 19c4.411 0 8-3.589 8-8 0-3.35-2.072-6.22-5-7.41v2.222A6 6 0 0114 11c0 3.31-2.691 6-6 6s-6-2.69-6-6a5.999 5.999 0 013-5.188V3.59C2.072 4.78 0 7.65 0 11c0 4.411 3.589 8 8 8z"
+        fill={fill}
+      />
+      <path d="M7 0h2v10H7V0z" fill={fill} />
+    </svg>
+  );
+}
+
+export default LogoutIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx
new file mode 100644
index 0000000..aaf2f5b
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/ManageIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function ManageIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="-2.5 -2.5 21.5 21.5"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M.102 2.223A3.004 3.004 0 0 0 3.78 5.897l6.341 6.252A3.003 3.003 0 0 0 13 16a3 3 0 1 0-.851-5.878L5.897 3.781A3.004 3.004 0 0 0 2.223.1l2.141 2.142L4 4l-1.757.364L.102 2.223zm13.37 9.019.528.026.287.445.445.287.026.529L15 13l-.242.471-.026.529-.445.287-.287.445-.529.026L13 15l-.471-.242-.529-.026-.287-.445-.445-.287-.026-.529L11 13l.242-.471.026-.529.445-.287.287-.445.529-.026L13 11l.471.242z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default ManageIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx b/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx
new file mode 100644
index 0000000..bd5251e
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/OptionsIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function OptionsIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="-2.5 -2.5 21.5 21.5"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default OptionsIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx b/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx
new file mode 100644
index 0000000..4a7a72b
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/PublicIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function PublicIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M221.6,173.3A102.9,102.9,0,0,0,232,128,104.2,104.2,0,0,0,154.8,27.5h-.5A103.8,103.8,0,0,0,60.4,49l-1.3,1.2A103.9,103.9,0,0,0,128,232h2.4A104.3,104.3,0,0,0,221,174.6h0ZM216,128a89.3,89.3,0,0,1-5.5,30.7l-46.4-28.5a16,16,0,0,0-6.3-2.3l-22.8-3a16.1,16.1,0,0,0-15.3,6.8h-8.6l-3.8-7.9a16.2,16.2,0,0,0-11-8.7l-6.6-1.4,2.5-5.9a8.1,8.1,0,0,1,7.4-4.9h16.1a16.1,16.1,0,0,0,7.7-2l12.2-6.8a16.1,16.1,0,0,0,3-2.1l26.9-24.4A15.7,15.7,0,0,0,170,50.7,88,88,0,0,1,216,128ZM40,128a87.1,87.1,0,0,1,9.5-39.7l10.4,27.9a16.1,16.1,0,0,0,11.6,10l5.5,1.2h.1l12,2.6a7.8,7.8,0,0,1,5.5,4.3l2.1,4.4a16.1,16.1,0,0,0,14.4,9h1.2l-7.7,17.2a15.9,15.9,0,0,0,2.8,17.4l16.1,17.4a8.3,8.3,0,0,1,2,6.9l-1.8,9.3A88.1,88.1,0,0,1,40,128Z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default PublicIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx b/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx
new file mode 100644
index 0000000..f802ccc
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/SearchIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function SearchIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="-2 -2 22 22"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default SearchIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx b/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx
new file mode 100644
index 0000000..6d8f495
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/ShareIcon.jsx
@@ -0,0 +1,21 @@
+import * as React from "react";
+
+function ShareIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="-2.5 -2.5 21.5 21.5"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+          d="M11 2.5a2.5 2.5 0 1 1 .603 1.628l-6.718 3.12a2.499 2.499 0 0 1 0 1.504l6.718 3.12a2.5 2.5 0 1 1-.488.876l-6.718-3.12a2.5 2.5 0 1 1 0-3.256l6.718-3.12A2.5 2.5 0 0 1 11 2.5z"
+          fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default ShareIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx b/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx
new file mode 100644
index 0000000..25efc45
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/UsersIcon.jsx
@@ -0,0 +1,24 @@
+import * as React from "react";
+
+function UsersIcon({ stroke = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path
+        d="M12 4.354a4 4 0 110 5.292V4.354zM15 21H3v-1a6 6 0 1112 0v1zm0 0h6v-1a6 6 0 00-9-5.197L15 21zM13 7a4 4 0 11-8 0 4 4 0 018 0v0z"
+        stroke={stroke}
+        strokeWidth={2}
+        strokeLinecap="round"
+        strokeLinejoin="round"
+      />
+    </svg>
+  );
+}
+
+export default UsersIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx b/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx
new file mode 100644
index 0000000..86a6a6e
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/VideosIcon.jsx
@@ -0,0 +1,22 @@
+import * as React from "react";
+
+function VideosIcon({ fill = "#6C7281", ...rest }) {
+  return (
+    <svg
+      width={24}
+      height={24}
+      fill="none"
+      viewBox="0 0 24 24"
+      xmlns="http://www.w3.org/2000/svg"
+      {...rest}
+    >
+      <path d="M4 8H2v12a2 2 0 002 2h12v-2H4V8z" fill={fill} />
+      <path
+        d="M20 2H8a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V4a2 2 0 00-2-2zm-9 12V6l7 4-7 4z"
+        fill={fill}
+      />
+    </svg>
+  );
+}
+
+export default VideosIcon;
diff --git a/bsition/frontend/nextjs/src/components/icons/index.js b/bsition/frontend/nextjs/src/components/icons/index.js
new file mode 100644
index 0000000..e06a7fe
--- /dev/null
+++ b/bsition/frontend/nextjs/src/components/icons/index.js
@@ -0,0 +1,16 @@
+export { default as ArticleIcon } from "./ArticleIcon";
+export { default as HomeIcon } from "./HomeIcon";
+export { default as UsersIcon } from "./UsersIcon";
+export { default as VideosIcon } from "./VideosIcon";
+export { default as CollapsIcon } from "./CollapsIcon";
+export { default as LogoIcon } from "./Logo";
+export { default as LogoutIcon } from "./LogoutIcon";
+export { default as SearchIcon } from "./SearchIcon";
+export { default as ShareIcon } from "./ShareIcon";
+export { default as LockIcon } from "./LockIcon";
+export { default as PublicIcon } from "./PublicIcon";
+export { default as DeleteIcon } from "./DeleteIcon";
+export { default as OptionsIcon } from "./OptionsIcon";
+export { default as ManageIcon } from "./ManageIcon";
+export { default as CreateIcon } from "./CreateIcon";
+
diff --git a/bsition/frontend/nextjs/src/pages/_app.tsx b/bsition/frontend/nextjs/src/pages/_app.tsx
new file mode 100644
index 0000000..7a4ff3e
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/_app.tsx
@@ -0,0 +1,17 @@
+import Head from 'next/head'
+import {AppProps} from 'next/app'
+import '../styles/index.css'
+
+function MyApp({Component, pageProps}: AppProps) {
+    return (
+        <>
+            <Head>
+                <title>BSition</title>
+                <meta name="viewport" content="initial-scale=1.0, width=device-width"/>
+            </Head>
+            <Component {...pageProps} />
+        </>
+    )
+}
+
+export default MyApp
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/pages/api/socket.tsx b/bsition/frontend/nextjs/src/pages/api/socket.tsx
new file mode 100644
index 0000000..96b2611
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/api/socket.tsx
@@ -0,0 +1,22 @@
+import { Server } from "socket.io";
+import messageHandler from "../../utils/sockets/messageHandler";
+
+export default function SocketHandler(req, res) {
+  if (res.socket.server.io) {
+    console.log("Already set up");
+    res.end();
+    return;
+  }
+
+  const io = new Server(res.socket.server);
+  res.socket.server.io = io;
+
+  const onConnection = (socket) => {
+    messageHandler(io, socket);
+  };
+
+  io.on("connection", onConnection);
+
+  console.log("Setting up socket");
+  res.end();
+}
diff --git a/bsition/frontend/nextjs/src/pages/create-document.tsx b/bsition/frontend/nextjs/src/pages/create-document.tsx
new file mode 100644
index 0000000..f3b47d9
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/create-document.tsx
@@ -0,0 +1,53 @@
+import React, {useEffect, useState} from "react";
+import {useRouter} from "next/router";
+import Layout from "../components/Layout";
+import Link from "next/link";
+import classNames from "classnames";
+
+export default function CreateDocument() {
+    const router = useRouter();
+
+    const [token, setToken] = useState("");
+    const [user, setUser] = useState("");
+
+    useEffect(() => {
+        setToken(() => localStorage.getItem("token"))
+        setUser(() => localStorage.getItem("user"))
+    }, [])
+
+    const handleSubmit = async (event) => {
+        event.preventDefault()
+
+        let data = {
+            name: event.target.name.value,
+        }
+
+        const JSONdata = JSON.stringify(data)
+
+        const res = await fetch("http://localhost:8000/api/documents", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json',
+                'Authorization': `Bearer ${token}`
+            },
+            body: JSONdata
+        })
+        let json = await res.json();
+        router.push(`/documents/${json["id"]}`)
+    }
+
+    return (
+        <Layout>
+            <div className="flex items-center justify-center w-full h-full">
+            <form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>
+                <div>
+                    <input type="text" id="name" name="name" required placeholder="name"
+                           style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
+                </div>
+
+                <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button>
+            </form>
+        </div>
+        </Layout>
+    );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/pages/documents/[id].tsx b/bsition/frontend/nextjs/src/pages/documents/[id].tsx
new file mode 100644
index 0000000..cabf38c
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/documents/[id].tsx
@@ -0,0 +1,134 @@
+import io from "socket.io-client";
+import { useState, useEffect } from "react";
+import { useRouter } from "next/router";
+import Layout from "../../components/Layout";
+import {
+    OptionsIcon,
+    DeleteIcon,
+    LockIcon,
+    PublicIcon,
+    ShareIcon,
+    ManageIcon
+} from "../../components/icons";
+import Link from "next/link";
+
+let socket;
+
+export default function Document() {
+  const router = useRouter();
+
+  const [text, setText] = useState("");
+  const [token, setToken] = useState("");
+  const [title, setTitle] = useState("");
+
+  useEffect(() => {
+    socketInitializer();
+  }, [router.query.id]);
+
+  useEffect(() => {
+      setToken(() => localStorage.getItem("token"))
+  }, [])
+
+  useEffect(() => {
+    if (token && router.query.id) {
+        const fetchData = async () => {
+            const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
+                method: "GET",
+                headers: {
+                    'Authorization': `Bearer ${token}`
+                }
+            })
+            const json = await res.json();
+            setText(() => json["data"])
+            setTitle(() => json["name"])
+        }
+
+        fetchData()
+    }
+  }, [token, router.query.id])
+
+  useEffect(() => {
+      if (token && router.query.id) {
+          const interval = setInterval(() => {
+              fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
+                  method: 'PUT',
+                  body: `{"data": "${text}"}`,
+                  headers: {
+                      'Content-type': 'application/json',
+                      'Authorization': `Bearer ${token}`
+                  }
+              })
+          }, 500);
+
+          return () => clearInterval(interval);
+      }
+  }, [token, text, router.query.id])
+
+  const socketInitializer = async () => {
+    await fetch("/api/socket");
+
+    socket = io();
+
+    socket.emit('create', router.query.id);
+
+    socket.on("newIncomingText", (text) => {
+        setText(() => text);
+        console.log('text' + text);
+      });
+  };
+
+  const sendText = async () => {
+    socket.emit("createdText", text, router.query.id);
+    setText(() => text);
+  };
+
+  const handleKey = () => {
+    if (text) {
+      sendText();
+    }
+  };
+
+  let access = router.query.id + "/access"
+
+  return (
+      <Layout>
+          <div style={{height: "50px", justifyContent: "space-between"}}
+          className="align-center flex">
+              <span className="docTitle">
+                  {title}
+              </span>
+              <div className="dropdown">
+                  <OptionsIcon onClick={(e) => {
+                      document.getElementById("myDropdown").classList.toggle("show");
+
+                      window.onclick = function(event) {
+                        if (!event.target.matches('.dropbtn')) {
+                          var dropdowns = document.getElementsByClassName("dropdown-content");
+                          var i;
+                          for (i = 0; i < dropdowns.length; i++) {
+                            var openDropdown = dropdowns[i];
+                            if (openDropdown.classList.contains('show')) {
+                              openDropdown.classList.remove('show');
+                            }
+                          }
+                  }}}} className="dropbtn"></OptionsIcon>
+                  <div id="myDropdown" className="dropdown-content">
+                      <Link href={access}>
+                          <div className="flex flex-row items-center justify-start align-center menu-opt"><ManageIcon/><span>Manage access</span></div>
+                      </Link>
+                      <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><ShareIcon/><span>Share</span></div></a>
+                      <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><LockIcon/><span>Public/private</span></div></a>
+                      <a href="#"><div className="flex flex-row items-center justify-start align-center menu-opt"><DeleteIcon/><span>Delete document</span></div></a>
+                  </div>
+              </div>
+          </div>
+          <textarea
+            className="document_area"
+            placeholder="Type..."
+            onKeyUp={handleKey}
+            value={text}
+            onChange={(e) => setText(e.target.value)}
+          />
+      </Layout>
+  );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx b/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx
new file mode 100644
index 0000000..0ef8365
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/documents/[id]/access.tsx
@@ -0,0 +1,133 @@
+import React, { useState, useEffect } from "react";
+import { useRouter } from "next/router";
+import Layout from "../../../components/Layout";
+import {
+    OptionsIcon,
+    DeleteIcon,
+    LockIcon,
+    PublicIcon,
+    ShareIcon,
+    ManageIcon
+} from "../../../components/icons";
+import Link from "next/link";
+import classNames from "classnames";
+
+let socket;
+
+export default function Document() {
+  const router = useRouter();
+
+  const [text, setText] = useState("");
+  const [token, setToken] = useState("");
+  const [users, setUsers] = useState([]);
+
+  useEffect(() => {
+      setToken(() => localStorage.getItem("token"))
+  }, [])
+
+  useEffect(() => {
+    if (token && router.query.id) {
+        const fetchData = async () => {
+            const res = await fetch(`http://localhost:8000/api/documents/${router.query.id}/access`, {
+                method: "GET",
+                headers: {
+                    'Authorization': `Bearer ${token}`
+                }
+            })
+            const json = await res.json();
+            console.log(json)
+            let list = []
+            json.forEach((user) => {
+                list.push({
+                    id: user[0],
+                    username: user[1],
+                    access: user[2]
+                })
+            })
+            setUsers(() => list)
+        }
+
+        fetchData()
+    }
+  }, [token, router.query.id])
+
+  useEffect(() => {
+      if (token && router.query.id) {
+          const interval = setInterval(() => {
+              fetch(`http://localhost:8000/api/documents/${router.query.id}`, {
+                  method: 'PUT',
+                  body: `{"data": "${text}"}`,
+                  headers: {
+                      'Content-type': 'application/json',
+                      'Authorization': `Bearer ${token}`
+                  }
+              })
+          }, 500);
+
+          return () => clearInterval(interval);
+      }
+  }, [token, text, router.query.id])
+
+    const handleSubmit = async (event) => {
+        event.preventDefault()
+
+        let data = {
+            name: event.target.name.value,
+        }
+
+        const JSONdata = JSON.stringify(data)
+
+        const res = await fetch("http://localhost:8000/api/documents", {
+            method: "POST",
+            headers: {
+                'Content-Type': 'application/json',
+                'Authorization': `Bearer ${token}`
+            },
+            body: JSONdata
+        })
+        let json = await res.json();
+    }
+
+
+  return (
+      <Layout>
+          <div style={{height: "50px", justifyContent: "space-between"}}
+          className="align-center flex">
+              <table>
+                  <tr>
+                      <th>Username</th>
+                      <th>Access</th>
+                  </tr>
+                  {users.map(({ icon: Icon, ...user }) => {
+            return (
+                <>
+                <tr style={{color: "black"}}>
+                    <td>{user.username}</td>
+                    <td>
+                        <select style={{padding: "4px"}} value={user.access} onChange={handleSubmit}>
+                            <option value={1} label="Full-access"></option>
+                            <option value={2} label="Edit"></option>
+                            <option value={3} label="Read-only"></option>
+                        </select>
+
+                    </td>
+                </tr>
+
+                      <div className="flex items-center justify-center w-full h-full">
+            {/*<form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>*/}
+                <div>
+                    <input type="text" id="name" name="name" required placeholder="name"
+                           style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
+                </div>
+
+                <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Create</button>
+            {/*</form>*/}
+        </div>
+                </>
+            );
+          })}
+              </table>
+          </div>
+      </Layout>
+  );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/pages/index.tsx b/bsition/frontend/nextjs/src/pages/index.tsx
new file mode 100644
index 0000000..ea96ec7
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/index.tsx
@@ -0,0 +1,36 @@
+import Layout from "../components/Layout";
+import {useRouter} from "next/router";
+import {useEffect, useState} from "react";
+
+export default function Home() {
+  const router = useRouter();
+    const [isLoading, setIsLoading] = useState(true);
+
+    useEffect(() => {
+        const token = localStorage.getItem("token");
+        if (router.pathname !== "/login" && (!token || token === "undefined")) {
+            router.push("/login");
+        } else {
+            setIsLoading(false)
+        }
+    }, []);
+
+    if (isLoading) {
+        return <></>
+    }
+
+  return <Layout>
+      <div className="flex flex-col justify-center h-full w-full align-center items-center">
+          <div style={{width: "fit-content"}}>
+            <h1 style={{fontSize: "xxx-large"}}>BSition</h1>
+            <h3 style={{margin: "0"}}>Created by:</h3>
+            <h2 style={{margin: "0"}}>Bottler</h2>
+            <ul style={{margin: "0"}}>
+              <li>Barmasch, Juan Martín</li>
+              <li>Bellver, Ezequiel</li>
+              <li>Lo Coco, Santiago</li>
+            </ul>
+          </div>
+      </div>
+  </Layout>;
+}
diff --git a/bsition/frontend/nextjs/src/pages/login.tsx b/bsition/frontend/nextjs/src/pages/login.tsx
new file mode 100644
index 0000000..0e7779a
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/login.tsx
@@ -0,0 +1,55 @@
+import React, {useState} from "react";
+import {useRouter} from "next/router";
+import {Input} from "postcss";
+
+export default function Login() {
+    const router = useRouter();
+
+    const handleSubmit = async (event) => {
+        event.preventDefault()
+
+        let formData = new FormData();
+        formData.append("username", event.target.username.value)
+        formData.append("password", event.target.password.value)
+
+        const res = await fetch("http://localhost:8000/api/token", {method: 'POST', body: formData})
+        const json = await res.json();
+
+        if (res.status == 202) {
+            localStorage.setItem("token", json["access_token"])
+            const res = await fetch("http://localhost:8000/api/users/me", {
+                method: 'GET',
+                headers: {
+                    'Authorization': `Bearer ${json["access_token"]}`
+                }
+            })
+            const aux = await res.json();
+
+            if (res.status == 200) {
+                console.log(aux)
+                localStorage.setItem("user", aux[0])
+            }
+
+            router.push("/")
+        } else {
+            alert('Fail')
+        }
+    }
+
+    return (
+        <div className="flex items-center justify-center w-full h-full" style={{marginTop: "30%"}}>
+            <form onSubmit={handleSubmit} className="flex items-center justify-center align-center w-full h-full login-form" style={{flexDirection: "column"}}>
+                <div>
+                    <input type="text" id="username" name="username" required placeholder="username"
+                           style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
+                </div>
+                <div>
+                    <input type="password" id="password" name="password" required placeholder="password"
+                           style={{border: "1px solid grey", color: "black", padding: "2px 4px"}}/>
+                </div>
+
+                <button type="submit" className="rounded bg-pink-600 rounded" style={{border: "1px solid grey", padding: "4px"}}>Log in</button>
+            </form>
+        </div>
+    );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/pages/search.tsx b/bsition/frontend/nextjs/src/pages/search.tsx
new file mode 100644
index 0000000..5d688fe
--- /dev/null
+++ b/bsition/frontend/nextjs/src/pages/search.tsx
@@ -0,0 +1,98 @@
+import React, {useEffect, useState} from "react";
+import {useRouter} from "next/router";
+import Layout from "../components/Layout";
+import Link from "next/link";
+import classNames from "classnames";
+
+export default function Search() {
+    const router = useRouter();
+
+    const [token, setToken] = useState("");
+    const [search, setSearch] = useState("");
+    const [menuItems, setMenuItems] = useState([{id: 1, label: "", link: "/"}]);
+
+    useEffect(() => {
+        setToken(() => localStorage.getItem("token"))
+    }, [])
+
+    const handleSubmit = async (event) => {
+        event.preventDefault()
+
+        const res = await fetch("http://localhost:8000/api/documents?" + new URLSearchParams(
+            {query: "*" + event.target.search.value + "*"}
+        ), {
+            method: "GET",
+            headers: {
+                'Authorization': `Bearer ${token}`
+            }
+        })
+        let json = await res.json();
+        let list = []
+        json.forEach((doc) => {
+            let highlight = doc["highlight"].replaceAll('\'', '').replaceAll('[', '').replaceAll(']', '')
+            let initial = highlight.indexOf('<em>')
+            let end = highlight.indexOf('</em>')
+            let first_str, second_str
+            if (highlight.length < end + 15) {
+                second_str = highlight.substring(end, highlight.length)
+            } else {
+                second_str = highlight.substring(end, end + 15)
+            }
+            if (initial - 10 < 0) {
+                first_str = highlight.substring(0, initial)
+            } else {
+                first_str = highlight.substring(0, initial - 10)
+            }
+            highlight = highlight.substring(initial + 4, end)
+            list.push({
+                id: doc["id"],
+                label: doc["name"],
+                first: first_str.replace('<em>', ''),
+                bold: highlight,
+                second: second_str.replace('</em>', ''),
+                link: `/documents/${doc["id"]}`
+            })
+        })
+
+        setMenuItems(() => list)
+    }
+
+    return (
+        <Layout>
+            <form onSubmit={handleSubmit}>
+                <input type="text" id="search" name="search" required style={{color: "black", padding: "2px 4px"}}/>
+
+                <button type="submit">Search</button>
+            </form>
+
+            {menuItems && (
+                <div className="flex flex-col items-start mt-24">
+                    {menuItems.map(({...menu}) => {
+                        return (
+                            <div key={menu.id}>
+                                <span>
+
+                                <Link href={menu.link}>
+                                    <a className="flex py-4 px-3 items-center w-full h-full">
+                                        <div style={{width: "2.5rem"}}>
+                                        </div>
+                                        <span
+                                            className={classNames(
+                                                "text-md font-medium text-text-light"
+                                            )}
+                                        >
+                                            {menu.label}
+                                        </span>
+                                    </a>
+                                </Link>
+                                    <p>{menu.first}<b>{menu.bold}</b>{menu.second}</p>
+                                </span>
+                            </div>
+                        );
+                    })}
+                </div>
+            )}
+
+        </Layout>
+    );
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/styles/Home.module.css b/bsition/frontend/nextjs/src/styles/Home.module.css
new file mode 100644
index 0000000..32a57d5
--- /dev/null
+++ b/bsition/frontend/nextjs/src/styles/Home.module.css
@@ -0,0 +1,116 @@
+.container {
+  padding: 0 2rem;
+}
+
+.main {
+  min-height: 100vh;
+  padding: 4rem 0;
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.footer {
+  display: flex;
+  flex: 1;
+  padding: 2rem 0;
+  border-top: 1px solid #eaeaea;
+  justify-content: center;
+  align-items: center;
+}
+
+.footer a {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-grow: 1;
+}
+
+.title a {
+  color: #0070f3;
+  text-decoration: none;
+}
+
+.title a:hover,
+.title a:focus,
+.title a:active {
+  text-decoration: underline;
+}
+
+.title {
+  margin: 0;
+  line-height: 1.15;
+  font-size: 4rem;
+}
+
+.title,
+.description {
+  text-align: center;
+}
+
+.description {
+  margin: 4rem 0;
+  line-height: 1.5;
+  font-size: 1.5rem;
+}
+
+.code {
+  background: #fafafa;
+  border-radius: 5px;
+  padding: 0.75rem;
+  font-size: 1.1rem;
+  font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono,
+    Bitstream Vera Sans Mono, Courier New, monospace;
+}
+
+.grid {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-wrap: wrap;
+  max-width: 800px;
+}
+
+.card {
+  margin: 1rem;
+  padding: 1.5rem;
+  text-align: left;
+  color: inherit;
+  text-decoration: none;
+  border: 1px solid #eaeaea;
+  border-radius: 10px;
+  transition: color 0.15s ease, border-color 0.15s ease;
+  max-width: 300px;
+}
+
+.card:hover,
+.card:focus,
+.card:active {
+  color: #0070f3;
+  border-color: #0070f3;
+}
+
+.card h2 {
+  margin: 0 0 1rem 0;
+  font-size: 1.5rem;
+}
+
+.card p {
+  margin: 0;
+  font-size: 1.25rem;
+  line-height: 1.5;
+}
+
+.logo {
+  height: 1em;
+  margin-left: 0.5rem;
+}
+
+@media (max-width: 600px) {
+  .grid {
+    width: 100%;
+    flex-direction: column;
+  }
+}
diff --git a/bsition/frontend/nextjs/src/styles/index.css b/bsition/frontend/nextjs/src/styles/index.css
new file mode 100644
index 0000000..1ee3e9c
--- /dev/null
+++ b/bsition/frontend/nextjs/src/styles/index.css
@@ -0,0 +1,103 @@
+@import 'tailwindcss/base';
+@import 'tailwindcss/components';
+@import 'tailwindcss/utilities';
+
+/* Your own custom component styles */
+
+.document_area {
+  width: 100%;
+  height: calc(100% - 50px);
+  /*margin: 40px;*/
+  border: none;
+  outline: none;
+  resize: none;
+  color: black;
+  padding: 10px;
+}
+
+.docTitle {
+  color: black;
+  font-size: large;
+  font-weight: bold;
+}
+
+
+.dropbtn {
+  width: 40px;
+  height: 40px;
+  border-radius: 100%;
+  padding: 3px;
+  border: none;
+  stroke: #404040;
+  cursor: pointer;
+}
+
+.dropbtn:hover, .dropbtn:focus {
+  border-radius: 100%;
+  background-color: #419de8;
+}
+
+.dropdown {
+  float: right;
+  position: relative;
+  display: inline-block;
+}
+
+.dropdown-content {
+  display: none;
+  position: absolute;
+  background-color: white;
+  min-width: 220px;
+  overflow: auto;
+  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+  right: 0;
+  z-index: 1;
+}
+
+.dropdown-content a {
+  color: black;
+  padding: 12px 16px;
+  text-decoration: none;
+  display: block;
+}
+
+.dropdown a:hover {background-color: #ddd;}
+
+.show {display: block;}
+
+
+svg {
+  display: inline;
+}
+
+.login-form div {
+  margin: 10px;
+}
+
+.menu-opt span {
+  margin-left: 4px;
+}
+
+h1 {
+  all: revert;
+}
+
+h2 {
+  all: revert;
+}
+
+h3 {
+  all: revert;
+}
+
+ul {
+  all: revert;
+}
+
+li {
+  all: revert;
+}
+
+table {
+  all: revert
+}
\ No newline at end of file
diff --git a/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx b/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx
new file mode 100644
index 0000000..d6091dc
--- /dev/null
+++ b/bsition/frontend/nextjs/src/utils/sockets/messageHandler.tsx
@@ -0,0 +1,13 @@
+export default (io, socket) => {
+  const createdText = (text, room) => {
+    console.log(room);
+    console.log(text);
+    socket.to(room).emit("newIncomingText", text);
+  };
+
+  socket.on('create', function(room) {
+    socket.join(room);
+  });
+
+  socket.on("createdText", createdText);
+};
diff --git a/bsition/frontend/nextjs/tailwind.config.js b/bsition/frontend/nextjs/tailwind.config.js
new file mode 100644
index 0000000..eb0b01e
--- /dev/null
+++ b/bsition/frontend/nextjs/tailwind.config.js
@@ -0,0 +1,28 @@
+const defaultTheme = require('tailwindcss/defaultConfig');
+
+module.exports = {
+  content: [
+    './src/components/**/*.{ts,tsx,js,jsx}', 
+    './src/pages/**/*.{ts,tsx,js,jsx}',
+    './src/pages/login.tsx'
+  ],
+  theme: {
+    ...defaultTheme,
+    colors: {
+      ...defaultTheme.colors,
+      primary: "#71aaff",
+      white: '#ffffff',
+      text: {
+        DEFAULT: "#1F2937",
+        light: "#6C7281",
+      },
+      light: {
+        DEFAULT: "#FAFBFC",
+        lighter: "#F3F4F6",
+      },
+    },
+    extend: {},
+  },
+  variants: {},
+  plugins: [],
+}
diff --git a/bsition/frontend/nextjs/tsconfig.json b/bsition/frontend/nextjs/tsconfig.json
new file mode 100644
index 0000000..568e45d
--- /dev/null
+++ b/bsition/frontend/nextjs/tsconfig.json
@@ -0,0 +1,30 @@
+{
+  "compilerOptions": {
+    "target": "es5",
+    "lib": [
+      "dom",
+      "dom.iterable",
+      "esnext"
+    ],
+    "allowJs": true,
+    "skipLibCheck": true,
+    "strict": false,
+    "forceConsistentCasingInFileNames": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "module": "esnext",
+    "moduleResolution": "node",
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "jsx": "preserve",
+    "incremental": true
+  },
+  "exclude": [
+    "node_modules"
+  ],
+  "include": [
+    "next-env.d.ts",
+    "**/*.ts",
+    "**/*.tsx"
+  ]
+}
diff --git a/bsition/frontend/nextjs/yarn.lock b/bsition/frontend/nextjs/yarn.lock
new file mode 100644
index 0000000..6ea3da7
--- /dev/null
+++ b/bsition/frontend/nextjs/yarn.lock
@@ -0,0 +1,964 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+  "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw=="
+  "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz"
+  "version" "7.12.11"
+  dependencies:
+    "@babel/highlight" "^7.10.4"
+
+"@babel/helper-validator-identifier@^7.15.7":
+  "integrity" "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
+  "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz"
+  "version" "7.15.7"
+
+"@babel/highlight@^7.10.4":
+  "integrity" "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g=="
+  "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz"
+  "version" "7.16.0"
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.15.7"
+    "chalk" "^2.0.0"
+    "js-tokens" "^4.0.0"
+
+"@next/env@12.1.0":
+  "integrity" "sha512-nrIgY6t17FQ9xxwH3jj0a6EOiQ/WDHUos35Hghtr+SWN/ntHIQ7UpuvSi0vaLzZVHQWaDupKI+liO5vANcDeTQ=="
+  "resolved" "https://registry.npmjs.org/@next/env/-/env-12.1.0.tgz"
+  "version" "12.1.0"
+
+"@next/swc-linux-x64-gnu@12.1.0":
+  "integrity" "sha512-OKO4R/digvrVuweSw/uBM4nSdyzsBV5EwkUeeG4KVpkIZEe64ZwRpnFB65bC6hGwxIBnTv5NMSnJ+0K/WmG78A=="
+  "resolved" "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.0.tgz"
+  "version" "12.1.0"
+
+"@next/swc-linux-x64-musl@12.1.0":
+  "integrity" "sha512-JohhgAHZvOD3rQY7tlp7NlmvtvYHBYgY0x5ZCecUT6eCCcl9lv6iV3nfu82ErkxNk1H893fqH0FUpznZ/H3pSw=="
+  "resolved" "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.0.tgz"
+  "version" "12.1.0"
+
+"@nodelib/fs.scandir@2.1.5":
+  "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="
+  "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+  "version" "2.1.5"
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    "run-parallel" "^1.1.9"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+  "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+  "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+  "version" "2.0.5"
+
+"@nodelib/fs.walk@^1.2.3":
+  "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="
+  "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+  "version" "1.2.8"
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    "fastq" "^1.6.0"
+
+"@socket.io/component-emitter@~3.1.0":
+  "integrity" "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
+  "resolved" "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz"
+  "version" "3.1.0"
+
+"@types/cookie@^0.4.1":
+  "integrity" "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
+  "resolved" "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz"
+  "version" "0.4.1"
+
+"@types/cors@^2.8.12":
+  "integrity" "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA=="
+  "resolved" "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz"
+  "version" "2.8.13"
+  dependencies:
+    "@types/node" "*"
+
+"@types/node@*", "@types/node@^17.0.21", "@types/node@>=10.0.0":
+  "integrity" "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ=="
+  "resolved" "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz"
+  "version" "17.0.21"
+
+"@types/parse-json@^4.0.0":
+  "integrity" "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+  "resolved" "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz"
+  "version" "4.0.0"
+
+"@types/prop-types@*":
+  "integrity" "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
+  "resolved" "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz"
+  "version" "15.7.3"
+
+"@types/react@^17.0.39":
+  "integrity" "sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug=="
+  "resolved" "https://registry.npmjs.org/@types/react/-/react-17.0.39.tgz"
+  "version" "17.0.39"
+  dependencies:
+    "@types/prop-types" "*"
+    "@types/scheduler" "*"
+    "csstype" "^3.0.2"
+
+"@types/scheduler@*":
+  "integrity" "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
+  "resolved" "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz"
+  "version" "0.16.1"
+
+"accepts@~1.3.4":
+  "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="
+  "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
+  "version" "1.3.8"
+  dependencies:
+    "mime-types" "~2.1.34"
+    "negotiator" "0.6.3"
+
+"acorn-node@^1.6.1":
+  "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A=="
+  "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz"
+  "version" "1.8.2"
+  dependencies:
+    "acorn" "^7.0.0"
+    "acorn-walk" "^7.0.0"
+    "xtend" "^4.0.2"
+
+"acorn-walk@^7.0.0":
+  "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
+  "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
+  "version" "7.2.0"
+
+"acorn@^7.0.0":
+  "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
+  "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
+  "version" "7.4.1"
+
+"ansi-styles@^3.2.1":
+  "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="
+  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+  "version" "3.2.1"
+  dependencies:
+    "color-convert" "^1.9.0"
+
+"ansi-styles@^4.1.0":
+  "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="
+  "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+  "version" "4.3.0"
+  dependencies:
+    "color-convert" "^2.0.1"
+
+"anymatch@~3.1.2":
+  "integrity" "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg=="
+  "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz"
+  "version" "3.1.2"
+  dependencies:
+    "normalize-path" "^3.0.0"
+    "picomatch" "^2.0.4"
+
+"arg@^5.0.1":
+  "integrity" "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA=="
+  "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz"
+  "version" "5.0.1"
+
+"autoprefixer@^10.0.2", "autoprefixer@^10.4.2":
+  "integrity" "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ=="
+  "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz"
+  "version" "10.4.2"
+  dependencies:
+    "browserslist" "^4.19.1"
+    "caniuse-lite" "^1.0.30001297"
+    "fraction.js" "^4.1.2"
+    "normalize-range" "^0.1.2"
+    "picocolors" "^1.0.0"
+    "postcss-value-parser" "^4.2.0"
+
+"base64id@~2.0.0", "base64id@2.0.0":
+  "integrity" "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
+  "resolved" "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz"
+  "version" "2.0.0"
+
+"binary-extensions@^2.0.0":
+  "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+  "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
+  "version" "2.2.0"
+
+"braces@^3.0.1", "braces@~3.0.2":
+  "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="
+  "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+  "version" "3.0.2"
+  dependencies:
+    "fill-range" "^7.0.1"
+
+"browserslist@^4.19.1":
+  "integrity" "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg=="
+  "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz"
+  "version" "4.19.3"
+  dependencies:
+    "caniuse-lite" "^1.0.30001312"
+    "electron-to-chromium" "^1.4.71"
+    "escalade" "^3.1.1"
+    "node-releases" "^2.0.2"
+    "picocolors" "^1.0.0"
+
+"callsites@^3.0.0":
+  "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+  "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+  "version" "3.1.0"
+
+"camelcase-css@^2.0.1":
+  "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
+  "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
+  "version" "2.0.1"
+
+"caniuse-lite@^1.0.30001283", "caniuse-lite@^1.0.30001297", "caniuse-lite@^1.0.30001312":
+  "integrity" "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ=="
+  "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz"
+  "version" "1.0.30001312"
+
+"chalk@^2.0.0":
+  "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+  "version" "2.4.2"
+  dependencies:
+    "ansi-styles" "^3.2.1"
+    "escape-string-regexp" "^1.0.5"
+    "supports-color" "^5.3.0"
+
+"chalk@^4.1.2":
+  "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
+  "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+  "version" "4.1.2"
+  dependencies:
+    "ansi-styles" "^4.1.0"
+    "supports-color" "^7.1.0"
+
+"chokidar@^3.5.3":
+  "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="
+  "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz"
+  "version" "3.5.3"
+  dependencies:
+    "anymatch" "~3.1.2"
+    "braces" "~3.0.2"
+    "glob-parent" "~5.1.2"
+    "is-binary-path" "~2.1.0"
+    "is-glob" "~4.0.1"
+    "normalize-path" "~3.0.0"
+    "readdirp" "~3.6.0"
+  optionalDependencies:
+    "fsevents" "~2.3.2"
+
+"classnames@^2.3.1":
+  "integrity" "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
+  "resolved" "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz"
+  "version" "2.3.2"
+
+"color-convert@^1.9.0":
+  "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="
+  "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+  "version" "1.9.3"
+  dependencies:
+    "color-name" "1.1.3"
+
+"color-convert@^2.0.1":
+  "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="
+  "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+  "version" "2.0.1"
+  dependencies:
+    "color-name" "~1.1.4"
+
+"color-name@^1.1.4", "color-name@~1.1.4":
+  "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+  "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+  "version" "1.1.4"
+
+"color-name@1.1.3":
+  "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+  "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+  "version" "1.1.3"
+
+"cookie@~0.4.1":
+  "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
+  "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz"
+  "version" "0.4.2"
+
+"cors@~2.8.5":
+  "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="
+  "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz"
+  "version" "2.8.5"
+  dependencies:
+    "object-assign" "^4"
+    "vary" "^1"
+
+"cosmiconfig@^7.0.1":
+  "integrity" "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ=="
+  "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    "import-fresh" "^3.2.1"
+    "parse-json" "^5.0.0"
+    "path-type" "^4.0.0"
+    "yaml" "^1.10.0"
+
+"cssesc@^3.0.0":
+  "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+  "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+  "version" "3.0.0"
+
+"csstype@^3.0.2":
+  "integrity" "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ=="
+  "resolved" "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz"
+  "version" "3.0.5"
+
+"debug@~4.3.1", "debug@~4.3.2":
+  "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
+  "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
+  "version" "4.3.4"
+  dependencies:
+    "ms" "2.1.2"
+
+"defined@^1.0.0":
+  "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+  "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
+  "version" "1.0.0"
+
+"detective@^5.2.0":
+  "integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg=="
+  "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz"
+  "version" "5.2.0"
+  dependencies:
+    "acorn-node" "^1.6.1"
+    "defined" "^1.0.0"
+    "minimist" "^1.1.1"
+
+"didyoumean@^1.2.2":
+  "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
+  "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"
+  "version" "1.2.2"
+
+"dlv@^1.1.3":
+  "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+  "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz"
+  "version" "1.1.3"
+
+"electron-to-chromium@^1.4.71":
+  "integrity" "sha512-LxgUNeu3BVU7sXaKjUDD9xivocQLxFtq6wgERrutdY/yIOps3ODOZExK1jg8DTEg4U8TUCb5MLGeWFOYuxjF3Q=="
+  "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.75.tgz"
+  "version" "1.4.75"
+
+"engine.io-client@~6.2.3":
+  "integrity" "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw=="
+  "resolved" "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz"
+  "version" "6.2.3"
+  dependencies:
+    "@socket.io/component-emitter" "~3.1.0"
+    "debug" "~4.3.1"
+    "engine.io-parser" "~5.0.3"
+    "ws" "~8.2.3"
+    "xmlhttprequest-ssl" "~2.0.0"
+
+"engine.io-parser@~5.0.3":
+  "integrity" "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
+  "resolved" "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz"
+  "version" "5.0.4"
+
+"engine.io@~6.2.1":
+  "integrity" "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA=="
+  "resolved" "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz"
+  "version" "6.2.1"
+  dependencies:
+    "@types/cookie" "^0.4.1"
+    "@types/cors" "^2.8.12"
+    "@types/node" ">=10.0.0"
+    "accepts" "~1.3.4"
+    "base64id" "2.0.0"
+    "cookie" "~0.4.1"
+    "cors" "~2.8.5"
+    "debug" "~4.3.1"
+    "engine.io-parser" "~5.0.3"
+    "ws" "~8.2.3"
+
+"error-ex@^1.3.1":
+  "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="
+  "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+  "version" "1.3.2"
+  dependencies:
+    "is-arrayish" "^0.2.1"
+
+"escalade@^3.1.1":
+  "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+  "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+  "version" "3.1.1"
+
+"escape-string-regexp@^1.0.5":
+  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+  "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+  "version" "1.0.5"
+
+"fast-glob@^3.2.11":
+  "integrity" "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew=="
+  "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz"
+  "version" "3.2.11"
+  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":
+  "integrity" "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw=="
+  "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz"
+  "version" "1.13.0"
+  dependencies:
+    "reusify" "^1.0.4"
+
+"fill-range@^7.0.1":
+  "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="
+  "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+  "version" "7.0.1"
+  dependencies:
+    "to-regex-range" "^5.0.1"
+
+"fraction.js@^4.1.2":
+  "integrity" "sha512-pUHWWt6vHzZZiQJcM6S/0PXfS+g6FM4BF5rj9wZyreivhQPdsh5PpE25VtSNxq80wHS5RfY51Ii+8Z0Zl/pmzg=="
+  "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.3.tgz"
+  "version" "4.1.3"
+
+"function-bind@^1.1.1":
+  "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+  "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+  "version" "1.1.1"
+
+"glob-parent@^5.1.2", "glob-parent@~5.1.2":
+  "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="
+  "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+  "version" "5.1.2"
+  dependencies:
+    "is-glob" "^4.0.1"
+
+"glob-parent@^6.0.2":
+  "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="
+  "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+  "version" "6.0.2"
+  dependencies:
+    "is-glob" "^4.0.3"
+
+"has-flag@^3.0.0":
+  "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+  "version" "3.0.0"
+
+"has-flag@^4.0.0":
+  "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+  "version" "4.0.0"
+
+"has@^1.0.3":
+  "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
+  "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "function-bind" "^1.1.1"
+
+"import-cwd@^3.0.0":
+  "integrity" "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg=="
+  "resolved" "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "import-from" "^3.0.0"
+
+"import-fresh@^3.2.1":
+  "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
+  "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+  "version" "3.3.0"
+  dependencies:
+    "parent-module" "^1.0.0"
+    "resolve-from" "^4.0.0"
+
+"import-from@^3.0.0":
+  "integrity" "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ=="
+  "resolved" "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz"
+  "version" "3.0.0"
+  dependencies:
+    "resolve-from" "^5.0.0"
+
+"is-arrayish@^0.2.1":
+  "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+  "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+  "version" "0.2.1"
+
+"is-binary-path@~2.1.0":
+  "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="
+  "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+  "version" "2.1.0"
+  dependencies:
+    "binary-extensions" "^2.0.0"
+
+"is-core-module@^2.8.1":
+  "integrity" "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA=="
+  "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz"
+  "version" "2.8.1"
+  dependencies:
+    "has" "^1.0.3"
+
+"is-extglob@^2.1.1":
+  "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+  "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+  "version" "2.1.1"
+
+"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1":
+  "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="
+  "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+  "version" "4.0.3"
+  dependencies:
+    "is-extglob" "^2.1.1"
+
+"is-number@^7.0.0":
+  "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+  "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+  "version" "7.0.0"
+
+"js-tokens@^3.0.0 || ^4.0.0", "js-tokens@^4.0.0":
+  "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+  "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+  "version" "4.0.0"
+
+"json-parse-even-better-errors@^2.3.0":
+  "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+  "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
+  "version" "2.3.1"
+
+"lilconfig@^2.0.3":
+  "integrity" "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg=="
+  "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz"
+  "version" "2.0.3"
+
+"lines-and-columns@^1.1.6":
+  "integrity" "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+  "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz"
+  "version" "1.1.6"
+
+"loose-envify@^1.1.0":
+  "integrity" "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="
+  "resolved" "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+  "version" "1.4.0"
+  dependencies:
+    "js-tokens" "^3.0.0 || ^4.0.0"
+
+"merge2@^1.3.0":
+  "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+  "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+  "version" "1.4.1"
+
+"micromatch@^4.0.4":
+  "integrity" "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg=="
+  "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz"
+  "version" "4.0.4"
+  dependencies:
+    "braces" "^3.0.1"
+    "picomatch" "^2.2.3"
+
+"mime-db@1.52.0":
+  "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+  "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+  "version" "1.52.0"
+
+"mime-types@~2.1.34":
+  "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="
+  "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+  "version" "2.1.35"
+  dependencies:
+    "mime-db" "1.52.0"
+
+"minimist@^1.1.1":
+  "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
+  "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz"
+  "version" "1.2.7"
+
+"ms@2.1.2":
+  "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+  "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+  "version" "2.1.2"
+
+"nanoid@^3.1.30", "nanoid@^3.3.1":
+  "integrity" "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
+  "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz"
+  "version" "3.3.1"
+
+"negotiator@0.6.3":
+  "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+  "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
+  "version" "0.6.3"
+
+"next@12.1.0":
+  "integrity" "sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q=="
+  "resolved" "https://registry.npmjs.org/next/-/next-12.1.0.tgz"
+  "version" "12.1.0"
+  dependencies:
+    "@next/env" "12.1.0"
+    "caniuse-lite" "^1.0.30001283"
+    "postcss" "8.4.5"
+    "styled-jsx" "5.0.0"
+    "use-subscription" "1.5.1"
+  optionalDependencies:
+    "@next/swc-android-arm64" "12.1.0"
+    "@next/swc-darwin-arm64" "12.1.0"
+    "@next/swc-darwin-x64" "12.1.0"
+    "@next/swc-linux-arm-gnueabihf" "12.1.0"
+    "@next/swc-linux-arm64-gnu" "12.1.0"
+    "@next/swc-linux-arm64-musl" "12.1.0"
+    "@next/swc-linux-x64-gnu" "12.1.0"
+    "@next/swc-linux-x64-musl" "12.1.0"
+    "@next/swc-win32-arm64-msvc" "12.1.0"
+    "@next/swc-win32-ia32-msvc" "12.1.0"
+    "@next/swc-win32-x64-msvc" "12.1.0"
+
+"node-releases@^2.0.2":
+  "integrity" "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg=="
+  "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz"
+  "version" "2.0.2"
+
+"normalize-path@^3.0.0", "normalize-path@~3.0.0":
+  "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+  "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+  "version" "3.0.0"
+
+"normalize-range@^0.1.2":
+  "integrity" "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+  "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz"
+  "version" "0.1.2"
+
+"object-assign@^4", "object-assign@^4.1.1":
+  "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+  "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+  "version" "4.1.1"
+
+"object-hash@^2.2.0":
+  "integrity" "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
+  "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz"
+  "version" "2.2.0"
+
+"parent-module@^1.0.0":
+  "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
+  "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "callsites" "^3.0.0"
+
+"parse-json@^5.0.0":
+  "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="
+  "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz"
+  "version" "5.2.0"
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "error-ex" "^1.3.1"
+    "json-parse-even-better-errors" "^2.3.0"
+    "lines-and-columns" "^1.1.6"
+
+"path-parse@^1.0.7":
+  "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+  "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+  "version" "1.0.7"
+
+"path-type@^4.0.0":
+  "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+  "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+  "version" "4.0.0"
+
+"picocolors@^1.0.0":
+  "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+  "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+  "version" "1.0.0"
+
+"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.2.3":
+  "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+  "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+  "version" "2.3.1"
+
+"pify@^2.3.0":
+  "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+  "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+  "version" "2.3.0"
+
+"postcss-import@^14.0.2":
+  "integrity" "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g=="
+  "resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz"
+  "version" "14.0.2"
+  dependencies:
+    "postcss-value-parser" "^4.0.0"
+    "read-cache" "^1.0.0"
+    "resolve" "^1.1.7"
+
+"postcss-js@^4.0.0":
+  "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ=="
+  "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz"
+  "version" "4.0.0"
+  dependencies:
+    "camelcase-css" "^2.0.1"
+
+"postcss-load-config@^3.1.0":
+  "integrity" "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g=="
+  "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz"
+  "version" "3.1.0"
+  dependencies:
+    "import-cwd" "^3.0.0"
+    "lilconfig" "^2.0.3"
+    "yaml" "^1.10.2"
+
+"postcss-nested@5.0.6":
+  "integrity" "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA=="
+  "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz"
+  "version" "5.0.6"
+  dependencies:
+    "postcss-selector-parser" "^6.0.6"
+
+"postcss-selector-parser@^6.0.6", "postcss-selector-parser@^6.0.9":
+  "integrity" "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ=="
+  "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz"
+  "version" "6.0.9"
+  dependencies:
+    "cssesc" "^3.0.0"
+    "util-deprecate" "^1.0.2"
+
+"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0":
+  "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+  "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
+  "version" "4.2.0"
+
+"postcss@^8.0.0", "postcss@^8.1.0", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.6", "postcss@^8.4.7":
+  "integrity" "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A=="
+  "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz"
+  "version" "8.4.7"
+  dependencies:
+    "nanoid" "^3.3.1"
+    "picocolors" "^1.0.0"
+    "source-map-js" "^1.0.2"
+
+"postcss@8.4.5":
+  "integrity" "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg=="
+  "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz"
+  "version" "8.4.5"
+  dependencies:
+    "nanoid" "^3.1.30"
+    "picocolors" "^1.0.0"
+    "source-map-js" "^1.0.1"
+
+"queue-microtask@^1.2.2":
+  "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+  "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+  "version" "1.2.3"
+
+"quick-lru@^5.1.1":
+  "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+  "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"
+  "version" "5.1.1"
+
+"react-dom@^17.0.2 || ^18.0.0-0", "react-dom@17.0.2":
+  "integrity" "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA=="
+  "resolved" "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz"
+  "version" "17.0.2"
+  dependencies:
+    "loose-envify" "^1.1.0"
+    "object-assign" "^4.1.1"
+    "scheduler" "^0.20.2"
+
+"react@^17.0.2 || ^18.0.0-0", "react@>= 16.8.0 || 17.x.x || 18.x.x", "react@17.0.2":
+  "integrity" "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA=="
+  "resolved" "https://registry.npmjs.org/react/-/react-17.0.2.tgz"
+  "version" "17.0.2"
+  dependencies:
+    "loose-envify" "^1.1.0"
+    "object-assign" "^4.1.1"
+
+"read-cache@^1.0.0":
+  "integrity" "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q="
+  "resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz"
+  "version" "1.0.0"
+  dependencies:
+    "pify" "^2.3.0"
+
+"readdirp@~3.6.0":
+  "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="
+  "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+  "version" "3.6.0"
+  dependencies:
+    "picomatch" "^2.2.1"
+
+"resolve-from@^4.0.0":
+  "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+  "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+  "version" "4.0.0"
+
+"resolve-from@^5.0.0":
+  "integrity" "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="
+  "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz"
+  "version" "5.0.0"
+
+"resolve@^1.1.7", "resolve@^1.22.0":
+  "integrity" "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw=="
+  "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz"
+  "version" "1.22.0"
+  dependencies:
+    "is-core-module" "^2.8.1"
+    "path-parse" "^1.0.7"
+    "supports-preserve-symlinks-flag" "^1.0.0"
+
+"reusify@^1.0.4":
+  "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+  "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+  "version" "1.0.4"
+
+"run-parallel@^1.1.9":
+  "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="
+  "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+  "version" "1.2.0"
+  dependencies:
+    "queue-microtask" "^1.2.2"
+
+"scheduler@^0.20.2":
+  "integrity" "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ=="
+  "resolved" "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz"
+  "version" "0.20.2"
+  dependencies:
+    "loose-envify" "^1.1.0"
+    "object-assign" "^4.1.1"
+
+"socket.io-adapter@~2.4.0":
+  "integrity" "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
+  "resolved" "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz"
+  "version" "2.4.0"
+
+"socket.io-client@^4.5.1":
+  "integrity" "sha512-ZpKteoA06RzkD32IbqILZ+Cnst4xewU7ZYK12aS1mzHftFFjpoMz69IuhP/nL25pJfao/amoPI527KnuhFm01g=="
+  "resolved" "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.4.tgz"
+  "version" "4.5.4"
+  dependencies:
+    "@socket.io/component-emitter" "~3.1.0"
+    "debug" "~4.3.2"
+    "engine.io-client" "~6.2.3"
+    "socket.io-parser" "~4.2.1"
+
+"socket.io-parser@~4.2.1":
+  "integrity" "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g=="
+  "resolved" "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz"
+  "version" "4.2.1"
+  dependencies:
+    "@socket.io/component-emitter" "~3.1.0"
+    "debug" "~4.3.1"
+
+"socket.io@^4.5.1":
+  "integrity" "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ=="
+  "resolved" "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz"
+  "version" "4.5.4"
+  dependencies:
+    "accepts" "~1.3.4"
+    "base64id" "~2.0.0"
+    "debug" "~4.3.2"
+    "engine.io" "~6.2.1"
+    "socket.io-adapter" "~2.4.0"
+    "socket.io-parser" "~4.2.1"
+
+"source-map-js@^1.0.1", "source-map-js@^1.0.2":
+  "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+  "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
+  "version" "1.0.2"
+
+"styled-jsx@5.0.0":
+  "integrity" "sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA=="
+  "resolved" "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0.tgz"
+  "version" "5.0.0"
+
+"supports-color@^5.3.0":
+  "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+  "version" "5.5.0"
+  dependencies:
+    "has-flag" "^3.0.0"
+
+"supports-color@^7.1.0":
+  "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="
+  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
+  "version" "7.2.0"
+  dependencies:
+    "has-flag" "^4.0.0"
+
+"supports-preserve-symlinks-flag@^1.0.0":
+  "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+  "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+  "version" "1.0.0"
+
+"tailwindcss@^3.0.23":
+  "integrity" "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA=="
+  "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz"
+  "version" "3.0.23"
+  dependencies:
+    "arg" "^5.0.1"
+    "chalk" "^4.1.2"
+    "chokidar" "^3.5.3"
+    "color-name" "^1.1.4"
+    "cosmiconfig" "^7.0.1"
+    "detective" "^5.2.0"
+    "didyoumean" "^1.2.2"
+    "dlv" "^1.1.3"
+    "fast-glob" "^3.2.11"
+    "glob-parent" "^6.0.2"
+    "is-glob" "^4.0.3"
+    "normalize-path" "^3.0.0"
+    "object-hash" "^2.2.0"
+    "postcss" "^8.4.6"
+    "postcss-js" "^4.0.0"
+    "postcss-load-config" "^3.1.0"
+    "postcss-nested" "5.0.6"
+    "postcss-selector-parser" "^6.0.9"
+    "postcss-value-parser" "^4.2.0"
+    "quick-lru" "^5.1.1"
+    "resolve" "^1.22.0"
+
+"to-regex-range@^5.0.1":
+  "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="
+  "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+  "version" "5.0.1"
+  dependencies:
+    "is-number" "^7.0.0"
+
+"typescript@^4.6.2":
+  "integrity" "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg=="
+  "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz"
+  "version" "4.6.2"
+
+"use-subscription@1.5.1":
+  "integrity" "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA=="
+  "resolved" "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz"
+  "version" "1.5.1"
+  dependencies:
+    "object-assign" "^4.1.1"
+
+"util-deprecate@^1.0.2":
+  "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+  "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+  "version" "1.0.2"
+
+"vary@^1":
+  "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+  "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
+  "version" "1.1.2"
+
+"ws@~8.2.3":
+  "integrity" "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
+  "resolved" "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz"
+  "version" "8.2.3"
+
+"xmlhttprequest-ssl@~2.0.0":
+  "integrity" "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
+  "resolved" "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz"
+  "version" "2.0.0"
+
+"xtend@^4.0.2":
+  "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+  "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
+  "version" "4.0.2"
+
+"yaml@^1.10.0", "yaml@^1.10.2":
+  "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+  "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz"
+  "version" "1.10.2"