diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..8692cf66
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..d3cff2ee
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,7 @@
+{
+ "tabWidth": 2,
+ "useTabs": false,
+ "trailingComma": "all",
+ "semi": true,
+ "printWidth": 80
+}
diff --git a/README.md b/README.md
index c81804bf..8d298e9b 100644
--- a/README.md
+++ b/README.md
@@ -1,1319 +1,315 @@
-# ๐ค ๊ฑฐ๋ API ํ์ฉ, ํ ํ๋ก์ ํธ
+# ๐ช ์ฐ์ฃผ๋ถ๋์ฐ
+
+> [๐ช ์ฐ์ฃผ๋ถ๋์ฐ์์ ์ง๋ณด๋ฌ ๊ฐ๊ธฐ](https://woojoo-land.netlify.app/)
+> [Github](https://github.com/pildrums/woojoo_land)
+
+---
+
+๊ด๋ฆฌ์ ๊ณ์
+
+```
+ID: admin@gmail.com
+PW: admin123
+```
+
+
+
+---
-์ฃผ์ด์ง API๋ฅผ ๋ถ์ํด ์ด๋ค ํ๋ก์ ํธ๋ฅผ ์งํ/์์ฑํ ๊ฒ์ธ์ง ํ ๋จ์๋ก ์์ ๋กญ๊ฒ ๊ฒฐ์ ํ๊ณ ๋ง๋ค์ด๋ณด์ธ์.
-TypeScript๋ฅผ ํ์๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
-๊ณผ์ ์ํ ๋ฐ ๋ฆฌ๋ทฐ ๊ธฐ๊ฐ์ ๋ณ๋ ๊ณต์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์!
+# ๐ฉโ๐ ๊ฐ๋ฐํ
+
+
-```
-KDT๊ธฐ์๋ฒํธ_์ด๋ฆ
-
-E.g, KDT0_ParkYoungWoong
-```
-
-1. ํ์ฌ ์ ์ฅ์๋ฅผ ๋ก์ปฌ์ ํด๋ก (Clone)ํฉ๋๋ค.
-1. ์์ ์ ๋ณธ๋ช
์ผ๋ก ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค.(๊ตฌ๋ถ ๊ฐ๋ฅํ๋๋ก ๋ณธ๋ช
์ ๊ผญ ํ์ค์นผ์ผ์ด์ค๋ก ํ์ํ์ธ์, `git branch KDTX_ParkYoungWoong`)
-1. ์์ ์ ๋ณธ๋ช
๋ธ๋์น์์ ๊ณผ์ ๋ฅผ ์ํํฉ๋๋ค.
-1. ๊ณผ์ ์ํ์ด ์๋ฃ๋๋ฉด, ์์ ์ ๋ณธ๋ช
๋ธ๋์น๋ฅผ ์๊ฒฉ ์ ์ฅ์์ ํธ์(Push)ํฉ๋๋ค.(`main` ๋ธ๋์น์ ํธ์ํ์ง ์๋๋ก ๊ผญ ์ฃผ์ํ์ธ์, `git push origin KDTX_ParkYoungWoong`)
-1. ์ ์ฅ์์์ `main` ๋ธ๋์น๋ฅผ ๋์์ผ๋ก Pull Request ์์ฑํ๋ฉด, ๊ณผ์ ์ ์ถ์ด ์๋ฃ๋ฉ๋๋ค!(E.g, `main` <== `KDTX_ParkYoungWoong`)
-
-- `main` ํน์ ๋ค๋ฅธ ์ฌ๋์ ๋ธ๋์น๋ก ์ ๋ ๋ณํฉํ์ง ์๋๋ก ์ฃผ์ํ์ธ์!
-- Pull Request์์ ๋ณด์ด๋ ์ค๋ช
์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ดํดํ๊ธฐ ์ฝ๋๋ก ๊ผผ๊ผผํ๊ฒ ์์ฑํ์ธ์!
-- Pull Request์์ ๊ณผ์ ์ ์ถ ํ ์ ๋ ๋ณํฉ(Merge)ํ์ง ์๋๋ก ์ฃผ์ํ์ธ์!
-- ๊ณผ์ ์ํ ๋ฐ ์ ์ถ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ๋ฐ๋ก ๋ด๋น ๋ฉํ ๋ ๊ฐ์ฌ์์ ์๊ธฐํ์ธ์!
-
-## API ์ฌ์ฉ๋ฒ
-
-๋ชจ๋ API ์์ฒญ(Request) `headers`์ ์๋ ์ ๋ณด๊ฐ ๊ผญ ํฌํจ๋ผ์ผ ํฉ๋๋ค!
-`username`์ `KDT5_TeamX`์ ๊ฐ์ด ๋ณธ๋ช
ํน์ ํ ์ด๋ฆ์ ํฌํจํด์ผ ํฉ๋๋ค!
-ํ์ธํ ์ ์๋ ์ฌ์ฉ์๋ ํ์ DB ์ ๋ณด๋ ์์๋ก ์ญ์ ๋ ์ ์์ต๋๋ค!
-
-```json
-{
- "content-type": "application/json",
- "apikey": "KDT5_nREmPe9B",
- "username": "KDT5_TeamX"
-}
-```
-
-
-
-## ์ธ์ฆ
-
-'์ธ์ฆ' ๊ด๋ จ API๋ ๋ชจ๋ ์ผ๋ฐ ์ฌ์ฉ์ ์ ์ฉ์
๋๋ค.
-
-### ํ์๊ฐ์
-
-์ฌ์ฉ์๊ฐ `username`์ ์ข
์๋์ด ํ์๊ฐ์
ํฉ๋๋ค.
-
-- ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ๋ ์ํธํํด ์ ์ฅํฉ๋๋ค.(๊ด๋ฆฌ์๋ ํ์ธํ ์ ์์ต๋๋ค!)
-- ํ๋กํ ์ด๋ฏธ์ง๋ 1MB ์ดํ์ฌ์ผ ํฉ๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/signup
- \ -X 'POST'
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- email: string // ์ฌ์ฉ์ ์์ด๋ (ํ์!)
- password: string // ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ, 8์ ์ด์ (ํ์!)
- displayName: string // ์ฌ์ฉ์ ์ด๋ฆ, 20์ ์ดํ (ํ์!)
- profileImgBase64?: string // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(base64) - jpg, jpeg, webp, png, gif, svg
-}
-```
-
-```json
-{
- "email": "thesecon@gmail.com",
- "password": "********",
- "displayName": "ParkYoungWoong",
- "profileImgBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf...(์๋ต)"
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue {
- user: { // ํ์๊ฐ์
ํ ์ฌ์ฉ์ ์ ๋ณด
- email: string // ์ฌ์ฉ์ ์์ด๋
- displayName: string // ์ฌ์ฉ์ ํ์ ์ด๋ฆ
- profileImg: string | null // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(URL)
- }
- accessToken: string // ์ฌ์ฉ์ ์ ๊ทผ ํ ํฐ
-}
-```
-
-```json
-{
- "user": {
- "email": "thesecon@gmail.com",
- "displayName": "ParkYoungWoong",
- "profileImg": "https://storage.googleapis.com/heropy-api/vjbtIrh5dGv163442.png"
- },
- "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlM3WDhpQ...(์๋ต)"
-}
-```
-
-### ๋ก๊ทธ์ธ
-
-- ๋ฐ๊ธ๋ `accessToken`์ 24์๊ฐ ํ ๋ง๋ฃ๋ฉ๋๋ค.(๋ง๋ฃ ํ ๋ค์ ๋ก๊ทธ์ธ ํ์)
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login
- \ -X 'POST'
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- email: string // ์ฌ์ฉ์ ์์ด๋ (ํ์!)
- password: string // ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ (ํ์!)
-}
-```
-
-```json
-{
- "email": "thesecon@gmail.com",
- "password": "********"
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue {
- user: { // ํ์๊ฐ์
ํ ์ฌ์ฉ์ ์ ๋ณด
- email: string // ์ฌ์ฉ์ ์์ด๋
- displayName: string // ์ฌ์ฉ์ ํ์ ์ด๋ฆ
- profileImg: string | null // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(URL)
- }
- accessToken: string // ์ฌ์ฉ์ ์ ๊ทผ ํ ํฐ
-}
-```
-
-```json
-{
- "user": {
- "email": "thesecon@gmail.com",
- "displayName": "ParkYoungWoong",
- "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
- },
- "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(์๋ต)"
-}
-```
-
-### ์ธ์ฆ ํ์ธ
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue {
- email: string // ์ฌ์ฉ์ ์์ด๋
- displayName: string // ์ฌ์ฉ์ ํ์ ์ด๋ฆ
- profileImg: string | null // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(URL)
-}
-```
-
-```json
-{
- "email": "thesecon@gmail.com",
- "displayName": "ParkYoungWoong",
- "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
-}
-```
-
-### ๋ก๊ทธ์์
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/logout
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
+
-- ์์
+## ์๋ฌด ๋ถ๋ด
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
-```ts
-type ResponseValue = true // ๋ก๊ทธ์์ ์ฒ๋ฆฌ ์ํ
-```
+
-### ์ฌ์ฉ์ ์ ๋ณด ์์
+**์ฌ์ฉ์ ํ์ด์ง**
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user
- \ -X 'PUT'
- \ -H 'Authorization: Bearer '
-```
+- ๊ฑฐ๋ ๋ด์ญ ์กฐํ
+- ๊ฑฐ๋๋ณ ์์ธ ๋ด์ญ ์กฐํ
+- ์ฐ ๋ชฉ๋ก ์กฐํ ํ์ด์ง
+- ์ฌ์ฉ์ ์ ๋ณด ์์ ํ์ด์ง
+- ๊ณ์ข ๊ด๋ฆฌ
+- ๊ด๋ฆฌ์ ํ์ด์ง ๊ฒ๊ทผ ๊ด๋ฆฌ
+- React-query ํ์ฉ
+- [์์
์ผ์ง](https://github.com/pildrums/woojoo_land/blob/master/src/pages/user/README.md)
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
-```ts
-interface RequestBody {
- displayName?: string // ์๋ก์ด ํ์ ์ด๋ฆ
- profileImgBase64?: string // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(base64) - jpg, jpeg, webp, png, gif, svg
- oldPassword?: string // ๊ธฐ์กด ๋น๋ฐ๋ฒํธ
- newPassword?: string // ์๋ก์ด ๋น๋ฐ๋ฒํธ
-}
-```
+
-```json
-{
- "oldPassword": "********",
- "newPassword": "**********"
-}
-```
+์ธ์ฆ-์ธ๊ฐ ํ์ด์ง
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+- ํ์ ๊ฐ์
, ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ์ธ์ฆํ์ธ API ํจ์ ๊ตฌํ ๋ฐ UI ์์
+- AuthForm ๋ฐ AuthTemplate์ผ๋ก ๊ณตํต ์ปดํฌ๋ํธ ์ ์
+- ๋ก๊ทธ์ธ, ํ์๊ฐ์
ํ์ด์ง ์์
+- Redux-saga ๋์
+- Git management
+- [์์
์ผ์ง](https://github.com/pildrums/woojoo_land/blob/master/src/pages/auth/README.md)
-```ts
-interface ResponseValue {
- email: string // ์ฌ์ฉ์ ์์ด๋
- displayName: string // ์ฌ์ฉ์ ํ์ ์ด๋ฆ
- profileImg: string | null // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง(URL)
-}
-```
+---
-```json
-{
- "email": "thesecon@gmail.com",
- "displayName": "ParkYoungWoong",
- "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
-}
-```
+
-### ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
+**๊ด๋ฆฌ์ ํ์ด์ง**
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
+- ์์ด์ด ํ๋ ์
+- ๋์์ธ
+- UI
+- ๊ด๋ฆฌ์ํ์ด์ง
+ - ์ํ ์กฐํ
+ - ์ฃผ๋ฌธ ์กฐํ
+ - ์ ์ ์กฐํ
+- [์์
์ผ์ง](https://github.com/pildrums/woojoo_land/blob/master/src/pages/main/README.md)
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/users
- \ -X 'GET'
- \ -H 'masterKey: true'
-```
+---
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-- ์์
+**์ํ ํ์ด์ง**
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+- ์ ์ ์ํ ์กฐํ
+- ์์ธ ์ํ ์กฐํ
+- ์ฅ๋ฐ๊ตฌ๋
+- ์ฐ ์ฌ๋ถ ์ํ๊ด๋ฆฌ
+- ๊ฒฐ์ ํ์ด์ง ๋ฐ ๊ฒฐ์
+- ํ๋ก์ ํธ ํ์ฅ
+- [์์
์ผ์ง](https://github.com/pildrums/woojoo_land/blob/master/src/pages/admin/README.md)
-```ts
-type ResponseValue = User[]
+---
-interface User {
- email: string // ์ฌ์ฉ์ ์์ด๋
- displayName: string // ์ฌ์ฉ์ ํ์ ์ด๋ฆ
- profileImg: string // ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง URL
-}
-```
+
+
-```json
-[
- {
- "email": "thesecon@gmail.com",
- "displayName": "HEROPY",
- "profileImg": null
- },
- {
- "email": "neo@zillinks.com",
- "displayName": "๋ฐ์์
",
- "profileImg": "https://storage.googleapis.com/heropy-api/Z_una7lyijv074804.png"
- },
- {
- "email": "test@test.com",
- "displayName": "๊ด๋ฆฌ์",
- "profileImg": "https://storage.googleapis.com/heropy-api/ZXcXjwsB7nv121507.png"
- }
-]
-```
+## ์ฌ์ฉ๊ธฐ์ ๋ฐ ๊ฐ๋ฐํ๊ฒฝ
-
+### Development
-## ๊ณ์ข
+
+
+
+
+
+
+
+
+
+
-'๊ณ์ข' ๊ด๋ จ API๋ ๋ชจ๋ ์ผ๋ฐ ์ฌ์ฉ์ ์ ์ฉ์
๋๋ค.
+
-### ์ ํ ๊ฐ๋ฅํ ์ํ ๋ชฉ๋ก ์กฐํ
+
+
-- ์ํ ๋น ํ๋์ ๊ณ์ข๋ง ํ์ฉ๋ฉ๋๋ค.
-- ์ฌ์ฉ์๊ฐ ๊ณ์ข๋ฅผ ์ถ๊ฐํ๋ฉด, ํด๋น ์ํ ์ ๋ณด `disabled` ์์ฑ์ด `true`๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
-- ์ํ ์ ๋ณด `digits` ์์ฑ์ ์ซ์๋ฅผ ๋ชจ๋ ๋ํ๋ฉด ๊ฐ ์ํ์ ์ ํจํ ๊ณ์ข๋ฒํธ ๊ธธ์ด๊ฐ ๋ฉ๋๋ค.
-- `[3, 2, 4, 3]` => 123-12-1234-123
+---
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account/banks
- \ -X 'GET'
- \ -H 'Authorization: Bearer '
-```
+## Config
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
+
+
-- ์์
+### Deployment
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-```ts
-type ResponseValue = Bank[] // ์ ํ ๊ฐ๋ฅํ ์ํ ์ ๋ณด ๋ชฉ๋ก
+### Environment
-interface Bank { // ์ ํ ๊ฐ๋ฅํ ์ํ ์ ๋ณด
- name: string // ์ํ ์ด๋ฆ
- code: string // ์ํ ์ฝ๋
- digits: number[] // ์ํ ๊ณ์ข ์๋ฆฟ์
- disabled: boolean // ์ฌ์ฉ์๊ฐ ์ถ๊ฐํ ๊ณ์ข ์ฌ๋ถ
-}
-```
+
+
+
+
+
-```json
-[
- {
- "name": "KB๊ตญ๋ฏผ์ํ",
- "code": "004",
- "digits": [3, 2, 4, 3],
- "disabled": false
- },
- {
- "name": "์ ํ์ํ",
- "code": "088",
- "digits": [3, 3, 6],
- "disabled": true
- },
- {
- "name": "์ฐ๋ฆฌ์ํ",
- "code": "020",
- "digits": [4, 3, 6],
- "disabled": true
- },
- {
- "name": "ํ๋์ํ",
- "code": "081",
- "digits": [3, 6, 5],
- "disabled": false
- },
- {
- "name": "์ผ์ด๋ฑ
ํฌ",
- "code": "089",
- "digits": [3, 3, 6],
- "disabled": false
- },
- {
- "name": "์นด์นด์ค๋ฑ
ํฌ",
- "code": "090",
- "digits": [4, 2, 7],
- "disabled": false
- },
- {
- "name": "NH๋ํ์ํ",
- "code": "011",
- "digits": [3, 4, 4, 2],
- "disabled": false
- }
-]
-```
+### Cowork Tools
-### ๊ณ์ข ๋ชฉ๋ก ๋ฐ ์์ก ์กฐํ
+
+
+
+
+
+
+
-- ๊ณ์ข๋ฒํธ๋ ์ผ๋ถ๋ง ๋
ธ์ถ๋ฉ๋๋ค. E.g. `"123-XXXX-XXXX-XX"`
-- ์์ก์ ๋จ์๋ '์ํ(๏ฟฆ)'์
๋๋ค.
+
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account
- \ -X 'GET'
- \ -H 'Authorization: Bearer '
-```
+---
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+## ์ค์น
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue {
- totalBalance: number // ์ฌ์ฉ์ ๊ณ์ข ์์ก ์ดํฉ
- accounts: Bank[] // ์ฌ์ฉ์ ๊ณ์ข ์ ๋ณด ๋ชฉ๋ก
-}
-
-interface Bank { // ์ฌ์ฉ์ ๊ณ์ข ์ ๋ณด
- id: string // ๊ณ์ข ID
- bankName: string // ์ํ ์ด๋ฆ
- bankCode: string // ์ํ ์ฝ๋
- accountNumber: string // ๊ณ์ข ๋ฒํธ
- balance: number // ๊ณ์ข ์์ก
-}
+```bash
+git clone git@github.com:pildrums/woojoo_land.git
+cd woojoo_land
```
-```json
-{
- "totalBalance": 5999900,
- "accounts": [
- {
- "id": "jQMfKla8vOIFELA3mAXv",
- "bankName": "NH๋ํ์ํ",
- "bankCode": "011",
- "accountNumber": "356-XXXX-XXXX-XX",
- "balance": 2999900
- },
- {
- "id": "wiPgsXvMAmcLw8AuRHIi",
- "bankName": "KB๊ตญ๋ฏผ์ํ",
- "bankCode": "004",
- "accountNumber": "123-XX-XXXX-XXX",
- "balance": 3000000
- }
- ]
-}
-```
-
-### ๊ณ์ข ์ฐ๊ฒฐ
+## ๊ฐ๋ฐ ์๋ฒ
-- ์ฐ๊ฒฐ๋ ๊ณ์ข ์์ก์๋ ์๋์ผ๋ก ๊ธฐ๋ณธ '3๋ฐฑ๋ง์'์ด ์ถ๊ฐ๋ฉ๋๋ค.
-- ์์ฒญํ๋ ๊ณ์ข๋ฒํธ์ ์ ํ๋ฒํธ์๋ `-` ๊ตฌ๋ถ์ด ์์ด์ผ ํฉ๋๋ค.
+๋ค์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ธ์.
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
+```bash
+npm start
```
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
-```ts
-interface RequestBody {
- bankCode: string // ์ฐ๊ฒฐํ ์ํ ์ฝ๋ (ํ์!)
- accountNumber: string // ์ฐ๊ฒฐํ ๊ณ์ข๋ฒํธ (ํ์!)
- phoneNumber: string // ์ฌ์ฉ์ ์ ํ๋ฒํธ (ํ์!)
- signature: boolean // ์ฌ์ฉ์ ์๋ช
(ํ์!)
-}
-```
+## ์ ์ฒด ํ๋ฉด ๊ตฌ์ฑ
-```json
-{
- "bankCode": "088",
- "accountNumber": "123456789012",
- "phoneNumber": "01012345678",
- "signature": true
-}
-```
+**๋ฉ์ธ ํ์ด์ง**
+
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-```ts
-interface ResponseValue { // ์ฐ๊ฒฐ๋ ๊ณ์ข ์ ๋ณด
- id: string // ๊ณ์ข ID
- bankName: string // ์ํ ์ด๋ฆ
- bankCode: string // ์ํ ์ฝ๋
- accountNumber: string // ๊ณ์ข ๋ฒํธ
- balance: number // ๊ณ์ข ์์ก
-}
-```
+---
-```json
-{
- "id": "1qRFC6Ey5VkSu6nyj5Ba",
- "bankName": "์ ํ์ํ",
- "bankCode": "088",
- "accountNumber": "123-XXX-XXXXXX",
- "balance": 3000000
-}
-```
+**๋ฉ์ธ ํ์ด์ง**
+
-### ๊ณ์ข ํด์ง
+
-- ํด์งํ ๊ณ์ข๋ ๋ค์ ์ฐ๊ฒฐํด๋ ์์ก์ด ๋ฐ์๋์ง ์์ต๋๋ค.(๊ธฐ๋ณธ ๊ธ์ก์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค)
+---
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account
- \ -X 'DELETE'
- \ -H 'Authorization: Bearer '
-```
+**๋ฉ์ธ ํ์ด์ง - ํ๊ทธ ๊ฒ์**
+
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-```ts
-interface RequestBody {
- accountId: string // ๊ณ์ข ID (ํ์!)
- signature: boolean // ์ฌ์ฉ์ ์๋ช
(ํ์!)
-}
-```
+---
-```json
-{
- "accountId": "jQMfKla8vOIFELA3mAXv",
- "signature": true
-}
-```
+**๋ฉ์ธ ํ์ด์ง - ๊ฒ์์ฐฝ ๊ฒ์**
+
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-```ts
-type ResponseValue = true // ๊ณ์ข ํด์ง ์ฒ๋ฆฌ ์ํ
-```
-
-
-
-## ์ ํ
+---
-'์ ํ' ๊ด๋ จ API๋ ๊ด๋ฆฌ์ ์ ์ฉ๊ณผ ์ผ๋ฐ ์ฌ์ฉ์ ์ ์ฉ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
-๊ณต์ฉ API๋ ์์ผ๋ ์ฃผ์ํ์ธ์!
+**์์ธ ํ์ด์ง**
+
-### ๋ชจ๋ ์ ํ ์กฐํ
-
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
-- ์์ธ ์ ๋ณด๊ฐ ์๋ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ํ ์ค๋ช
์ 100์๊น์ง๋ง ํฌํจ๋ฉ๋๋ค.
-- ์์ธ ์ ๋ณด๊ฐ ์๋ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ํ ์์ธ ์ฌ์ง์ ํฌํจ๋์ง ์์ต๋๋ค.
-- ์ ํ ํ ์ธ์จ(`discountRate`)์ ์ ํ ๊ฐ๊ฒฉ๊ณผ ์ง์ ๊ด๊ณ๊ฐ ์๋ ๋จ์ ๋ฉ๋ชจ ์์ฑ์
๋๋ค.
-- ์ ํ ํ ์ธ์จ์ด ์๋ ๊ฒฝ์ฐ, `0`์ผ๋ก ํ์๋ฉ๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products
- \ -X 'GET'
- \ -H 'masterKey: true'
-```
+
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
-- ์์
+**์ฅ๋ฐ๊ตฌ๋**
+
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+
-```ts
-type ResponseValue = Product[] // ๊ด๋ฆฌํ๋ ๋ชจ๋ ์ ํ์ ๋ชฉ๋ก
+---
-interface Product { // ์ ํ ์ ๋ณด
- id: string // ์ ํ ID
- title: string // ์ ํ ์ด๋ฆ
- price: number // ์ ํ ๊ฐ๊ฒฉ
- description: string // ์ ํ ์ค๋ช
(์ต๋ 100์)
- tags: string[] // ์ ํ ํ๊ทธ
- thumbnail: string | null // ์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง(URL)
- isSoldOut: boolean // ์ ํ ๋งค์ง ์ฌ๋ถ
- discountRate: number // ์ ํ ํ ์ธ์จ
-}
-```
+**์ฃผ๋ฌธ ํ์ด์ง**
+
-```json
-[
- {
- "id": "cFmeC7aY5KjZbBAdJE9y",
- "title": "์ผ์ฑ์ ์ ์ค๋งํธ๋ชจ๋ํฐ M7 S43AM700",
- "price": 639000,
- "description": "107.9cm(43์ธ์น) / ์์ด๋(16:9) / ํ๋ฉด / VA / 3840 x 2160(4K UHD) / ํฝ์
ํผ์น: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
- "tags": [
- "๊ฐ์ ",
- "๋ชจ๋ํฐ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
- "isSoldOut": false,
- "discountRate": 20
- },
- {
- "id": "nbqtQvEivYwEXTDet7YM",
- "title": "MacBook Pro 16",
- "price": 3360000,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
- "isSoldOut": false,
- "discountRate": 0
- }
-]
-```
+
-### ์ ์ฒด ๊ฑฐ๋(ํ๋งค) ๋ด์ญ
+---
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
+**๋ง์ด ํ์ด์ง - ์ฃผ๋ฌธ ๋ด์ญ**
+
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/all
- \ -X 'GET'
- \ -H 'masterKey: true'
-```
+
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type RequestValue = TransactionDetail[] // ๋ชจ๋ ๊ฑฐ๋ ๋ด์ญ์ ๋ชฉ๋ก
-
-interface TransactionDetail { // ๊ฑฐ๋ ๋ด์ญ ์ ๋ณด
- detailId: string // ๊ฑฐ๋ ๋ด์ญ ID
- user: { // ๊ฑฐ๋ํ ์ฌ์ฉ์ ์ ๋ณด
- email: string
- displayName: string
- profileImg: string | null
- }
- account: { // ๊ฑฐ๋ํ ์ฌ์ฉ์์ ๊ณ์ข ์ ๋ณด
- bankName: string
- bankCode: string
- accountNumber: string
- }
- product: { // ๊ฑฐ๋ํ ์ ํ ์ ๋ณด
- productId: string
- title: string
- price: number
- description: string
- tags: string[]
- thumbnail: string | null
- discountRate: number
- }
- reservation: Reservation | null // ๊ฑฐ๋ํ ์ ํ์ ์์ฝ ์ ๋ณด
- timePaid: string // ์ ํ์ ๊ฑฐ๋ํ ์๊ฐ
- isCanceled: boolean // ๊ฑฐ๋ ์ทจ์ ์ฌ๋ถ
- done: boolean // ๊ฑฐ๋ ์๋ฃ ์ฌ๋ถ
-}
-
-interface Reservation {
- start: string // ์์ฝ ์์ ์๊ฐ
- end: string // ์์ฝ ์ข
๋ฃ ์๊ฐ
- isCanceled: boolean // ์์ฝ ์ทจ์ ์ฌ๋ถ
- isExpired: boolean // ์์ฝ ๋ง๋ฃ ์ฌ๋ถ
-}
-```
+---
-```json
-[
- {
- "detailId": "dMhfxyrAupQP18OYmywy",
- "user": {
- "email": "thesecon@gmail.com",
- "displayName": "ParkYoungWoong",
- "profileImg": "https://storage.googleapis.com/heropy-api/vsLRqTlPO5v200111.png"
- },
- "account": {
- "bankName": "KB๊ตญ๋ฏผ์ํ",
- "bankCode": "004",
- "accountNumber": "123-XX-XXXX-XXX"
- },
- "product": {
- "productId": "cFmeC7aY5KjZbBAdJE9y",
- "title": "์ผ์ฑ์ ์ ์ค๋งํธ๋ชจ๋ํฐ M7 S43AM700",
- "price": 639000,
- "description": "107.9cm(43์ธ์น) / ์์ด๋(16:9) / ํ๋ฉด / VA / 3840 x 2160(4K UHD) / ํฝ์
ํผ์น: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
- "tags": [
- "๊ฐ์ ",
- "๋ชจ๋ํฐ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
- "discountRate": 0
- },
- "reservation": null,
- "timePaid": "2021-11-07T20:01:49.100Z",
- "isCanceled": false,
- "done": false
- }
-]
-```
+**๋ง์ด ํ์ด์ง - ๊ณ์ข ๊ด๋ฆฌ**
+
-์์ฝ ์ ๋ณด(`reservation`)๊ฐ ์๋ ๊ฒฝ์ฐ:
-
-```json
-[
- {
- "reservation": {
- "start": "2021-11-12T06:00:00.000Z",
- "end": "2021-11-12T07:00:00.000Z",
- "isCanceled": false,
- "isExpired": true
- }
- }
-]
-```
+
-### ๊ฑฐ๋(ํ๋งค) ๋ด์ญ ์๋ฃ/์ทจ์ ๋ฐ ํด์
+---
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
-- ๊ฑฐ๋ ๋ด์ญ์ ์ทจ์ํ๋ฉด, ์์ฝ๋ ๊ฐ์ด ์ทจ์๋ฉ๋๋ค.
-- ๊ฑฐ๋ ๋ด์ญ์ ์ทจ์ ํด์ ํ๋ฉด, ์์ฝ๋ ๊ฐ์ด ์ทจ์๊ฐ ํด์ ๋ฉ๋๋ค.
+**๋ง์ด ํ์ด์ง - ์ฐํ ์ํ**
+
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/:detailId
- \ -X 'PUT'
- \ -H 'masterKey: true'
-```
+
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
-```ts
-interface RequestBody {
- isCanceled?: boolean // ๊ฑฐ๋ ์ทจ์ ์ฌ๋ถ (์ฌ์ฉ์์ '์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ์ทจ์' ์ํ์ ๊ฐ์ต๋๋ค)
- done?: boolean // ๊ฑฐ๋ ์๋ฃ ์ฌ๋ถ (์ฌ์ฉ์์ '์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ํ์ ' ์ํ์ ๊ฐ์ต๋๋ค)
-}
-```
+**๋ง์ด ํ์ด์ง - ๊ฐ์ธ์ ๋ณด ์์ **
+
-```json
-{
- "isCanceled": true
-}
-```
+
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
+---
+**๋ก๊ทธ์ธ**
+
-```ts
-type ResponseValue = true // ๊ฑฐ๋ ๋ด์ญ ์๋ฃ/์ทจ์ ๋ฐ ํด์ ์ฒ๋ฆฌ ์ํ
-```
+
-### ์ ํ ์ถ๊ฐ
+---
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
-- ํ์ผ(์ฌ์ง)์ Base64๋ก ์์ฒญํด์ผ ํฉ๋๋ค.
-- ์ ํ ์ธ๋ค์ผ ์ฌ์ง์ 1MB ์ดํ์ฌ์ผ ํฉ๋๋ค.
-- ์ ํ ์์ธ ์ฌ์ง์ 4MB ์ดํ์ฌ์ผ ํฉ๋๋ค.
-- ์ ํ ํ ์ธ์จ(`discountRate`)์ ์ ํ ๊ฐ๊ฒฉ๊ณผ ์ง์ ๊ด๊ณ๊ฐ ์๋ ๋จ์ ๋ฉ๋ชจ ์์ฑ์
๋๋ค.
-- ์ ํ ํ ์ธ์จ์ `0`~`99` ์ฌ์ด ์ซ์๋ฅผ ์
๋ ฅํ์ธ์. ๋ง์ฝ ํ ์ธ์จ์ด '20%'์ธ ๊ฒฝ์ฐ, `20`์ผ๋ก ์
๋ ฅํด์ผ ํฉ๋๋ค.
-- ์ ํ ํ ์ธ์จ์ ์
๋ ฅํ์ง ์์ผ๋ฉด, `0`์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
+**ํ์ ๊ฐ์
**
+
-```js
-// ํ ์ธ ์ ๊ฐ๊ฒฉ์ ๊ณ์ฐ!
-const priceBeforeDiscount = price * 100 / (100 - discountRate)
-```
+
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products
- \ -X 'POST'
- \ -H 'masterKey: true'
-```
+---
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- title: string // ์ ํ ์ด๋ฆ (ํ์!)
- price: number // ์ ํ ๊ฐ๊ฒฉ (ํ์!)
- description: string // ์ ํ ์์ธ ์ค๋ช
(ํ์!)
- tags?: string[] // ์ ํ ํ๊ทธ
- thumbnailBase64?: string // ์ ํ ์ธ๋ค์ผ(๋ํ) ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
- photoBase64?: string // ์ ํ ์์ธ ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
- discountRate?: number // ์ ํ ํ ์ธ์จ
-}
-```
+**๊ด๋ฆฌ์ ํ์ด์ง - ์ ์ฒด ๊ฑฐ๋ ๋ด์ญ**
+
-```json
-{
- "title": "MacBook Pro 16",
- "price": 3360000,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ๋ฅ๊ณผ ๋๋ผ์ด ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ ์๊ฐ์ ์๋ํ์ฃ . ์ฌ๊ธฐ์ ์์ ์ ์ฌ๋ก์ก๋ Liquid Retina XDR ๋์คํ๋ ์ด, Mac ๋
ธํธ๋ถ ์ฌ์ ์ต๊ณ ์ ์นด๋ฉ๋ผ ๋ฐ ์ค๋์ค ๊ทธ๋ฆฌ๊ณ ๋ํ ๋์ ์์ด ๋ค์ํ ํฌํธ๊น์ง. ๊ธฐ์กด ๊ทธ ์ด๋ค ์นดํ
๊ณ ๋ฆฌ์๋ ์ํ์ง ์๋ ๋
ธํธ๋ถ. ์๋ก์ด MacBook Pro๋ ๊ทธ์ผ๋ง๋ก ์ผ์์
๋๋ค.",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnailBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...(์๋ต)"
-}
-```
+
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue { // ์ถ๊ฐํ ์ ํ์ ์์ธ ๋ด์ฉ
- id: string // ์ ํ ID
- title: string // ์ ํ ์ด๋ฆ
- price: number // ์ ํ ๊ฐ๊ฒฉ
- description: string // ์ ํ ์์ธ ์ค๋ช
- tags: string[] // ์ ํ ํ๊ทธ
- thumbnail: string | null // ์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง(URL)
- photo: string | null // ์ ํ ์์ธ ์ด๋ฏธ์ง(URL)
- isSoldOut: boolean // ์ ํ ๋งค์ง ์ฌ๋ถ
- discountRate: number // ์ ํ ํ ์ธ์จ
-}
-```
+---
-```json
-{
- "id": "nbqtQvEivYwEXTDet7YM",
- "title": "MacBook Pro 16",
- "price": 3360000,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ๋ฅ๊ณผ ๋๋ผ์ด ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ ์๊ฐ์ ์๋ํ์ฃ . ์ฌ๊ธฐ์ ์์ ์ ์ฌ๋ก์ก๋ Liquid Retina XDR ๋์คํ๋ ์ด, Mac ๋
ธํธ๋ถ ์ฌ์ ์ต๊ณ ์ ์นด๋ฉ๋ผ ๋ฐ ์ค๋์ค ๊ทธ๋ฆฌ๊ณ ๋ํ ๋์ ์์ด ๋ค์ํ ํฌํธ๊น์ง. ๊ธฐ์กด ๊ทธ ์ด๋ค ์นดํ
๊ณ ๋ฆฌ์๋ ์ํ์ง ์๋ ๋
ธํธ๋ถ. ์๋ก์ด MacBook Pro๋ ๊ทธ์ผ๋ง๋ก ์ผ์์
๋๋ค.",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
- "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
- "isSoldOut": false,
- "discountRate": 0
-}
-```
+**๊ด๋ฆฌ์ ํ์ด์ง - ์ฌ์ฉ์ ์กฐํ**
+
-### ์ ํ ์์
+
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
-- ์ฌ์ฉ์์ ๊ตฌ๋งค ๋ด์ญ ํ์ธ์ ์ํด, ์ ํ์ ์ค์ ๋ก๋ ์ญ์ ํ์ง ์๊ณ ๋งค์ง(Sold Out) ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
-- ๋งค์ง์ ๋ค์ ํด์ ํ ์ ์์ต๋๋ค.
+---
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
- \ -X 'PUT'
- \ -H 'masterKey: true'
-```
+**๊ด๋ฆฌ์ ํ์ด์ง - ๋ชจ๋ ์ ํ ์กฐํ**
+
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- title?: string // ์ ํ ์ด๋ฆ
- price?: number // ์ ํ ๊ฐ๊ฒฉ
- description?: string // ์ ํ ์์ธ ์ค๋ช
- tags?: string[] // ์ ํ ํ๊ทธ
- thumbnailBase64?: string // ์ ํ ์ธ๋ค์ผ(๋ํ) ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
- photoBase64?: string // ์ ํ ์์ธ ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
- isSoldOut?: boolean // ์ ํ ๋งค์ง ์ฌ๋ถ
- discountRate?: number // ์ ํ ํ ์ธ์จ
-}
-```
+
-```json
-{
- "price": 1500
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue { // ์์ ํ ์ ํ์ ์์ธ ๋ด์ฉ
- id: string // ์ ํ ID
- title: string // ์ ํ ์ด๋ฆ
- price: number // ์ ํ ๊ฐ๊ฒฉ
- description: string // ์ ํ ์์ธ ์ค๋ช
- tags: string[] // ์ ํ ํ๊ทธ
- thumbnail: string | null // ์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง(URL)
- photo: string | null // ์ ํ ์์ธ ์ด๋ฏธ์ง(URL)
- isSoldOut: boolean // ์ ํ ๋งค์ง ์ฌ๋ถ
- discountRate: number // ์ ํ ํ ์ธ์จ
-}
-```
-
-```json
-{
- "id": "nbqtQvEivYwEXTDet7YM",
- "title": "MacBook Pro 16",
- "price": 1500,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ๋ฅ๊ณผ ๋๋ผ์ด ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ ์๊ฐ์ ์๋ํ์ฃ . ์ฌ๊ธฐ์ ์์ ์ ์ฌ๋ก์ก๋ Liquid Retina XDR ๋์คํ๋ ์ด, Mac ๋
ธํธ๋ถ ์ฌ์ ์ต๊ณ ์ ์นด๋ฉ๋ผ ๋ฐ ์ค๋์ค ๊ทธ๋ฆฌ๊ณ ๋ํ ๋์ ์์ด ๋ค์ํ ํฌํธ๊น์ง. ๊ธฐ์กด ๊ทธ ์ด๋ค ์นดํ
๊ณ ๋ฆฌ์๋ ์ํ์ง ์๋ ๋
ธํธ๋ถ. ์๋ก์ด MacBook Pro๋ ๊ทธ์ผ๋ง๋ก ์ผ์์
๋๋ค.",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
- "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
- "isSoldOut": false,
- "discountRate": 0
-}
-```
-
-### ์ ํ ์ญ์
-
-- ๊ด๋ฆฌ์ ์ ์ฉ API์
๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
- \ -X 'DELETE'
- \ -H 'masterKey: true'
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type ResponseValue = true // ์ ํ ์ญ์ ์ฒ๋ฆฌ ์ํ
-```
-
-### ๋จ์ผ ์ ํ ์์ธ ์กฐํ
-
-- ๊ณต์ฉ API์
๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
- \ -X 'GET'
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface ResponseValue { // ์ ํ์ ์์ธ ๋ด์ฉ
- id: string // ์ ํ ID
- title: string // ์ ํ ์ด๋ฆ
- price: number // ์ ํ ๊ฐ๊ฒฉ
- description: string // ์ ํ ์์ธ ์ค๋ช
- tags: string[] // ์ ํ ํ๊ทธ
- thumbnail: string | null // ์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง(URL)
- photo: string | null // ์ ํ ์์ธ ์ด๋ฏธ์ง(URL)
- isSoldOut: boolean // ์ ํ ๋งค์ง ์ฌ๋ถ
- reservations: Reservation[] // ์ ํ์ ๋ชจ๋ ์์ฝ ์ ๋ณด ๋ชฉ๋ก
- discountRate: number // ์ ํ ํ ์ธ์จ
-}
-
-interface Reservation {
- start: string // ์์ฝ ์์ ์๊ฐ
- end: string // ์์ฝ ์ข
๋ฃ ์๊ฐ
- isCanceled: boolean // ์์ฝ ์ทจ์ ์ฌ๋ถ
- isExpired: boolean // ์์ฝ ๋ง๋ฃ ์ฌ๋ถ
-}
-```
-
-```json
-{
- "id": "nbqtQvEivYwEXTDet7YM",
- "title": "MacBook Pro 16",
- "price": 3360000,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ๋ฅ๊ณผ ๋๋ผ์ด ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ ์๊ฐ์ ์๋ํ์ฃ . ์ฌ๊ธฐ์ ์์ ์ ์ฌ๋ก์ก๋ Liquid Retina XDR ๋์คํ๋ ์ด, Mac ๋
ธํธ๋ถ ์ฌ์ ์ต๊ณ ์ ์นด๋ฉ๋ผ ๋ฐ ์ค๋์ค ๊ทธ๋ฆฌ๊ณ ๋ํ ๋์ ์์ด ๋ค์ํ ํฌํธ๊น์ง. ๊ธฐ์กด ๊ทธ ์ด๋ค ์นดํ
๊ณ ๋ฆฌ์๋ ์ํ์ง ์๋ ๋
ธํธ๋ถ. ์๋ก์ด MacBook Pro๋ ๊ทธ์ผ๋ง๋ก ์ผ์์
๋๋ค.",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
- "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
- "isSoldOut": false,
- "reservations": [],
- "discountRate": 0
-}
-```
-
-์์ฝ ์ ๋ณด(`reservation`)๊ฐ ์๋ ๊ฒฝ์ฐ:
-
-```json
-{
- "reservations": [
- {
- "reservation": {
- "start": "2021-11-12T06:00:00.000Z",
- "end": "2021-11-12T07:00:00.000Z",
- "isCanceled": false,
- "isExpired": true
- }
- }
- ]
-}
-```
-
-### ์ ํ ๊ฒ์
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-- ์ ํ ์ด๋ฆ๊ณผ ํ๊ทธ๋ฅผ ๋์์ ๊ฒ์ํ ์ ์๊ณ , 'And'(๊ฒ์ํ ์ด๋ฆ๊ณผ ํ๊ทธ ๋ชจ๋ ํฌํจ๋ ์ ํ) ์กฐ๊ฑด์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
-- ์ ํ ์ด๋ฆ๊ณผ ํ๊ทธ ๋ชจ๋ ํฌํจํ์ง ์์ผ๋ฉด, ๋ชจ๋ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
-- ์ ํ์ ๊ธฐ๋ณธ ์ ๋ณด๋ง ๋ฐํํฉ๋๋ค.
-- ๋งค์ง๋ ์ ํ์ ๊ฒ์๋์ง ์์ต๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/search
- \ -X 'POST'
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- searchText?: string // ๊ฒ์ํ ์ ํ ์ด๋ฆ
- searchTags?: string[] // ๊ฒ์ํ ์ ํ ํ๊ทธ
-}
-```
-
-```json
-{
- "searchText": "์ผ์ฑ์ ์",
- "searchTags": ["๊ฐ์ "]
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type ResponseValue = Product[] // ๊ด๋ฆฌํ๋ ๋ชจ๋ ์ ํ์ ๋ชฉ๋ก
-
-interface Product { // ์ ํ ์ ๋ณด
- id: string // ์ ํ ID
- title: string // ์ ํ ์ด๋ฆ
- price: number // ์ ํ ๊ฐ๊ฒฉ
- description: string // ์ ํ ์ค๋ช
(์ต๋ 100์)
- tags: string[] // ์ ํ ํ๊ทธ
- thumbnail: string | null // ์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง(URL)
- discountRate: number // ์ ํ ํ ์ธ์จ
-}
-```
-
-```json
-[
- {
- "id": "cFmeC7aY5KjZbBAdJE9y",
- "title": "์ผ์ฑ์ ์ ์ค๋งํธ๋ชจ๋ํฐ M7 S43AM700",
- "price": 639000,
- "description": "107.9cm(43์ธ์น) / ์์ด๋(16:9) / ํ๋ฉด / VA / 3840 x 2160(4K UHD) / ํฝ์
ํผ์น: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
- "tags": [
- "๊ฐ์ ",
- "๋ชจ๋ํฐ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
- "discountRate": 0
- }
-]
-```
-
-### ์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ์ ์ฒญ
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-- ๊ฑฐ๋(๊ตฌ๋งค) ์ ์ฒญ์ ์ฐ๊ฒฐ๋ ๊ณ์ข์์ ๊ฒฐ์ ๋ฉ๋๋ค.
-- ๊ฒฐ์ ํ ๊ณ์ข(ID)๋ฅผ ๊ผญ ์ ํํด์ผ ํฉ๋๋ค.(`๊ณ์ข ๋ชฉ๋ก ๋ฐ ์์ก ์กฐํ` API๋ฅผ ์ฌ์ฉํ์ธ์)
-- ์ ํํ ๊ณ์ข์ ์์ก๋ณด๋ค ๊ฒฐ์ ๊ธ์ก์ด ํฌ๋ฉด ๊ฒฐ์ ๊ฐ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.(์๋ฌ ๋ฐํ)
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/buy
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- productId: string // ๊ฑฐ๋ํ ์ ํ ID (ํ์!)
- accountId: string // ๊ฒฐ์ ํ ์ฌ์ฉ์ ๊ณ์ข ID (ํ์!)
- reservation?: { // ์์ฝ ์ ๋ณด(์์ฝ ์์คํ
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ง ํ์)
- start: string // ์์ฝ ์์ ์๊ฐ(ISO)
- end: string // ์์ฝ ์ข
๋ฃ ์๊ฐ(ISO)
- }
-}
-```
-
-```js
-const isoString = new Date().toISOString()
-```
-
-```json
-{
- "productId": "nbqtQvEivYwEXTDet7YM",
- "accountId": "Mq2KKHk8vlmr6Xkg58Fa",
- "reservation": {
- "start": "2021-11-12T06:00:00.000Z",
- "end": "2021-11-12T07:00:00.000Z"
- }
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type ResponseValue = true // ๊ฑฐ๋ ์ ์ฒญ ์ฒ๋ฆฌ ์ฌ๋ถ
-```
-
-### ์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ์ทจ์
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-- '๊ฑฐ๋ ์ทจ์'์ ๊ฒฐ์ ํ ์ฌ์ฉ์ ๊ณ์ข๋ก ๊ธ์ก์ด ํ๋ถ๋ฉ๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/cancel
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- detailId: string // ์ทจ์ํ ์ ํ์ ๊ฑฐ๋ ๋ด์ญ ID
-}
-```
-
-```json
-{
- "detailId": "dMhfxyrAupQP18OYmywy"
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type ResponseValue = true // ๊ฑฐ๋ ์ทจ์ ์ฒ๋ฆฌ ์ฌ๋ถ
-```
-
-### ์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ํ์
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-- '๊ฑฐ๋(๊ตฌ๋งค) ํ์ ' ํ์๋ '๊ฑฐ๋ ์ทจ์'๋ฅผ ํ ์ ์์ต๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/ok
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- detailId: string // ๊ฑฐ๋(๊ตฌ๋งค) ํ์ ํ ์ ํ์ ๊ฑฐ๋ ๋ด์ญ ID
-}
-```
-
-```json
-{
- "detailId": "dMhfxyrAupQP18OYmywy"
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type ResponseValue = true // ๊ฑฐ๋(๊ตฌ๋งค) ํ์ ์ฒ๋ฆฌ ์ฌ๋ถ
-```
-
-### ์ ํ ์ ์ฒด ๊ฑฐ๋(๊ตฌ๋งค) ๋ด์ญ
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-- ๊ฑฐ๋ ๋ด์ญ์ ๊ธฐ๋ณธ ์ ๋ณด๋ง ํฌํจ๋ฉ๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/details
- \ -X 'GET'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-- ์์
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-type RequestValue = TransactionDetail[] // ๋ชจ๋ ๊ฑฐ๋ ๋ด์ญ์ ๋ชฉ๋ก
-
-interface TransactionDetail { // ๊ฑฐ๋ ๋ด์ญ ์ ๋ณด
- detailId: string // ๊ฑฐ๋ ๋ด์ญ ID
- product: { // ๊ฑฐ๋ํ ์ ํ ์ ๋ณด
- productId: string
- title: string
- price: number
- description: string
- tags: string[]
- thumbnail: string | null
- discountRate: number // ์ ํ ํ ์ธ์จ
- }
- reservation: Reservation | null // ๊ฑฐ๋ํ ์ ํ์ ์์ฝ ์ ๋ณด
- timePaid: string // ์ ํ์ ๊ฑฐ๋ํ ์๊ฐ
- isCanceled: boolean // ๊ฑฐ๋ ์ทจ์ ์ฌ๋ถ
- done: boolean // ๊ฑฐ๋ ์๋ฃ ์ฌ๋ถ
-}
-
-interface Reservation {
- start: string // ์์ฝ ์์ ์๊ฐ
- end: string // ์์ฝ ์ข
๋ฃ ์๊ฐ
- isCanceled: boolean // ์์ฝ ์ทจ์ ์ฌ๋ถ
- isExpired: boolean // ์์ฝ ๋ง๋ฃ ์ฌ๋ถ
-}
-```
-
-```json
-[
- {
- "detailId": "9jAoagzrZBkSWI5NctEB",
- "product": {
- "productId": "nbqtQvEivYwEXTDet7YM",
- "title": "MacBook Pro 16",
- "price": 3360000,
- "description": "์ญ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ MacBook Pro๊ฐ ๋ฑ์ฅํ์ต๋๋ค. ์ต์ด์ ํ๋ก์ฉ Apple Silicon์ธ M1 Pro ๋๋ M1 Max ์นฉ์ ํ์ฌํด ์์ด๊ฐ์ด ๋น ๋ฅธ ์๋๋ ๋ฌผ๋ก , ํ๊ธฐ์ ์ธ ์ฑ",
- "tags": [
- "๊ฐ์ ",
- "๋
ธํธ๋ถ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
- "discountRate": 0
- },
- "reservation": null,
- "timePaid": "2021-11-07T20:17:32.112Z",
- "isCanceled": true,
- "done": false
- },
- {
- "detailId": "dMhfxyrAupQP18OYmywy",
- "product": {
- "productId": "cFmeC7aY5KjZbBAdJE9y",
- "title": "์ผ์ฑ์ ์ ์ค๋งํธ๋ชจ๋ํฐ M7 S43AM700",
- "price": 639000,
- "description": "107.9cm(43์ธ์น) / ์์ด๋(16:9) / ํ๋ฉด / VA / 3840 x 2160(4K UHD) / ํฝ์
ํผ์น: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
- "tags": [
- "๊ฐ์ ",
- "๋ชจ๋ํฐ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
- "discountRate": 0
- },
- "reservation": {
- "start": "2021-11-12T06:00:00.000Z",
- "end": "2021-11-12T07:00:00.000Z",
- "isCanceled": false,
- "isExpired": true
- },
- "timePaid": "2021-11-07T20:01:49.100Z",
- "isCanceled": false,
- "done": true
- }
-]
-```
-
-### ๋จ์ผ ์ ํ ์์ธ ๊ฑฐ๋(๊ตฌ๋งค) ๋ด์ญ
-
-- ์ฌ์ฉ์ ์ ์ฉ API์
๋๋ค.
-
-```curl
-curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/detail
- \ -X 'POST'
- \ -H 'Authorization: Bearer '
-```
-
-์์ฒญ ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface RequestBody {
- detailId: string // ์์ธ ๋ด์ฉ์ ํ์ธํ ๊ฑฐ๋(๊ตฌ๋งค) ๋ด์ญ ID
-}
-```
-
-```json
-{
- "detailId": "dMhfxyrAupQP18OYmywy"
-}
-```
-
-์๋ต ๋ฐ์ดํฐ ํ์
๋ฐ ์์:
-
-```ts
-interface TransactionDetail { // ์์ธ ๊ฑฐ๋ ์ ๋ณด
- detailId: string // ๊ฑฐ๋ ๋ด์ญ ID
- account: { // ๊ฑฐ๋ํ ์ฌ์ฉ์์ ๊ณ์ข ์ ๋ณด
- bankName: string
- bankCode: string
- accountNumber: string
- }
- product: { // ๊ฑฐ๋ํ ์ ํ ์ ๋ณด
- productId: string
- title: string
- price: number
- description: string
- tags: string[]
- thumbnail: string | null
- photo: string | null
- discountRate: number // ์ ํ ํ ์ธ์จ
- }
- reservation: Reservation | null // ๊ฑฐ๋ํ ์ ํ์ ์์ฝ ์ ๋ณด
- timePaid: string // ์ ํ์ ๊ฑฐ๋ํ ์๊ฐ
- isCanceled: boolean // ๊ฑฐ๋ ์ทจ์ ์ฌ๋ถ
- done: boolean // ๊ฑฐ๋ ์๋ฃ ์ฌ๋ถ
-}
-
-interface Reservation {
- start: string // ์์ฝ ์์ ์๊ฐ
- end: string // ์์ฝ ์ข
๋ฃ ์๊ฐ
- isCanceled: boolean // ์์ฝ ์ทจ์ ์ฌ๋ถ
- isExpired: boolean // ์์ฝ ๋ง๋ฃ ์ฌ๋ถ
-}
-```
-
-```json
-{
- "detailId": "dMhfxyrAupQP18OYmywy",
- "account": {
- "bankName": "KB๊ตญ๋ฏผ์ํ",
- "bankCode": "004",
- "accountNumber": "123-XX-XXXX-XXX"
- },
- "product": {
- "productId": "cFmeC7aY5KjZbBAdJE9y",
- "title": "์ผ์ฑ์ ์ ์ค๋งํธ๋ชจ๋ํฐ M7 S43AM700",
- "price": 639000,
- "description": "107.9cm(43์ธ์น) / ์์ด๋(16:9) / ํ๋ฉด / VA / 3840 x 2160(4K UHD) / ํฝ์
ํผ์น: 0.2451mm / 8ms(GTG) / 300cd / 5,000:1 / ์ต๋ ์ฃผ์ฌ์จ: 60Hz / HDMI 2.0 / USB Type-C / ํ๋ฆฌ์ปค ํ๋ฆฌ / ๋ธ๋ฃจ๋ผ์ดํธ ์ฐจ๋จ / ๊ฒ์๋ชจ๋ ์ง์ / ์คํผ์ปค / ๋ฆฌ๋ชจ์ปจ / USBํ๋ธ / Wi-Fi(๋ฌด์ ) / ์ค๋งํธTV / ๋ธ๋ฃจํฌ์ค / ํธํธ(์ํ) / 200 x 200mm / HDR / HDR10 / 10.6kg ๊ธฐํ์ ์ฐจ์ธ๋ ๊ฒ์ ๋ผ์ดํ PS5 ๋งค๋ ฅ๋ถ์ ๊ด๋ จ๊ธฐ์ฌ ํ์๋, 43์ธ์น 4K UHD ์ค๋งํธ ๋ชจ๋ํฐ โ์ผ์ฑ์ ์ M7 S43AM700โ ์ถ์ ๋ฐ ํ ์ธ ํ์ฌ ์ฌ์ฉ๊ธฐ ์ผ์ฑ ์ค๋งํธ๋ชจ๋ํฐ m7 s43am700",
- "tags": [
- "๊ฐ์ ",
- "๋ชจ๋ํฐ",
- "์ปดํจํฐ"
- ],
- "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
- "photo": "https://storage.googleapis.com/heropy-api/vVLP-ox_zSDv195712.jpg",
- "discountRate": 0
- },
- "reservation": null,
- "timePaid": "2021-11-07T20:01:49.100Z",
- "isCanceled": false,
- "done": true
-}
-```
+---
diff --git a/netlify.toml b/netlify.toml
new file mode 100644
index 00000000..c37d3add
--- /dev/null
+++ b/netlify.toml
@@ -0,0 +1,9 @@
+[[redirects]]
+ from = "/*"
+ to = "/index.html"
+ status = 200
+
+[build]
+ command = "npm run build"
+ publish = "build"
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..b5fe11e9
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,16532 @@
+{
+ "name": "woojoo-land",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "woojoo-land",
+ "version": "0.1.0",
+ "dependencies": {
+ "@testing-library/jest-dom": "^5.14.1",
+ "@testing-library/react": "^13.0.0",
+ "@testing-library/user-event": "^13.2.1",
+ "@types/jest": "^27.0.1",
+ "@types/node": "^16.7.13",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "@types/react-js-pagination": "^3.0.4",
+ "@types/react-slick": "^0.23.10",
+ "axios": "^1.4.0",
+ "react": "^18.2.0",
+ "react-calendar": "^4.3.0",
+ "react-collapsible": "^2.10.0",
+ "react-dom": "^18.2.0",
+ "react-icons": "^4.9.0",
+ "react-js-pagination": "^3.0.3",
+ "react-pagination": "^1.0.0",
+ "react-query": "^3.39.3",
+ "react-redux": "^8.0.7",
+ "react-router-dom": "^6.11.2",
+ "react-scripts": "5.0.1",
+ "react-slick": "^0.29.0",
+ "react-spinners": "^0.13.8",
+ "redux-saga": "^1.2.3",
+ "redux-thunk": "^2.4.2",
+ "slick-carousel": "^1.8.1",
+ "styled-components": "^5.3.11",
+ "typesafe-actions": "^5.1.0",
+ "typescript": "^4.4.2",
+ "web-vitals": "^2.1.0"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.22.1",
+ "@reduxjs/toolkit": "^1.9.5",
+ "@types/styled-components": "^5.1.26",
+ "babel-plugin-styled-components": "^2.1.3",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "prettier": "^2.8.8"
+ }
+ },
+ "node_modules/@adobe/css-tools": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz",
+ "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA=="
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
+ "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz",
+ "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz",
+ "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==",
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.21.4",
+ "@babel/generator": "^7.22.0",
+ "@babel/helper-compilation-targets": "^7.22.1",
+ "@babel/helper-module-transforms": "^7.22.1",
+ "@babel/helpers": "^7.22.0",
+ "@babel/parser": "^7.22.0",
+ "@babel/template": "^7.21.9",
+ "@babel/traverse": "^7.22.1",
+ "@babel/types": "^7.22.0",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.21.8",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz",
+ "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==",
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@babel/eslint-parser/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz",
+ "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==",
+ "dependencies": {
+ "@babel/types": "^7.22.3",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz",
+ "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz",
+ "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==",
+ "dependencies": {
+ "@babel/types": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz",
+ "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.0",
+ "@babel/helper-validator-option": "^7.21.0",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz",
+ "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.22.1",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-member-expression-to-functions": "^7.22.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.22.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz",
+ "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "regexpu-core": "^5.3.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz",
+ "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.17.7",
+ "@babel/helper-plugin-utils": "^7.16.7",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2",
+ "semver": "^6.1.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0-0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz",
+ "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+ "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+ "dependencies": {
+ "@babel/template": "^7.20.7",
+ "@babel/types": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz",
+ "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==",
+ "dependencies": {
+ "@babel/types": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz",
+ "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==",
+ "dependencies": {
+ "@babel/types": "^7.21.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz",
+ "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.1",
+ "@babel/helper-module-imports": "^7.21.4",
+ "@babel/helper-simple-access": "^7.21.5",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.21.9",
+ "@babel/traverse": "^7.22.1",
+ "@babel/types": "^7.22.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz",
+ "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz",
+ "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz",
+ "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-wrap-function": "^7.18.9",
+ "@babel/types": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz",
+ "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.1",
+ "@babel/helper-member-expression-to-functions": "^7.22.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/template": "^7.21.9",
+ "@babel/traverse": "^7.22.1",
+ "@babel/types": "^7.22.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz",
+ "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==",
+ "dependencies": {
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz",
+ "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==",
+ "dependencies": {
+ "@babel/types": "^7.20.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
+ "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+ "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz",
+ "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==",
+ "dependencies": {
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/template": "^7.18.10",
+ "@babel/traverse": "^7.20.5",
+ "@babel/types": "^7.20.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz",
+ "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==",
+ "dependencies": {
+ "@babel/template": "^7.21.9",
+ "@babel/traverse": "^7.22.1",
+ "@babel/types": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/@babel/highlight/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/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==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.22.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz",
+ "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz",
+ "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz",
+ "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-transform-optional-chaining": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
+ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-decorators": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz",
+ "integrity": "sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-replace-supers": "^7.22.1",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/plugin-syntax-decorators": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
+ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
+ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
+ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz",
+ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz",
+ "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz",
+ "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-decorators": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz",
+ "integrity": "sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz",
+ "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz",
+ "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz",
+ "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz",
+ "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.21.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz",
+ "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz",
+ "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz",
+ "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==",
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-remap-async-to-generator": "^7.18.9",
+ "@babel/plugin-syntax-async-generators": "^7.8.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz",
+ "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-remap-async-to-generator": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz",
+ "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz",
+ "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz",
+ "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz",
+ "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz",
+ "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-optimise-call-expression": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-replace-supers": "^7.20.7",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz",
+ "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/template": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.21.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz",
+ "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz",
+ "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz",
+ "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.22.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz",
+ "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz",
+ "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==",
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz",
+ "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz",
+ "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-flow": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz",
+ "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz",
+ "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.18.9",
+ "@babel/helper-function-name": "^7.18.9",
+ "@babel/helper-plugin-utils": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz",
+ "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-json-strings": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz",
+ "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz",
+ "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz",
+ "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz",
+ "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helper-plugin-utils": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz",
+ "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.21.5",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-simple-access": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz",
+ "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==",
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-module-transforms": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-validator-identifier": "^7.19.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz",
+ "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz",
+ "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz",
+ "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz",
+ "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz",
+ "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz",
+ "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.3",
+ "@babel/helper-compilation-targets": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-transform-parameters": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz",
+ "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6",
+ "@babel/helper-replace-supers": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz",
+ "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz",
+ "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz",
+ "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz",
+ "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz",
+ "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz",
+ "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.3.tgz",
+ "integrity": "sha512-b5J6muxQYp4H7loAQv/c7GO5cPuRA6H5hx4gO+/Hn+Cu9MRQU0PNiUoWq1L//8sq6kFSNxGXFb2XTaUfa9y+Pg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz",
+ "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz",
+ "integrity": "sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-module-imports": "^7.21.4",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-jsx": "^7.21.4",
+ "@babel/types": "^7.22.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz",
+ "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz",
+ "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz",
+ "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "regenerator-transform": "^0.15.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz",
+ "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.22.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz",
+ "integrity": "sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.21.4",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "babel-plugin-polyfill-corejs2": "^0.4.3",
+ "babel-plugin-polyfill-corejs3": "^0.8.1",
+ "babel-plugin-polyfill-regenerator": "^0.5.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz",
+ "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz",
+ "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz",
+ "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz",
+ "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz",
+ "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz",
+ "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/plugin-syntax-typescript": "^7.21.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz",
+ "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz",
+ "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz",
+ "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz",
+ "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.22.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz",
+ "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==",
+ "dependencies": {
+ "@babel/compat-data": "^7.22.3",
+ "@babel/helper-compilation-targets": "^7.22.1",
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-validator-option": "^7.21.0",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3",
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.0",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.20.0",
+ "@babel/plugin-syntax-import-attributes": "^7.22.3",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.21.5",
+ "@babel/plugin-transform-async-generator-functions": "^7.22.3",
+ "@babel/plugin-transform-async-to-generator": "^7.20.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.18.6",
+ "@babel/plugin-transform-block-scoping": "^7.21.0",
+ "@babel/plugin-transform-class-properties": "^7.22.3",
+ "@babel/plugin-transform-class-static-block": "^7.22.3",
+ "@babel/plugin-transform-classes": "^7.21.0",
+ "@babel/plugin-transform-computed-properties": "^7.21.5",
+ "@babel/plugin-transform-destructuring": "^7.21.3",
+ "@babel/plugin-transform-dotall-regex": "^7.18.6",
+ "@babel/plugin-transform-duplicate-keys": "^7.18.9",
+ "@babel/plugin-transform-dynamic-import": "^7.22.1",
+ "@babel/plugin-transform-exponentiation-operator": "^7.18.6",
+ "@babel/plugin-transform-export-namespace-from": "^7.22.3",
+ "@babel/plugin-transform-for-of": "^7.21.5",
+ "@babel/plugin-transform-function-name": "^7.18.9",
+ "@babel/plugin-transform-json-strings": "^7.22.3",
+ "@babel/plugin-transform-literals": "^7.18.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.22.3",
+ "@babel/plugin-transform-member-expression-literals": "^7.18.6",
+ "@babel/plugin-transform-modules-amd": "^7.20.11",
+ "@babel/plugin-transform-modules-commonjs": "^7.21.5",
+ "@babel/plugin-transform-modules-systemjs": "^7.22.3",
+ "@babel/plugin-transform-modules-umd": "^7.18.6",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3",
+ "@babel/plugin-transform-new-target": "^7.22.3",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3",
+ "@babel/plugin-transform-numeric-separator": "^7.22.3",
+ "@babel/plugin-transform-object-rest-spread": "^7.22.3",
+ "@babel/plugin-transform-object-super": "^7.18.6",
+ "@babel/plugin-transform-optional-catch-binding": "^7.22.3",
+ "@babel/plugin-transform-optional-chaining": "^7.22.3",
+ "@babel/plugin-transform-parameters": "^7.22.3",
+ "@babel/plugin-transform-private-methods": "^7.22.3",
+ "@babel/plugin-transform-private-property-in-object": "^7.22.3",
+ "@babel/plugin-transform-property-literals": "^7.18.6",
+ "@babel/plugin-transform-regenerator": "^7.21.5",
+ "@babel/plugin-transform-reserved-words": "^7.18.6",
+ "@babel/plugin-transform-shorthand-properties": "^7.18.6",
+ "@babel/plugin-transform-spread": "^7.20.7",
+ "@babel/plugin-transform-sticky-regex": "^7.18.6",
+ "@babel/plugin-transform-template-literals": "^7.18.9",
+ "@babel/plugin-transform-typeof-symbol": "^7.18.9",
+ "@babel/plugin-transform-unicode-escapes": "^7.21.5",
+ "@babel/plugin-transform-unicode-property-regex": "^7.22.3",
+ "@babel/plugin-transform-unicode-regex": "^7.18.6",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.22.3",
+ "@babel/preset-modules": "^0.1.5",
+ "@babel/types": "^7.22.4",
+ "babel-plugin-polyfill-corejs2": "^0.4.3",
+ "babel-plugin-polyfill-corejs3": "^0.8.1",
+ "babel-plugin-polyfill-regenerator": "^0.5.0",
+ "core-js-compat": "^3.30.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+ "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.3.tgz",
+ "integrity": "sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-validator-option": "^7.21.0",
+ "@babel/plugin-transform-react-display-name": "^7.18.6",
+ "@babel/plugin-transform-react-jsx": "^7.22.3",
+ "@babel/plugin-transform-react-jsx-development": "^7.18.6",
+ "@babel/plugin-transform-react-pure-annotations": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.21.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz",
+ "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.21.5",
+ "@babel/helper-validator-option": "^7.21.0",
+ "@babel/plugin-syntax-jsx": "^7.21.4",
+ "@babel/plugin-transform-modules-commonjs": "^7.21.5",
+ "@babel/plugin-transform-typescript": "^7.21.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.22.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz",
+ "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.21.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz",
+ "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.21.4",
+ "@babel/parser": "^7.21.9",
+ "@babel/types": "^7.21.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.22.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz",
+ "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.21.4",
+ "@babel/generator": "^7.22.3",
+ "@babel/helper-environment-visitor": "^7.22.1",
+ "@babel/helper-function-name": "^7.21.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.22.4",
+ "@babel/types": "^7.22.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.22.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz",
+ "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.21.5",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
+ },
+ "node_modules/@csstools/normalize.css": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
+ "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
+ },
+ "node_modules/@csstools/postcss-cascade-layers": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz",
+ "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.2",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-color-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz",
+ "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-font-format-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz",
+ "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-hwb-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz",
+ "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-ic-unit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz",
+ "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz",
+ "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-nested-calc": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz",
+ "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-normalize-display-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz",
+ "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-oklab-function": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz",
+ "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-progressive-custom-properties": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz",
+ "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/@csstools/postcss-stepped-value-functions": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz",
+ "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-text-decoration-shorthand": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz",
+ "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-trigonometric-functions": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz",
+ "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/postcss-unset-value": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz",
+ "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ }
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
+ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
+ },
+ "node_modules/@emotion/stylis": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
+ "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+ "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+ "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.5.2",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.41.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz",
+ "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA=="
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz",
+ "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==",
+ "dependencies": {
+ "@sinclair/typebox": "^0.24.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
+ "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
+ "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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==",
+ "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==",
+ "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==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz",
+ "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==",
+ "dependencies": {
+ "ansi-html-community": "^0.0.8",
+ "common-path-prefix": "^3.0.0",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "find-up": "^5.0.0",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^3.0.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <4.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@redux-saga/core": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz",
+ "integrity": "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA==",
+ "dependencies": {
+ "@babel/runtime": "^7.6.3",
+ "@redux-saga/deferred": "^1.2.1",
+ "@redux-saga/delay-p": "^1.2.1",
+ "@redux-saga/is": "^1.1.3",
+ "@redux-saga/symbols": "^1.1.3",
+ "@redux-saga/types": "^1.2.1",
+ "redux": "^4.0.4",
+ "typescript-tuple": "^2.2.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/redux-saga"
+ }
+ },
+ "node_modules/@redux-saga/deferred": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz",
+ "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g=="
+ },
+ "node_modules/@redux-saga/delay-p": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz",
+ "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==",
+ "dependencies": {
+ "@redux-saga/symbols": "^1.1.3"
+ }
+ },
+ "node_modules/@redux-saga/is": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz",
+ "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==",
+ "dependencies": {
+ "@redux-saga/symbols": "^1.1.3",
+ "@redux-saga/types": "^1.2.1"
+ }
+ },
+ "node_modules/@redux-saga/symbols": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz",
+ "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg=="
+ },
+ "node_modules/@redux-saga/types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz",
+ "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA=="
+ },
+ "node_modules/@reduxjs/toolkit": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz",
+ "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==",
+ "devOptional": true,
+ "dependencies": {
+ "immer": "^9.0.21",
+ "redux": "^4.2.1",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.8"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react-redux": "^7.2.1 || ^8.0.2"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz",
+ "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@rollup/plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@rollup/pluginutils": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "@types/babel__core": "^7.1.9",
+ "rollup": "^1.20.0||^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/babel__core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/plugin-node-resolve": {
+ "version": "11.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz",
+ "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "@types/resolve": "1.17.1",
+ "builtin-modules": "^3.1.0",
+ "deepmerge": "^4.2.2",
+ "is-module": "^1.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-replace": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz",
+ "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==",
+ "dependencies": {
+ "@rollup/pluginutils": "^3.1.0",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0 || ^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
+ "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
+ "dependencies": {
+ "@types/estree": "0.0.39",
+ "estree-walker": "^1.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0"
+ }
+ },
+ "node_modules/@rollup/pluginutils/node_modules/@types/estree": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+ },
+ "node_modules/@rushstack/eslint-patch": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz",
+ "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w=="
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.24.51",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
+ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA=="
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@surma/rollup-plugin-off-main-thread": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
+ "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==",
+ "dependencies": {
+ "ejs": "^3.1.6",
+ "json5": "^2.2.0",
+ "magic-string": "^0.25.0",
+ "string.prototype.matchall": "^4.0.6"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+ "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+ "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+ "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+ "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+ "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+ "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+ "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz",
+ "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+ "dependencies": {
+ "@svgr/plugin-jsx": "^5.5.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+ "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+ "dependencies": {
+ "@babel/types": "^7.12.6"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+ "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@svgr/babel-preset": "^5.5.0",
+ "@svgr/hast-util-to-babel-ast": "^5.5.0",
+ "svg-parser": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+ "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "deepmerge": "^4.2.2",
+ "svgo": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz",
+ "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+ "@babel/preset-env": "^7.12.1",
+ "@babel/preset-react": "^7.12.5",
+ "@svgr/core": "^5.5.0",
+ "@svgr/plugin-jsx": "^5.5.0",
+ "@svgr/plugin-svgo": "^5.5.0",
+ "loader-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz",
+ "integrity": "sha512-Dffe68pGwI6WlLRYR2I0piIkyole9cSBH5jGQKCGMRpHW5RHCqAUaqc2Kv0tUyd4dU4DLPKhJIjyKOnjv4tuUw==",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "^5.0.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "5.16.5",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz",
+ "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==",
+ "dependencies": {
+ "@adobe/css-tools": "^4.0.1",
+ "@babel/runtime": "^7.9.2",
+ "@types/testing-library__jest-dom": "^5.9.1",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.5.6",
+ "lodash": "^4.17.15",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@testing-library/react": {
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz",
+ "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@testing-library/dom": "^8.5.0",
+ "@types/react-dom": "^18.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@testing-library/react/node_modules/@testing-library/dom": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz",
+ "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "^5.0.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.4.4",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@testing-library/user-event": {
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
+ "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz",
+ "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q=="
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+ "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
+ "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.0.tgz",
+ "integrity": "sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==",
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.10",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz",
+ "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
+ "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.40.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz",
+ "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
+ "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA=="
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.17",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.17.35",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz",
+ "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+ "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+ "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.11",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz",
+ "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g=="
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+ "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "27.5.2",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz",
+ "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==",
+ "dependencies": {
+ "jest-matcher-utils": "^27.0.0",
+ "pretty-format": "^27.0.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.12",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA=="
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.14.195",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
+ "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg=="
+ },
+ "node_modules/@types/lodash.memoize": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/@types/lodash.memoize/-/lodash.memoize-4.1.7.tgz",
+ "integrity": "sha512-lGN7WeO4vO6sICVpf041Q7BX/9k1Y24Zo3FY0aUezr1QlKznpjzsDk3T3wvH8ofYzoK0QupN9TWcFAFZlyPwQQ==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
+ },
+ "node_modules/@types/node": {
+ "version": "16.18.34",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.34.tgz",
+ "integrity": "sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg=="
+ },
+ "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=="
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.5",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w=="
+ },
+ "node_modules/@types/q": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz",
+ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ=="
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz",
+ "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.4",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz",
+ "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-js-pagination": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/react-js-pagination/-/react-js-pagination-3.0.4.tgz",
+ "integrity": "sha512-yka+27eZ6Mg9cmwT2sADgLn3ij9hVfpPu5dk+Y/0k1xS52WZOz0LJnn4y4VKGmR4mf/tG5Ga7Dody/xmfiB0Fg==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-slick": {
+ "version": "0.23.10",
+ "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz",
+ "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/resolve": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
+ "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.3",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+ "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw=="
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz",
+ "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==",
+ "dependencies": {
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.33",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",
+ "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw=="
+ },
+ "node_modules/@types/styled-components": {
+ "version": "5.1.26",
+ "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz",
+ "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==",
+ "dev": true,
+ "dependencies": {
+ "@types/hoist-non-react-statics": "*",
+ "@types/react": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/testing-library__jest-dom": {
+ "version": "5.14.6",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz",
+ "integrity": "sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA==",
+ "dependencies": {
+ "@types/jest": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz",
+ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g=="
+ },
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
+ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "16.0.5",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz",
+ "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA=="
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz",
+ "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.59.8",
+ "@typescript-eslint/type-utils": "5.59.8",
+ "@typescript-eslint/utils": "5.59.8",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/experimental-utils": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.8.tgz",
+ "integrity": "sha512-jAf+hihtd0G2RLB9x796+3i8D0L5T5xjftuPpJ82RLsPNHdzGXmbZNNftQ558h90ogc45DD8/W3OrxmdSO5Nng==",
+ "dependencies": {
+ "@typescript-eslint/utils": "5.59.8"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz",
+ "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.59.8",
+ "@typescript-eslint/types": "5.59.8",
+ "@typescript-eslint/typescript-estree": "5.59.8",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz",
+ "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==",
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.8",
+ "@typescript-eslint/visitor-keys": "5.59.8"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz",
+ "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.59.8",
+ "@typescript-eslint/utils": "5.59.8",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz",
+ "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz",
+ "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==",
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.8",
+ "@typescript-eslint/visitor-keys": "5.59.8",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz",
+ "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.59.8",
+ "@typescript-eslint/types": "5.59.8",
+ "@typescript-eslint/typescript-estree": "5.59.8",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.59.8",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz",
+ "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==",
+ "dependencies": {
+ "@typescript-eslint/types": "5.59.8",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+ "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+ "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+ "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+ "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-opt": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6",
+ "@webassemblyjs/wast-printer": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+ "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+ "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+ "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+ "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@wojtekmaj/date-utils": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.4.1.tgz",
+ "integrity": "sha512-Fjs0KJz0//0AmlJVFx9AQmWpmxOTw4foDo4DKoswWVVjHsna4rdu+fXwid5YHNgzv/wHi9AkZCRPmHWsf890lg==",
+ "funding": {
+ "url": "https://github.com/wojtekmaj/date-utils?sponsor=1"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
+ },
+ "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": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+ "engines": {
+ "node": ">=0.4.2"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz",
+ "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ },
+ "node_modules/ast-types": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
+ "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag=="
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.14",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz",
+ "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.5",
+ "caniuse-lite": "^1.0.30001464",
+ "fraction.js": "^4.2.0",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+ "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+ "dependencies": {
+ "follow-redirects": "^1.15.0",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
+ "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz",
+ "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==",
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^2.0.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-named-asset-import": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz",
+ "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==",
+ "peerDependencies": {
+ "@babel/core": "^7.1.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz",
+ "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==",
+ "dependencies": {
+ "@babel/compat-data": "^7.17.7",
+ "@babel/helper-define-polyfill-provider": "^0.4.0",
+ "semver": "^6.1.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz",
+ "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.0",
+ "core-js-compat": "^3.30.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz",
+ "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.4.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-styled-components": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz",
+ "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-module-imports": "^7.21.4",
+ "babel-plugin-syntax-jsx": "^6.18.0",
+ "lodash": "^4.17.21",
+ "picomatch": "^2.3.1"
+ },
+ "peerDependencies": {
+ "styled-components": ">= 2"
+ }
+ },
+ "node_modules/babel-plugin-syntax-jsx": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+ "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw=="
+ },
+ "node_modules/babel-plugin-transform-react-remove-prop-types": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
+ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
+ "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-import-meta": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-top-level-await": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-react-app": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz",
+ "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
+ "@babel/plugin-proposal-decorators": "^7.16.4",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.16.0",
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
+ "@babel/plugin-proposal-private-methods": "^7.16.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.16.0",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-runtime": "^7.16.4",
+ "@babel/preset-env": "^7.16.4",
+ "@babel/preset-react": "^7.16.0",
+ "@babel/preset-typescript": "^7.16.0",
+ "@babel/runtime": "^7.16.3",
+ "babel-plugin-macros": "^3.1.0",
+ "babel-plugin-transform-react-remove-prop-types": "^0.4.24"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base62": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz",
+ "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="
+ },
+ "node_modules/bfj": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz",
+ "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==",
+ "dependencies": {
+ "bluebird": "^3.5.5",
+ "check-types": "^11.1.1",
+ "hoopy": "^0.1.4",
+ "tryer": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.51",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
+ "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+ "dependencies": {
+ "inherits": "~2.0.0"
+ },
+ "engines": {
+ "node": "0.4 || >=0.5.8"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz",
+ "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==",
+ "dependencies": {
+ "array-flatten": "^2.1.2",
+ "dns-equal": "^1.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/broadcast-channel": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+ "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "detect-node": "^2.1.0",
+ "js-sha3": "0.8.0",
+ "microseconds": "0.2.0",
+ "nano-time": "1.0.0",
+ "oblivious-set": "1.0.0",
+ "rimraf": "3.0.2",
+ "unload": "2.2.0"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
+ },
+ "node_modules/browserslist": {
+ "version": "4.21.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz",
+ "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001489",
+ "electron-to-chromium": "^1.4.411",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001492",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz",
+ "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/case-sensitive-paths-webpack-plugin": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
+ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/check-types": {
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz",
+ "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA=="
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "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/chokidar/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==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
+ },
+ "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/clean-css": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
+ "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "dependencies": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/coa/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==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/coa/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/coa/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/coa/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/coa/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==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg=="
+ },
+ "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==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "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=="
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ },
+ "node_modules/commoner": {
+ "version": "0.10.8",
+ "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz",
+ "integrity": "sha512-3/qHkNMM6o/KGXHITA14y78PcfmXh4+AOCJpSoF73h4VY1JpdGv3CHMS5+JW6SwLhfJt4RhNmLAa7+RRX/62EQ==",
+ "dependencies": {
+ "commander": "^2.5.0",
+ "detective": "^4.3.1",
+ "glob": "^5.0.15",
+ "graceful-fs": "^4.1.2",
+ "iconv-lite": "^0.4.5",
+ "mkdirp": "^0.5.0",
+ "private": "^0.1.6",
+ "q": "^1.1.2",
+ "recast": "^0.11.17"
+ },
+ "bin": {
+ "commonize": "bin/commonize"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commoner/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/commoner/node_modules/glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==",
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/commoner/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA=="
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "node_modules/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "node_modules/core-js": {
+ "version": "3.30.2",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz",
+ "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.30.2",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz",
+ "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==",
+ "dependencies": {
+ "browserslist": "^4.21.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.30.2",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz",
+ "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "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/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/css-blank-pseudo": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz",
+ "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-blank-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz",
+ "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==",
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-has-pseudo": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz",
+ "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "bin": {
+ "css-has-pseudo": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz",
+ "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.21",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.3",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz",
+ "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==",
+ "dependencies": {
+ "cssnano": "^5.0.6",
+ "jest-worker": "^27.0.2",
+ "postcss": "^8.3.5",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@parcel/css": {
+ "optional": true
+ },
+ "clean-css": {
+ "optional": true
+ },
+ "csso": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
+ "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-prefers-color-scheme": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
+ "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==",
+ "bin": {
+ "css-prefers-color-scheme": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+ },
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
+ },
+ "node_modules/cssdb": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz",
+ "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ }
+ ]
+ },
+ "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==",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "5.1.15",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
+ "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==",
+ "dependencies": {
+ "cssnano-preset-default": "^5.2.14",
+ "lilconfig": "^2.0.3",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz",
+ "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==",
+ "dependencies": {
+ "css-declaration-sorter": "^6.3.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-calc": "^8.2.3",
+ "postcss-colormin": "^5.3.1",
+ "postcss-convert-values": "^5.1.3",
+ "postcss-discard-comments": "^5.1.2",
+ "postcss-discard-duplicates": "^5.1.0",
+ "postcss-discard-empty": "^5.1.1",
+ "postcss-discard-overridden": "^5.1.0",
+ "postcss-merge-longhand": "^5.1.7",
+ "postcss-merge-rules": "^5.1.4",
+ "postcss-minify-font-values": "^5.1.0",
+ "postcss-minify-gradients": "^5.1.1",
+ "postcss-minify-params": "^5.1.4",
+ "postcss-minify-selectors": "^5.2.1",
+ "postcss-normalize-charset": "^5.1.0",
+ "postcss-normalize-display-values": "^5.1.0",
+ "postcss-normalize-positions": "^5.1.1",
+ "postcss-normalize-repeat-style": "^5.1.1",
+ "postcss-normalize-string": "^5.1.0",
+ "postcss-normalize-timing-functions": "^5.1.0",
+ "postcss-normalize-unicode": "^5.1.1",
+ "postcss-normalize-url": "^5.1.0",
+ "postcss-normalize-whitespace": "^5.1.1",
+ "postcss-ordered-values": "^5.1.3",
+ "postcss-reduce-initial": "^5.1.2",
+ "postcss-reduce-transforms": "^5.1.0",
+ "postcss-svgo": "^5.1.0",
+ "postcss-unique-selectors": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz",
+ "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "node_modules/csso/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+ },
+ "node_modules/csstype": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="
+ },
+ "node_modules/deep-equal": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz",
+ "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.0",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.0",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
+ "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/defined": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
+ "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ },
+ "node_modules/detect-port-alt": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+ "dependencies": {
+ "address": "^1.0.1",
+ "debug": "^2.6.0"
+ },
+ "bin": {
+ "detect": "bin/detect-port",
+ "detect-port": "bin/detect-port"
+ },
+ "engines": {
+ "node": ">= 4.2.1"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/detect-port-alt/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/detective": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz",
+ "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==",
+ "dependencies": {
+ "acorn": "^5.2.1",
+ "defined": "^1.0.0"
+ }
+ },
+ "node_modules/detective/node_modules/acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.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=="
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
+ },
+ "node_modules/dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg=="
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz",
+ "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
+ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
+ "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/ejs": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+ "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.414",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz",
+ "integrity": "sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w=="
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.14.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz",
+ "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquire.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+ "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw=="
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envify": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz",
+ "integrity": "sha512-XLiBFsLtNF0MOZl+vWU59yPb3C2JtrQY2CNJn22KH75zPlHWY5ChcAQuf4knJeWT/lLkrx3sqvhP/J349bt4Bw==",
+ "dependencies": {
+ "jstransform": "^11.0.3",
+ "through": "~2.3.4"
+ },
+ "bin": {
+ "envify": "bin/envify"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.21.2",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz",
+ "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.2.0",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.7",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="
+ },
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz",
+ "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg=="
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+ "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/escodegen/node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.41.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz",
+ "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.3",
+ "@eslint/js": "8.41.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.5.2",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz",
+ "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-config-react-app": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
+ "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@babel/eslint-parser": "^7.16.3",
+ "@rushstack/eslint-patch": "^1.1.0",
+ "@typescript-eslint/eslint-plugin": "^5.5.0",
+ "@typescript-eslint/parser": "^5.5.0",
+ "babel-preset-react-app": "^10.0.1",
+ "confusing-browser-globals": "^1.0.11",
+ "eslint-plugin-flowtype": "^8.0.3",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jest": "^25.3.0",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.27.1",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "eslint-plugin-testing-library": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+ "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+ "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz",
+ "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@babel/plugin-syntax-flow": "^7.14.5",
+ "@babel/plugin-transform-react-jsx": "^7.14.9",
+ "eslint": "^8.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.27.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+ "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "25.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz",
+ "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==",
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
+ "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "aria-query": "^5.1.3",
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.6.2",
+ "axobject-query": "^3.1.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.3",
+ "language-tags": "=1.0.5",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
+ "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "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/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-testing-library": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz",
+ "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==",
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.58.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "eslint": "^7.5.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
+ "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+ "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==",
+ "dependencies": {
+ "@types/eslint": "^7.29.0 || ^8.4.1",
+ "jest-worker": "^28.0.2",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz",
+ "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
+ "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/eslint-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+ "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima-fb": {
+ "version": "15001.1.0-dev-harmony-fb",
+ "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz",
+ "integrity": "sha512-59dDGQo2b3M/JfKIws0/z8dcXH2mnVHkfSPRhCYS91JNGfGNwr7GsSF6qzWZuOGvw5Ii0w9TtylrX07MGmlOoQ==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
+ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "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/fast-glob/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==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filesize": {
+ "version": "8.0.7",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
+ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ=="
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
+ "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "glob": "^7.1.6",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">= 6",
+ "typescript": ">= 2.7",
+ "vue-template-compiler": "*",
+ "webpack": ">= 4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ },
+ "vue-template-compiler": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
+ "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
+ "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://www.patreon.com/infusion"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
+ "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q=="
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/fstream": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+ "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/fstream/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-user-locale": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.2.1.tgz",
+ "integrity": "sha512-3814zipTZ2MvczOcppEXB3jXu+0HWwj5WmPI6//SeCnUIUaRXu7W4S54eQZTEPadlMZefE+jAlPOn+zY3tD4Qw==",
+ "dependencies": {
+ "@types/lodash.memoize": "^4.1.7",
+ "lodash.memoize": "^4.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/wojtekmaj/get-user-locale?sponsor=1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ=="
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+ },
+ "node_modules/harmony-reflect": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz",
+ "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g=="
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
+ "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz",
+ "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "webpack": "^5.20.0"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
+ "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/idb": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
+ "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
+ },
+ "node_modules/identity-obj-proxy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
+ "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
+ "dependencies": {
+ "harmony-reflect": "^1.4.6"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immer": {
+ "version": "9.0.21",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+ "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/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==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
+ "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
+ "dependencies": {
+ "get-intrinsic": "^1.2.0",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
+ "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+ "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-root": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
+ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+ "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jake": {
+ "version": "10.8.7",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+ "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
+ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.5.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
+ "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
+ "dependencies": {
+ "ansi-escapes": "^4.3.1",
+ "chalk": "^4.0.0",
+ "jest-regex-util": "^28.0.0",
+ "jest-watcher": "^28.0.0",
+ "slash": "^4.0.0",
+ "string-length": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "jest": "^27.0.0 || ^28.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz",
+ "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^28.1.3",
+ "jest-util": "^28.1.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz",
+ "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==",
+ "dependencies": {
+ "@jest/console": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz",
+ "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/@types/yargs": {
+ "version": "17.0.24",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+ "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/emittery": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
+ "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz",
+ "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==",
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^28.1.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^28.1.3",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
+ "version": "28.0.2",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
+ "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-util": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz",
+ "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==",
+ "dependencies": {
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz",
+ "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==",
+ "dependencies": {
+ "@jest/test-result": "^28.1.3",
+ "@jest/types": "^28.1.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.10.2",
+ "jest-util": "^28.1.3",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
+ "version": "28.1.3",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz",
+ "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==",
+ "dependencies": {
+ "@jest/schemas": "^28.1.3",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/jest-watch-typeahead/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
+ "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
+ "dependencies": {
+ "char-regex": "^2.0.0",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
+ "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/jquery": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz",
+ "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==",
+ "peer": true
+ },
+ "node_modules/js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "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/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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=="
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
+ },
+ "node_modules/json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "dependencies": {
+ "string-convert": "^0.2.0"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonpointer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz",
+ "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jstransform": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz",
+ "integrity": "sha512-LGm87w0A8E92RrcXt94PnNHkFqHmgDy3mKHvNZOG7QepKCTCH/VB6S+IEN+bT4uLN3gVpOT0vvOOVd96osG71g==",
+ "dependencies": {
+ "base62": "^1.1.0",
+ "commoner": "^0.10.1",
+ "esprima-fb": "^15001.1.0-dev-harmony-fb",
+ "object-assign": "^2.0.0",
+ "source-map": "^0.4.2"
+ },
+ "bin": {
+ "jstransform": "bin/jstransform"
+ },
+ "engines": {
+ "node": ">=0.8.8"
+ }
+ },
+ "node_modules/jstransform/node_modules/object-assign": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz",
+ "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jstransform/node_modules/source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
+ "dependencies": {
+ "amdefine": ">=0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+ "dependencies": {
+ "array-includes": "^3.1.5",
+ "object.assign": "^4.1.3"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "dependencies": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz",
+ "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.7.3"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
+ },
+ "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/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/lz-string": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
+ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
+ "bin": {
+ "lz-string": "bin/bin.js"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/match-sorter": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz",
+ "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "remove-accents": "0.4.2"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz",
+ "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==",
+ "dependencies": {
+ "fs-monkey": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/microseconds": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+ "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.7.6",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
+ "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
+ "dependencies": {
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
+ "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "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/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nano-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+ "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+ "dependencies": {
+ "big-integer": "^1.6.16"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g=="
+ },
+ "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/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ=="
+ },
+ "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==",
+ "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": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz",
+ "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ=="
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz",
+ "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==",
+ "dependencies": {
+ "array.prototype.reduce": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.21.2",
+ "safe-array-concat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dependencies": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/oblivious-set": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+ "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/paginator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/paginator/-/paginator-1.0.0.tgz",
+ "integrity": "sha512-j2Y5AtF/NrXOEU9VVOQBGHnj81NveRQ/cDzySywqsWrAj+cxivMpMCkYJOds3ulQiDU4rQBWc0WoyyXMXOmuMA=="
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "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==",
+ "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==",
+ "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/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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=="
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "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==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-up/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-up/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-up/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.24",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
+ "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-attribute-case-insensitive": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz",
+ "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-browser-comments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz",
+ "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "peerDependencies": {
+ "browserslist": ">=4",
+ "postcss": ">=8"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
+ "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-clamp": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz",
+ "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=7.6.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.6"
+ }
+ },
+ "node_modules/postcss-color-functional-notation": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz",
+ "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-color-hex-alpha": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
+ "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-color-rebeccapurple": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz",
+ "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz",
+ "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz",
+ "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-custom-media": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
+ "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-custom-properties": {
+ "version": "12.1.11",
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz",
+ "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-custom-selectors": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
+ "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3"
+ }
+ },
+ "node_modules/postcss-dir-pseudo-class": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz",
+ "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
+ "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz",
+ "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz",
+ "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz",
+ "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-double-position-gradients": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz",
+ "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-env-function": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz",
+ "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-flexbugs-fixes": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz",
+ "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==",
+ "peerDependencies": {
+ "postcss": "^8.1.4"
+ }
+ },
+ "node_modules/postcss-focus-visible": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz",
+ "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-focus-within": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz",
+ "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.9"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-font-variant": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz",
+ "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==",
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-gap-properties": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz",
+ "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-image-set-function": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz",
+ "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-initial": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
+ "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==",
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-lab-function": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz",
+ "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==",
+ "dependencies": {
+ "@csstools/postcss-progressive-custom-properties": "^1.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-load-config/node_modules/yaml": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
+ "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-logical": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz",
+ "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==",
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-media-minmax": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz",
+ "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz",
+ "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^5.1.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz",
+ "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^3.1.0",
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz",
+ "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz",
+ "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==",
+ "dependencies": {
+ "colord": "^2.9.1",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz",
+ "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
+ "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+ "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz",
+ "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==",
+ "dependencies": {
+ "@csstools/selector-specificity": "^2.0.0",
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-normalize": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz",
+ "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==",
+ "dependencies": {
+ "@csstools/normalize.css": "*",
+ "postcss-browser-comments": "^4",
+ "sanitize.css": "*"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4",
+ "postcss": ">= 8"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
+ "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==",
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz",
+ "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz",
+ "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz",
+ "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz",
+ "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz",
+ "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz",
+ "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz",
+ "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==",
+ "dependencies": {
+ "normalize-url": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz",
+ "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-opacity-percentage": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz",
+ "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==",
+ "funding": [
+ {
+ "type": "kofi",
+ "url": "https://ko-fi.com/mrcgrtz"
+ },
+ {
+ "type": "liberapay",
+ "url": "https://liberapay.com/mrcgrtz"
+ }
+ ],
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz",
+ "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==",
+ "dependencies": {
+ "cssnano-utils": "^3.1.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-overflow-shorthand": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz",
+ "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-page-break": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz",
+ "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==",
+ "peerDependencies": {
+ "postcss": "^8"
+ }
+ },
+ "node_modules/postcss-place": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz",
+ "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-preset-env": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz",
+ "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==",
+ "dependencies": {
+ "@csstools/postcss-cascade-layers": "^1.1.1",
+ "@csstools/postcss-color-function": "^1.1.1",
+ "@csstools/postcss-font-format-keywords": "^1.0.1",
+ "@csstools/postcss-hwb-function": "^1.0.2",
+ "@csstools/postcss-ic-unit": "^1.0.1",
+ "@csstools/postcss-is-pseudo-class": "^2.0.7",
+ "@csstools/postcss-nested-calc": "^1.0.0",
+ "@csstools/postcss-normalize-display-values": "^1.0.1",
+ "@csstools/postcss-oklab-function": "^1.1.1",
+ "@csstools/postcss-progressive-custom-properties": "^1.3.0",
+ "@csstools/postcss-stepped-value-functions": "^1.0.1",
+ "@csstools/postcss-text-decoration-shorthand": "^1.0.0",
+ "@csstools/postcss-trigonometric-functions": "^1.0.2",
+ "@csstools/postcss-unset-value": "^1.0.2",
+ "autoprefixer": "^10.4.13",
+ "browserslist": "^4.21.4",
+ "css-blank-pseudo": "^3.0.3",
+ "css-has-pseudo": "^3.0.4",
+ "css-prefers-color-scheme": "^6.0.3",
+ "cssdb": "^7.1.0",
+ "postcss-attribute-case-insensitive": "^5.0.2",
+ "postcss-clamp": "^4.1.0",
+ "postcss-color-functional-notation": "^4.2.4",
+ "postcss-color-hex-alpha": "^8.0.4",
+ "postcss-color-rebeccapurple": "^7.1.1",
+ "postcss-custom-media": "^8.0.2",
+ "postcss-custom-properties": "^12.1.10",
+ "postcss-custom-selectors": "^6.0.3",
+ "postcss-dir-pseudo-class": "^6.0.5",
+ "postcss-double-position-gradients": "^3.1.2",
+ "postcss-env-function": "^4.0.6",
+ "postcss-focus-visible": "^6.0.4",
+ "postcss-focus-within": "^5.0.4",
+ "postcss-font-variant": "^5.0.0",
+ "postcss-gap-properties": "^3.0.5",
+ "postcss-image-set-function": "^4.0.7",
+ "postcss-initial": "^4.0.1",
+ "postcss-lab-function": "^4.2.1",
+ "postcss-logical": "^5.0.4",
+ "postcss-media-minmax": "^5.0.0",
+ "postcss-nesting": "^10.2.0",
+ "postcss-opacity-percentage": "^1.1.2",
+ "postcss-overflow-shorthand": "^3.0.4",
+ "postcss-page-break": "^3.0.4",
+ "postcss-place": "^7.0.5",
+ "postcss-pseudo-class-any-link": "^7.1.6",
+ "postcss-replace-overflow-wrap": "^4.0.0",
+ "postcss-selector-not": "^6.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-pseudo-class-any-link": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz",
+ "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz",
+ "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz",
+ "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-replace-overflow-wrap": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz",
+ "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==",
+ "peerDependencies": {
+ "postcss": "^8.0.3"
+ }
+ },
+ "node_modules/postcss-selector-not": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz",
+ "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.10"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz",
+ "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^2.7.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+ },
+ "node_modules/postcss-svgo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/svgo": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+ "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^4.1.3",
+ "css-tree": "^1.1.3",
+ "csso": "^4.2.0",
+ "picocolors": "^1.0.0",
+ "stable": "^0.1.8"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz",
+ "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==",
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.5"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "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=="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "node_modules/promise": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
+ "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "dependencies": {
+ "asap": "~2.0.6"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+ },
+ "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==",
+ "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/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-app-polyfill": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz",
+ "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==",
+ "dependencies": {
+ "core-js": "^3.19.2",
+ "object-assign": "^4.1.1",
+ "promise": "^8.1.0",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.9",
+ "whatwg-fetch": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-calendar": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/react-calendar/-/react-calendar-4.3.0.tgz",
+ "integrity": "sha512-TyCv8NbXnqXADyXNtMG0szkGvJNH3NG/WMTEE2q6g3RqAsFNyHwYbQD5Kvb6jRV/CqO0WB+oMCtkxblprdeT5A==",
+ "dependencies": {
+ "@types/react": "*",
+ "@wojtekmaj/date-utils": "^1.1.3",
+ "clsx": "^1.2.1",
+ "get-user-locale": "^2.2.1",
+ "prop-types": "^15.6.0"
+ },
+ "funding": {
+ "url": "https://github.com/wojtekmaj/react-calendar?sponsor=1"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-collapsible": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/react-collapsible/-/react-collapsible-2.10.0.tgz",
+ "integrity": "sha512-kEVsmlFfXBMTCnU5gwIv19MdmPAhbIPzz5Er37TiJSzRKS0IHrqAKQyQeHEmtoGIQMTcVI46FzE4z3NlVTx77A==",
+ "peerDependencies": {
+ "react": "~15 || ~16 || ~17 || ~18",
+ "react-dom": "~15 || ~16 || ~17 || ~18"
+ }
+ },
+ "node_modules/react-dev-utils": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
+ "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
+ "dependencies": {
+ "@babel/code-frame": "^7.16.0",
+ "address": "^1.1.2",
+ "browserslist": "^4.18.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "detect-port-alt": "^1.1.6",
+ "escape-string-regexp": "^4.0.0",
+ "filesize": "^8.0.6",
+ "find-up": "^5.0.0",
+ "fork-ts-checker-webpack-plugin": "^6.5.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.0.4",
+ "gzip-size": "^6.0.0",
+ "immer": "^9.0.7",
+ "is-root": "^2.1.0",
+ "loader-utils": "^3.2.0",
+ "open": "^8.4.0",
+ "pkg-up": "^3.1.0",
+ "prompts": "^2.4.2",
+ "react-error-overlay": "^6.0.11",
+ "recursive-readdir": "^2.2.2",
+ "shell-quote": "^1.7.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/react-dev-utils/node_modules/loader-utils": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
+ "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-error-overlay": {
+ "version": "6.0.11",
+ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
+ "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
+ },
+ "node_modules/react-icons": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz",
+ "integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
+ "node_modules/react-js-pagination": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/react-js-pagination/-/react-js-pagination-3.0.3.tgz",
+ "integrity": "sha512-podyA6Rd0uxc8uQakXWXxnonoOPI6NnFOROXfc6qPKNYm44s+Bgpn0JkyflcfbHf/GFKahnL8JN8rxBHZiBskg==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "fstream": "1.0.12",
+ "paginator": "^1.0.0",
+ "prop-types": "15.x.x - 16.x.x",
+ "react": "15.x.x - 16.x.x",
+ "tar": "2.2.2"
+ }
+ },
+ "node_modules/react-js-pagination/node_modules/react": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
+ "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-pagination": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/react-pagination/-/react-pagination-1.0.0.tgz",
+ "integrity": "sha512-WpTjsiZnmZJXemI7vVz/wZKsNZIGU/d6TgtMGXmxW+Qayg3n/q7K7e2bU41uJtVX09SzM1JzjbXMY1R4eq69ew==",
+ "dependencies": {
+ "react": "^0.13.3"
+ }
+ },
+ "node_modules/react-pagination/node_modules/react": {
+ "version": "0.13.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-0.13.3.tgz",
+ "integrity": "sha512-f9bivPvgNqGmcxjSuKCkY27YVKi1RlDm4TlPUNjLDH7lN6gnMQp9lJ9PpTVbo9kNEBr2BIZLz1kI/RFh9Cq2Kg==",
+ "dependencies": {
+ "envify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-query": {
+ "version": "3.39.3",
+ "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz",
+ "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "broadcast-channel": "^3.4.1",
+ "match-sorter": "^6.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.0.tgz",
+ "integrity": "sha512-CtHZzAOxi7GQvTph4dVLWwZHAWUjV2kMEQtk50OrN8z3gKxpWg3Tz7JfDw32N3Rpd7fh02z73cF6yZkK467gbQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.1",
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "@types/use-sync-external-store": "^0.0.3",
+ "hoist-non-react-statics": "^3.3.2",
+ "react-is": "^18.0.0",
+ "use-sync-external-store": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@reduxjs/toolkit": "^1 || ^2.0.0-beta.0",
+ "@types/react": "^16.8 || ^17.0 || ^18.0",
+ "@types/react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react": "^16.8 || ^17.0 || ^18.0",
+ "react-dom": "^16.8 || ^17.0 || ^18.0",
+ "react-native": ">=0.59",
+ "redux": "^4 || ^5.0.0-beta.0"
+ },
+ "peerDependenciesMeta": {
+ "@reduxjs/toolkit": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
+ "node_modules/react-refresh": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
+ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz",
+ "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==",
+ "dependencies": {
+ "@remix-run/router": "1.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.11.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz",
+ "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==",
+ "dependencies": {
+ "@remix-run/router": "1.6.2",
+ "react-router": "6.11.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-scripts": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
+ "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
+ "dependencies": {
+ "@babel/core": "^7.16.0",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
+ "@svgr/webpack": "^5.5.0",
+ "babel-jest": "^27.4.2",
+ "babel-loader": "^8.2.3",
+ "babel-plugin-named-asset-import": "^0.3.8",
+ "babel-preset-react-app": "^10.0.1",
+ "bfj": "^7.0.2",
+ "browserslist": "^4.18.1",
+ "camelcase": "^6.2.1",
+ "case-sensitive-paths-webpack-plugin": "^2.4.0",
+ "css-loader": "^6.5.1",
+ "css-minimizer-webpack-plugin": "^3.2.0",
+ "dotenv": "^10.0.0",
+ "dotenv-expand": "^5.1.0",
+ "eslint": "^8.3.0",
+ "eslint-config-react-app": "^7.0.1",
+ "eslint-webpack-plugin": "^3.1.1",
+ "file-loader": "^6.2.0",
+ "fs-extra": "^10.0.0",
+ "html-webpack-plugin": "^5.5.0",
+ "identity-obj-proxy": "^3.0.0",
+ "jest": "^27.4.3",
+ "jest-resolve": "^27.4.2",
+ "jest-watch-typeahead": "^1.0.0",
+ "mini-css-extract-plugin": "^2.4.5",
+ "postcss": "^8.4.4",
+ "postcss-flexbugs-fixes": "^5.0.2",
+ "postcss-loader": "^6.2.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^7.0.1",
+ "prompts": "^2.4.2",
+ "react-app-polyfill": "^3.0.0",
+ "react-dev-utils": "^12.0.1",
+ "react-refresh": "^0.11.0",
+ "resolve": "^1.20.0",
+ "resolve-url-loader": "^4.0.0",
+ "sass-loader": "^12.3.0",
+ "semver": "^7.3.5",
+ "source-map-loader": "^3.0.0",
+ "style-loader": "^3.3.1",
+ "tailwindcss": "^3.0.2",
+ "terser-webpack-plugin": "^5.2.5",
+ "webpack": "^5.64.4",
+ "webpack-dev-server": "^4.6.0",
+ "webpack-manifest-plugin": "^4.0.2",
+ "workbox-webpack-plugin": "^6.4.1"
+ },
+ "bin": {
+ "react-scripts": "bin/react-scripts.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ },
+ "peerDependencies": {
+ "react": ">= 16",
+ "typescript": "^3.2.1 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-slick": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz",
+ "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==",
+ "dependencies": {
+ "classnames": "^2.2.5",
+ "enquire.js": "^2.1.6",
+ "json2mq": "^0.2.0",
+ "lodash.debounce": "^4.0.8",
+ "resize-observer-polyfill": "^1.5.0"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-spinners": {
+ "version": "0.13.8",
+ "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz",
+ "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==",
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/recast": {
+ "version": "0.11.23",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
+ "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==",
+ "dependencies": {
+ "ast-types": "0.9.6",
+ "esprima": "~3.1.0",
+ "private": "~0.1.5",
+ "source-map": "~0.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/recast/node_modules/esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/recast/node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/recursive-readdir": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
+ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
+ "dependencies": {
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/redux-saga": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz",
+ "integrity": "sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ==",
+ "dependencies": {
+ "@redux-saga/core": "^1.2.3"
+ }
+ },
+ "node_modules/redux-thunk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
+ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "peerDependencies": {
+ "redux": "^4"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz",
+ "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz",
+ "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regex-parser": {
+ "version": "2.2.11",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
+ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+ "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
+ "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "dependencies": {
+ "@babel/regjsgen": "^0.8.0",
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.1.0",
+ "regjsparser": "^0.9.1",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+ "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remove-accents": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz",
+ "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA=="
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+ },
+ "node_modules/reselect": {
+ "version": "4.1.8",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
+ "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==",
+ "devOptional": true
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "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-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-url-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz",
+ "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==",
+ "dependencies": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^7.0.35",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">=8.9"
+ },
+ "peerDependencies": {
+ "rework": "1.0.1",
+ "rework-visit": "1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rework": {
+ "optional": true
+ },
+ "rework-visit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/picocolors": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+ "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA=="
+ },
+ "node_modules/resolve-url-loader/node_modules/postcss": {
+ "version": "7.0.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+ "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "dependencies": {
+ "picocolors": "^0.2.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "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==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup-plugin-terser": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+ "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser",
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "jest-worker": "^26.2.1",
+ "serialize-javascript": "^4.0.0",
+ "terser": "^5.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^2.0.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dependencies": {
+ "randombytes": "^2.1.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==",
+ "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/safe-array-concat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+ "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "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/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sanitize.css": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz",
+ "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA=="
+ },
+ "node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz",
+ "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="
+ },
+ "node_modules/selfsigned": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz",
+ "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==",
+ "dependencies": {
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+ "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "node_modules/shallowequal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+ "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slick-carousel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+ "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
+ "peerDependencies": {
+ "jquery": ">=1.8.0"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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/source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "dependencies": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "dependencies": {
+ "internal-slot": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw=="
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
+ "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
+ "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz",
+ "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==",
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/styled-components": {
+ "version": "5.3.11",
+ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz",
+ "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.0.0",
+ "@babel/traverse": "^7.4.5",
+ "@emotion/is-prop-valid": "^1.1.0",
+ "@emotion/stylis": "^0.8.4",
+ "@emotion/unitless": "^0.7.4",
+ "babel-plugin-styled-components": ">= 1.12.0",
+ "css-to-react-native": "^3.0.0",
+ "hoist-non-react-statics": "^3.0.0",
+ "shallowequal": "^1.1.0",
+ "supports-color": "^5.5.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/styled-components"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0",
+ "react-dom": ">= 16.8.0",
+ "react-is": ">= 16.8.0"
+ }
+ },
+ "node_modules/styled-components/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/styled-components/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==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz",
+ "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==",
+ "dependencies": {
+ "browserslist": "^4.21.4",
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+ },
+ "node_modules/sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ },
+ "node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/svgo/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==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/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==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/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==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/svgo/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ },
+ "node_modules/svgo/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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/svgo/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo/node_modules/nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dependencies": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "node_modules/svgo/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==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
+ },
+ "node_modules/tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+ "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
+ "dependencies": {
+ "block-stream": "*",
+ "fstream": "^1.0.12",
+ "inherits": "2"
+ }
+ },
+ "node_modules/temp-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
+ "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tempy": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
+ "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==",
+ "dependencies": {
+ "is-stream": "^2.0.0",
+ "temp-dir": "^2.0.0",
+ "type-fest": "^0.16.0",
+ "unique-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tempy/node_modules/type-fest": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+ "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.17.6",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz",
+ "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.2",
+ "acorn": "^8.5.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.9",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+ "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.16.8"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ=="
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+ "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA=="
+ },
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz",
+ "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typesafe-actions": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/typesafe-actions/-/typesafe-actions-5.1.0.tgz",
+ "integrity": "sha512-bna6Yi1pRznoo6Bz1cE6btB/Yy8Xywytyfrzu/wc+NFW3ZF0I+2iCGImhBsoYYCOWuICtRO4yHcnDlzgo1AdNg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/typescript-compare": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz",
+ "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==",
+ "dependencies": {
+ "typescript-logic": "^0.0.0"
+ }
+ },
+ "node_modules/typescript-logic": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz",
+ "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q=="
+ },
+ "node_modules/typescript-tuple": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz",
+ "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==",
+ "dependencies": {
+ "typescript-compare": "^0.0.2"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unload": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+ "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+ "dependencies": {
+ "@babel/runtime": "^7.6.2",
+ "detect-node": "^2.0.4"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg=="
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+ "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "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/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/web-vitals": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz",
+ "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg=="
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.84.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.84.1.tgz",
+ "integrity": "sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^1.0.0",
+ "@webassemblyjs/ast": "^1.11.5",
+ "@webassemblyjs/wasm-edit": "^1.11.5",
+ "@webassemblyjs/wasm-parser": "^1.11.5",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.9.0",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.14.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.2",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.7",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
+ "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
+ "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz",
+ "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==",
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.1",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.1",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/webpack-dev-server/node_modules/schema-utils": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz",
+ "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+ "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/webpack-manifest-plugin": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz",
+ "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==",
+ "dependencies": {
+ "tapable": "^2.0.0",
+ "webpack-sources": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.44.2 || ^5.47.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+ "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/whatwg-fetch": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz",
+ "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA=="
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-background-sync": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.1.tgz",
+ "integrity": "sha512-trJd3ovpWCvzu4sW0E8rV3FUyIcC0W8G+AZ+VcqzzA890AsWZlUGOTSxIMmIHVusUw/FDq1HFWfy/kC/WTRqSg==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-broadcast-update": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.1.tgz",
+ "integrity": "sha512-fBhffRdaANdeQ1V8s692R9l/gzvjjRtydBOvR6WCSB0BNE2BacA29Z4r9/RHd9KaXCPl6JTdI9q0bR25YKP8TQ==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-build": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.1.tgz",
+ "integrity": "sha512-INPgDx6aRycAugUixbKgiEQBWD0MPZqU5r0jyr24CehvNuLPSXp/wGOpdRJmts656lNiXwqV7dC2nzyrzWEDnw==",
+ "dependencies": {
+ "@apideck/better-ajv-errors": "^0.3.1",
+ "@babel/core": "^7.11.1",
+ "@babel/preset-env": "^7.11.0",
+ "@babel/runtime": "^7.11.2",
+ "@rollup/plugin-babel": "^5.2.0",
+ "@rollup/plugin-node-resolve": "^11.2.1",
+ "@rollup/plugin-replace": "^2.4.1",
+ "@surma/rollup-plugin-off-main-thread": "^2.2.3",
+ "ajv": "^8.6.0",
+ "common-tags": "^1.8.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "fs-extra": "^9.0.1",
+ "glob": "^7.1.6",
+ "lodash": "^4.17.20",
+ "pretty-bytes": "^5.3.0",
+ "rollup": "^2.43.1",
+ "rollup-plugin-terser": "^7.0.0",
+ "source-map": "^0.8.0-beta.0",
+ "stringify-object": "^3.3.0",
+ "strip-comments": "^2.0.1",
+ "tempy": "^0.6.0",
+ "upath": "^1.2.0",
+ "workbox-background-sync": "6.6.1",
+ "workbox-broadcast-update": "6.6.1",
+ "workbox-cacheable-response": "6.6.1",
+ "workbox-core": "6.6.1",
+ "workbox-expiration": "6.6.1",
+ "workbox-google-analytics": "6.6.1",
+ "workbox-navigation-preload": "6.6.1",
+ "workbox-precaching": "6.6.1",
+ "workbox-range-requests": "6.6.1",
+ "workbox-recipes": "6.6.1",
+ "workbox-routing": "6.6.1",
+ "workbox-strategies": "6.6.1",
+ "workbox-streams": "6.6.1",
+ "workbox-sw": "6.6.1",
+ "workbox-window": "6.6.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz",
+ "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==",
+ "dependencies": {
+ "json-schema": "^0.4.0",
+ "jsonpointer": "^5.0.0",
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "ajv": ">=8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/ajv": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+ "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/workbox-build/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/workbox-build/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/workbox-build/node_modules/source-map": {
+ "version": "0.8.0-beta.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
+ "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workbox-build/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
+ },
+ "node_modules/workbox-build/node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.1.tgz",
+ "integrity": "sha512-85LY4veT2CnTCDxaVG7ft3NKaFbH6i4urZXgLiU4AiwvKqS2ChL6/eILiGRYXfZ6gAwDnh5RkuDbr/GMS4KSag==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.1.tgz",
+ "integrity": "sha512-ZrGBXjjaJLqzVothoE12qTbVnOAjFrHDXpZe7coCb6q65qI/59rDLwuFMO4PcZ7jcbxY+0+NhUVztzR/CbjEFw=="
+ },
+ "node_modules/workbox-expiration": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.1.tgz",
+ "integrity": "sha512-qFiNeeINndiOxaCrd2DeL1Xh1RFug3JonzjxUHc5WkvkD2u5abY3gZL1xSUNt3vZKsFFGGORItSjVTVnWAZO4A==",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.1.tgz",
+ "integrity": "sha512-1TjSvbFSLmkpqLcBsF7FuGqqeDsf+uAXO/pjiINQKg3b1GN0nBngnxLcXDYo1n/XxK4N7RaRrpRlkwjY/3ocuA==",
+ "dependencies": {
+ "workbox-background-sync": "6.6.1",
+ "workbox-core": "6.6.1",
+ "workbox-routing": "6.6.1",
+ "workbox-strategies": "6.6.1"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.1.tgz",
+ "integrity": "sha512-DQCZowCecO+wRoIxJI2V6bXWK6/53ff+hEXLGlQL4Rp9ZaPDLrgV/32nxwWIP7QpWDkVEtllTAK5h6cnhxNxDA==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.1.tgz",
+ "integrity": "sha512-K4znSJ7IKxCnCYEdhNkMr7X1kNh8cz+mFgx9v5jFdz1MfI84pq8C2zG+oAoeE5kFrUf7YkT5x4uLWBNg0DVZ5A==",
+ "dependencies": {
+ "workbox-core": "6.6.1",
+ "workbox-routing": "6.6.1",
+ "workbox-strategies": "6.6.1"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.1.tgz",
+ "integrity": "sha512-4BDzk28govqzg2ZpX0IFkthdRmCKgAKreontYRC5YsAPB2jDtPNxqx3WtTXgHw1NZalXpcH/E4LqUa9+2xbv1g==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-recipes": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.1.tgz",
+ "integrity": "sha512-/oy8vCSzromXokDA+X+VgpeZJvtuf8SkQ8KL0xmRivMgJZrjwM3c2tpKTJn6PZA6TsbxGs3Sc7KwMoZVamcV2g==",
+ "dependencies": {
+ "workbox-cacheable-response": "6.6.1",
+ "workbox-core": "6.6.1",
+ "workbox-expiration": "6.6.1",
+ "workbox-precaching": "6.6.1",
+ "workbox-routing": "6.6.1",
+ "workbox-strategies": "6.6.1"
+ }
+ },
+ "node_modules/workbox-routing": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.1.tgz",
+ "integrity": "sha512-j4ohlQvfpVdoR8vDYxTY9rA9VvxTHogkIDwGdJ+rb2VRZQ5vt1CWwUUZBeD/WGFAni12jD1HlMXvJ8JS7aBWTg==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.1.tgz",
+ "integrity": "sha512-WQLXkRnsk4L81fVPkkgon1rZNxnpdO5LsO+ws7tYBC6QQQFJVI6v98klrJEjFtZwzw/mB/HT5yVp7CcX0O+mrw==",
+ "dependencies": {
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.1.tgz",
+ "integrity": "sha512-maKG65FUq9e4BLotSKWSTzeF0sgctQdYyTMq529piEN24Dlu9b6WhrAfRpHdCncRS89Zi2QVpW5V33NX8PgH3Q==",
+ "dependencies": {
+ "workbox-core": "6.6.1",
+ "workbox-routing": "6.6.1"
+ }
+ },
+ "node_modules/workbox-sw": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.1.tgz",
+ "integrity": "sha512-R7whwjvU2abHH/lR6kQTTXLHDFU2izht9kJOvBRYK65FbwutT4VvnUAJIgHvfWZ/fokrOPhfoWYoPCMpSgUKHQ=="
+ },
+ "node_modules/workbox-webpack-plugin": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.1.tgz",
+ "integrity": "sha512-zpZ+ExFj9NmiI66cFEApyjk7hGsfJ1YMOaLXGXBoZf0v7Iu6hL0ZBe+83mnDq3YYWAfA3fnyFejritjOHkFcrA==",
+ "dependencies": {
+ "fast-json-stable-stringify": "^2.1.0",
+ "pretty-bytes": "^5.4.1",
+ "upath": "^1.2.0",
+ "webpack-sources": "^1.4.3",
+ "workbox-build": "6.6.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.9.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/workbox-window": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.1.tgz",
+ "integrity": "sha512-wil4nwOY58nTdCvif/KEZjQ2NP8uk3gGeRNy2jPBbzypU4BT4D9L8xiwbmDBpZlSgJd2xsT9FvSNU0gsxV51JQ==",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2",
+ "workbox-core": "6.6.1"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..72117995
--- /dev/null
+++ b/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "woojoo-land",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "@testing-library/jest-dom": "^5.14.1",
+ "@testing-library/react": "^13.0.0",
+ "@testing-library/user-event": "^13.2.1",
+ "@types/jest": "^27.0.1",
+ "@types/node": "^16.7.13",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "@types/react-js-pagination": "^3.0.4",
+ "@types/react-slick": "^0.23.10",
+ "axios": "^1.4.0",
+ "react": "^18.2.0",
+ "react-calendar": "^4.3.0",
+ "react-collapsible": "^2.10.0",
+ "react-dom": "^18.2.0",
+ "react-icons": "^4.9.0",
+ "react-js-pagination": "^3.0.3",
+ "react-pagination": "^1.0.0",
+ "react-query": "^3.39.3",
+ "react-redux": "^8.0.7",
+ "react-router-dom": "^6.11.2",
+ "react-scripts": "5.0.1",
+ "react-slick": "^0.29.0",
+ "react-spinners": "^0.13.8",
+ "redux-saga": "^1.2.3",
+ "redux-thunk": "^2.4.2",
+ "slick-carousel": "^1.8.1",
+ "styled-components": "^5.3.11",
+ "typesafe-actions": "^5.1.0",
+ "typescript": "^4.4.2",
+ "web-vitals": "^2.1.0"
+ },
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ },
+ "eslintConfig": {
+ "extends": [
+ "react-app",
+ "react-app/jest"
+ ]
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "devDependencies": {
+ "@babel/core": "^7.22.1",
+ "@reduxjs/toolkit": "^1.9.5",
+ "@types/styled-components": "^5.1.26",
+ "babel-plugin-styled-components": "^2.1.3",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "prettier": "^2.8.8"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 00000000..a1d5a2ec
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/images/AdminUser.png b/public/images/AdminUser.png
new file mode 100644
index 00000000..0c14c41a
Binary files /dev/null and b/public/images/AdminUser.png differ
diff --git a/public/images/Banner.png b/public/images/Banner.png
new file mode 100644
index 00000000..24fb60d7
Binary files /dev/null and b/public/images/Banner.png differ
diff --git a/public/images/BannerImage1.png b/public/images/BannerImage1.png
new file mode 100644
index 00000000..7d466627
Binary files /dev/null and b/public/images/BannerImage1.png differ
diff --git a/public/images/BannerImage2.png b/public/images/BannerImage2.png
new file mode 100644
index 00000000..418fd150
Binary files /dev/null and b/public/images/BannerImage2.png differ
diff --git a/public/images/BannerImage3.png b/public/images/BannerImage3.png
new file mode 100644
index 00000000..b735c3b1
Binary files /dev/null and b/public/images/BannerImage3.png differ
diff --git a/public/images/Detailed.png b/public/images/Detailed.png
new file mode 100644
index 00000000..519cae1e
Binary files /dev/null and b/public/images/Detailed.png differ
diff --git a/public/images/Loading.png b/public/images/Loading.png
new file mode 100644
index 00000000..a1d5a2ec
Binary files /dev/null and b/public/images/Loading.png differ
diff --git a/public/images/LodingAni.gif b/public/images/LodingAni.gif
new file mode 100644
index 00000000..91db9266
Binary files /dev/null and b/public/images/LodingAni.gif differ
diff --git a/public/images/LodingAni.png b/public/images/LodingAni.png
new file mode 100644
index 00000000..d46baa2d
Binary files /dev/null and b/public/images/LodingAni.png differ
diff --git a/public/images/Logo.png b/public/images/Logo.png
new file mode 100644
index 00000000..5acf050d
Binary files /dev/null and b/public/images/Logo.png differ
diff --git a/public/images/Logo.svg b/public/images/Logo.svg
new file mode 100644
index 00000000..0c664ce5
--- /dev/null
+++ b/public/images/Logo.svg
@@ -0,0 +1,44 @@
+
+
+
+
diff --git a/public/images/LogoAdmin.png b/public/images/LogoAdmin.png
new file mode 100644
index 00000000..bf159323
Binary files /dev/null and b/public/images/LogoAdmin.png differ
diff --git a/public/images/LogoAdmin.svg b/public/images/LogoAdmin.svg
new file mode 100644
index 00000000..5aff8069
--- /dev/null
+++ b/public/images/LogoAdmin.svg
@@ -0,0 +1,70 @@
+
+
+
+
diff --git a/public/images/LogoBlack.svg b/public/images/LogoBlack.svg
new file mode 100644
index 00000000..0ab63cb0
--- /dev/null
+++ b/public/images/LogoBlack.svg
@@ -0,0 +1,9 @@
+
diff --git a/public/images/PackageBanner1.png b/public/images/PackageBanner1.png
new file mode 100644
index 00000000..4b553cef
Binary files /dev/null and b/public/images/PackageBanner1.png differ
diff --git a/public/images/PackageBanner2.png b/public/images/PackageBanner2.png
new file mode 100644
index 00000000..195d851b
Binary files /dev/null and b/public/images/PackageBanner2.png differ
diff --git a/public/images/TagMenuImage.svg b/public/images/TagMenuImage.svg
new file mode 100644
index 00000000..845cc46d
--- /dev/null
+++ b/public/images/TagMenuImage.svg
@@ -0,0 +1,43 @@
+
diff --git a/public/images/Thumbnail.png b/public/images/Thumbnail.png
new file mode 100644
index 00000000..43ba8d82
Binary files /dev/null and b/public/images/Thumbnail.png differ
diff --git a/public/images/User.png b/public/images/User.png
new file mode 100644
index 00000000..5ea939c4
Binary files /dev/null and b/public/images/User.png differ
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 00000000..6a26b277
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+ ์ฐ์ฃผ ๋ถ๋์ฐ
+
+
+
+
+
+
+
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 00000000..c34d8115
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,150 @@
+import { useEffect, useState } from "react";
+import { BrowserRouter, Routes, Route } from "react-router-dom";
+import styled from "styled-components";
+
+// common
+import Header from "./components/common/Header";
+import Footer from "./components/common/Footer";
+
+// admin
+import AdminPage from "./pages/admin/AdminPage";
+import ProductsPage from "./pages/admin/ProductsPage";
+import HistoryPage from "./pages/admin/HistroyPage";
+import UserListPage from "./pages/admin/UserListPage";
+
+// auth
+import LoginPage from "./pages/auth/LoginPage";
+import RegisterPage from "./pages/auth/RegisterPage";
+
+// user
+import UserPage from "./pages/user";
+import LikePage from "./pages/user/LikePage";
+import AccountPage from "./pages/user/AccountPage";
+import SettingPage from "./pages/user/SettingPage";
+
+// main
+import MainPage from "./pages/main/MainPage";
+import ProductPage from "./pages/main/ProductPage";
+import CartPage from "./pages/main/CartPage";
+import PaymentPage from "./pages/main/PaymentPage";
+import AllPage from "./pages/main/tagged/AllPage";
+import SolarPage from "./pages/main/tagged/SolarPage";
+import OnSalePage from "./pages/main/tagged/OnSalePage";
+import FoodPage from "./pages/main/tagged/FoodPage";
+import ShipPage from "./pages/main/tagged/ShipPage";
+import SuitPage from "./pages/main/tagged/SuitPage";
+import HorizonPage from "./pages/main/tagged/HorizonPage";
+import DashboardPage from "./pages/admin/DashboardPage";
+
+function App() {
+ const [username, setUsername] = useState("");
+ const [inputText, setInputText] = useState("");
+ const [clickedTag, setClickedTag] = useState("");
+
+ useEffect(() => {
+ localStorage.getItem("username");
+ }, []);
+
+ // Tag ์ ํ ์ฌ๋ถ ๊ด๋ฆฌ
+ const clickTagHandler = (tag: string) => {
+ setClickedTag((value) => (value === tag ? "" : tag));
+ };
+
+ // ๊ฒ์์ด state ๊ด๋ฆฌ
+ const searchHandler = (event: React.ChangeEvent) => {
+ setInputText(event.target.value);
+ };
+
+ return (
+
+
+
+ {/* */}
+
+
+ {/* ๋ฉ์ธ */
+ /* ์ ํ๋ ํ๊ทธ์, ๊ฒ์์ด์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋ผ์ฐํ
*/}
+
+ ) : clickedTag === "#ํ์๊ณ ๋ถ๋์ฐ" ? (
+
+ ) : clickedTag === "#ํน๊ฐ ์ํ" ? (
+
+ ) : clickedTag === "#์ฐ์ฃผ๋ณต" ? (
+
+ ) : clickedTag === "#์ฐ์ฃผ ์๋" ? (
+
+ ) : clickedTag === "#์ฐ์ฃผ์ " ? (
+
+ ) : clickedTag === "#์ฌ๊ฑด์ ์งํ์ " ? (
+
+ ) : (
+
+ )
+ }
+ />
+ } />
+ } />
+ } />
+
+ }
+ />
+
+ {/* ๊ด๋ฆฌ์ ํ์ด์ง */}
+ }>
+ } />
+ } />
+ } />
+ } />
+
+ {/* Auth ํ์ด์ง */}
+ }
+ />
+ }
+ />
+ {/* ์ ์ ํ์ด์ง */}
+ }>
+ } />
+ } />
+ } />
+
+
+
+
+
+
+ );
+}
+
+const Main = styled.main`
+ width: 100%;
+ display: flex;
+ min-height: 100vh;
+ flex-direction: column;
+`;
+
+const Inner = styled.div`
+ width: 75rem;
+ flex-grow: 1;
+ max-width: 75rem;
+ margin: 3.5rem auto 0rem;
+`;
+
+export default App;
diff --git a/src/components/admin/AdminHeader.tsx b/src/components/admin/AdminHeader.tsx
new file mode 100644
index 00000000..34c979fc
--- /dev/null
+++ b/src/components/admin/AdminHeader.tsx
@@ -0,0 +1,83 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { Link, useNavigate } from "react-router-dom";
+import { MdHome } from "react-icons/md";
+import Button from "../common/Button";
+import { logout } from "../../lib/API/userAPI";
+
+function AdminHeader() {
+ const navigate = useNavigate();
+
+ const onLogout = async () => {
+ await logout();
+ localStorage.removeItem("Token");
+ localStorage.removeItem("username");
+ localStorage.clear();
+ alert("๋ก๊ทธ์์ ๋์์ต๋๋ค.");
+ navigate("/");
+ };
+
+ return (
+
+
+
+
+
+
+
+ ๋ก๊ทธ์์
+
+
+ );
+}
+export default AdminHeader;
+
+const AdminNavigator = styled.div`
+ width: 100%;
+ height: 4.375rem;
+ background-color: ${theme.colors.gray[2]};
+`;
+
+const HomeButton = styled.button`
+ width: 40px;
+ height: 40px;
+ cursor: pointer;
+ transition: 0.1s;
+ margin-right: 14px;
+ border-radius: 100%;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ svg {
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ font-size: 26px;
+ line-height: 12px;
+ }
+ &:hover {
+ transform: scale(1.1);
+ width: 40px;
+ height: 40px;
+ border-radius: 100%;
+ border: 1px solid ${theme.colors.orange.main};
+ background-color: ${theme.colors.orange.main};
+ svg {
+ color: ${theme.colors.white};
+ }
+ }
+`;
+
+const LogoutBtn = styled(Button)`
+`
+
+const AdminHeaderContainer = styled.div`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ margin-top: 14px;
+ margin-right: 56px;
+ justify-content: right;
+`;
diff --git a/src/components/admin/AdminHistroyItem.tsx b/src/components/admin/AdminHistroyItem.tsx
new file mode 100644
index 00000000..f15b856b
--- /dev/null
+++ b/src/components/admin/AdminHistroyItem.tsx
@@ -0,0 +1,175 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import Button from "../common/Button";
+import { IOrdalDetailAll, salesManage } from "../../lib/API/adminAPI";
+import { adjustDate, formatDollar } from "../../lib/Function/commonFn";
+import { Dispatch, SetStateAction } from "react";
+
+interface HistoryProps {
+ list: any;
+ setIsChanged: Dispatch>;
+}
+
+function HistroyItem({ list, setIsChanged }: HistoryProps) {
+ // ๊ฑฐ๋ ์ทจ์ ๋ฐ ์ทจ์ ํด์ ๋ฒํผ ํธ๋ค๋ง
+ const handleCancel = (event: MouseEvent, list: IOrdalDetailAll) => {
+ event.preventDefault();
+ const cancelParam = {
+ isCanceled: false,
+ };
+ if (list.isCanceled) {
+ const confirm = window.confirm("๊ฑฐ๋ ์ทจ์๋ฅผ ํด์ ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ salesManage(list.detailId, cancelParam);
+ setIsChanged((prev) => !prev);
+ }
+ } else {
+ const confirm = window.confirm("๊ฑฐ๋๋ฅผ ์ทจ์ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ cancelParam.isCanceled = true;
+ salesManage(list.detailId, cancelParam);
+ setIsChanged((prev) => !prev);
+ }
+ }
+ };
+
+ // ๊ฑฐ๋ ์ทจ์ ๋ฐ ์ทจ์ ํด์ ๋ฒํผ ํธ๋ค๋ง
+ const handleConfirm = (event: MouseEvent, list: IOrdalDetailAll) => {
+ event.preventDefault();
+ const confirmParam = {
+ done: false,
+ };
+ if (list.done) {
+ const confirm = window.confirm("๊ฑฐ๋ ํ์ ์ ํด์ ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ salesManage(list.detailId, confirmParam);
+ setIsChanged((prev) => !prev);
+ }
+ } else {
+ const confirm = window.confirm("๊ฑฐ๋๋ฅผ ํ์ ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ confirmParam.done = true;
+ salesManage(list.detailId, confirmParam);
+ setIsChanged((prev) => !prev);
+ }
+ }
+ };
+
+ return (
+
+
+ {list.detailId}
+ {list.user.displayName}
+ {list.product.title}
+ {formatDollar(list.product.price)}
+ {adjustDate(list.timePaid)}
+
+
+ {!list.done && (
+ {
+ handleCancel(event, list);
+ }}
+ >
+ {list.isCanceled ? `์ทจ์ ํด์ ` : `๊ฑฐ๋ ์ทจ์`}
+
+ )}
+ {!list.isCanceled && (
+ {
+ handleConfirm(event, list);
+ }}
+ >
+ {list.done ? `ํ์ ํด์ ` : `๊ฑฐ๋ ํ์ `}
+
+ )}
+
+
+ );
+}
+
+const ItemContainer = styled.div`
+ height: 70px;
+ margin-bottom: 10px;
+ display: flex;
+ border-radius: 5px;
+ transition: 0.1s;
+ background-color: ${theme.colors.white};
+ border: 1px solid ${theme.colors.gray[7]};
+ &:hover {
+ transform: scale(0.99);
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+
+const ItemBox = styled.div`
+ display: flex;
+ width: 100%;
+`;
+
+const ID = styled.div`
+ justify-content: center;
+ align-items: center;
+ font-size: 14px;
+ display: flex;
+ width: 15%;
+`;
+
+const UserName = styled.div`
+ justify-content: center;
+ align-items: center;
+ font-size: 14px;
+ display: flex;
+ width: 13%;
+`;
+
+const Product = styled.div`
+ justify-content: center;
+ align-items: center;
+ font-weight: 700;
+ display: flex;
+ width: 34%;
+`;
+
+const TotalOrderAmount = styled.div`
+ justify-content: center;
+ align-items: center;
+ font-size: 14px;
+ display: flex;
+ width: 13%;
+`;
+
+const TransactionTime = styled.div`
+ justify-content: center;
+ align-items: center;
+ font-size: 14px;
+ display: flex;
+ width: 24%;
+`;
+
+const BtnBox = styled.div`
+ display: flex;
+ min-width: 280px;
+ margin: auto 26px auto 0;
+ justify-content: end;
+ gap: 10px;
+`;
+
+const CancelBtn = styled(Button)`
+ width: 123px;
+ margin: auto 0 auto 0;
+ background-color: white;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ :hover{
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const ConfirmBtn = styled(Button)`
+ width: 123px;
+`;
+
+export default HistroyItem;
diff --git a/src/components/admin/AdminHistroyItemList.tsx b/src/components/admin/AdminHistroyItemList.tsx
new file mode 100644
index 00000000..ad6e57f8
--- /dev/null
+++ b/src/components/admin/AdminHistroyItemList.tsx
@@ -0,0 +1,217 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { useEffect, useState } from "react";
+import { IOrdalDetailAll, salesHistory } from "../../lib/API/adminAPI";
+import HistroyItem from "../../components/admin/AdminHistroyItem";
+import Button from "../../components/common/Button";
+import AdminTitle from "../../components/admin/AdminTitle";
+import SubLoading from "../../components/common/SubLoading";
+import AdminUserPaging from "./AdminUserPaging";
+
+function AdminHistroyItemList() {
+ const [postPerPage] = useState(6); //ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์
+ const [count, setCount] = useState(0); //์์ดํ
์ด ๊ฐ์
+ const [currentPage, setCurrentPage] = useState(1); //ํ์ฌ ํ์ด์ง. ๊ธฐ๋ณธ๊ฐ '1'
+ const [products, setProducts] = useState([]); //๋ฆฌ์คํธ์ ๋ํ๋ผ ์์ดํ
+ const [indexOfLastPost, setIndexOfLastPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ๋ง์ง๋ง ์์ดํ
์ธ๋ฑ์ค
+ const [indexOfFirstPost, setIndexOfFirstPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ ์์ดํ
์ธ๋ฑ์ค
+ const [lists, setLists] = useState([]); //ํ์ฌ ํ์ด์ง์์ ๋ณด์ฌ์ง๋ ์์ดํ
+
+ const setPage = (error: any) => {
+ setCurrentPage(error);
+ };
+
+ interface IProduct {
+ id: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ photo: string | null;
+ isSoldOut: boolean;
+ discountRate: number;
+ timePaid: any;
+ list: IOrdalDetailAll;
+ detailId: any;
+ }
+
+ useEffect(() => {
+ setIndexOfLastPost(currentPage * postPerPage); //ํ์ฌ ํ์ด์ง์ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๊ณฑํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ setIndexOfLastPost์ ๋๊ธด๋ค. -> ๋ง์ง๋ง ํฌ์คํธ ์๋ 3
+ setIndexOfFirstPost(indexOfLastPost - postPerPage); //indexOfLastPost์ ๊ฐ๊ณผ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๋บ๋ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ setIndexOfFirstPost์ ์ ๋ฌ -> ์ฒซ๋ฒ์งธ ํฌ์คํธ๋ 0
+ setLists(
+ products
+ .sort(
+ (a, b) =>
+ new Date(b.timePaid).getTime() - new Date(a.timePaid).getTime(),
+ )
+ .slice(indexOfFirstPost, indexOfLastPost),
+ ); //products์ ๋ฐฐ์ด์ ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ์ ๋ง์ง๋ง์ ์ธ๋ฑ์ค๊น์ง ๊ฐ์ ๋ณต์ฌ, ๋ฐํํ์ฌ setCurrentPosts์ ์ ๋ฌ
+ }, [currentPage, indexOfLastPost, indexOfFirstPost, postPerPage, products]); //์์ ๊ธฐ๋ฅ์ด ๋๋๋ฉด ๋ฐฐ์ด ์์ ๊ฒฐ๊ณผ๋ค์ ํ ๋ฒ ์คํ
+
+ // const [lists, setLists] = useState([]);
+ const [isChanged, setIsChanged] = useState(false);
+ const [isFetching, setIsFetching] = useState(false);
+
+ const fetchList = async () => {
+ setIsFetching(true);
+ const res = await salesHistory();
+ setIsFetching(false);
+ // setLists(res);
+ setCount(res.length);
+ setProducts(res);
+ };
+
+ useEffect(() => {
+ fetchList();
+ }, [isChanged]);
+
+ return (
+
+ ์ ์ฒด ๊ฑฐ๋๋ด์ญ
+
+
+ ๊ฑฐ๋๋ด์ญ ID
+ ๊ฑฐ๋์ ์ด๋ฆ
+ ์ํ๋ช
+ ์ด ์ฃผ๋ฌธ ๊ธ์ก
+ ๊ฑฐ๋ ์๊ฐ
+
+
+ {
+ window.location.reload();
+ }}
+ >
+ ์๋ก๊ณ ์นจ
+
+
+
+ {isFetching ? (
+
+ ) : (
+
+ {lists ? (
+ lists.map((list) => {
+ return (
+
+ );
+ })
+ ) : (
+ ๊ฑฐ๋ ๋ด์ญ์ด ์์ต๋๋ค.
+ )}
+
+ )}
+
+
+
+
+ );
+}
+const PageNation = styled.div`
+ left: 0;
+ right: 0;
+ bottom: 0;
+ width: 100%;
+ height: 70px;
+ display: flex;
+ position: absolute;
+ align-items: center;
+ justify-content: center;
+ background-color: ${theme.colors.white};
+`;
+
+const HistoryContainer = styled.div`
+ margin: 0 30px;
+ height: 90%;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+`;
+
+// ์นดํ
๊ณ ๋ฆฌ ๋ฉ๋ด ์คํ์ผ ์์
+const CategoryMenuContainer = styled.div`
+ align-items: center;
+ padding-right: 1px;
+ font-weight: 700;
+ font-size: 18px;
+ display: flex;
+ height: 90px;
+ width: 100%;
+`;
+
+const ItemBox = styled.div`
+ display: flex;
+ width: 100%;
+`;
+
+const ID = styled.div`
+ border-right: 1px solid ${theme.colors.gray[5]};
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ width: 15%;
+ height: auto;
+`;
+
+const UserName = styled.div`
+ border-right: 1px solid ${theme.colors.gray[5]};
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ width: 13%;
+`;
+
+const Product = styled.div`
+ border-right: 1px solid ${theme.colors.gray[5]};
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ width: 31%;
+`;
+
+const TotalOrderAmount = styled.div`
+ border-right: 1px solid ${theme.colors.gray[5]};
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ width: 15%;
+`;
+
+const TransactionTime = styled.div`
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ width: 19%;
+`;
+
+const BtnBox = styled.div`
+ display: flex;
+ min-width: 258px;
+ margin: auto 0px auto 0;
+ justify-content: end;
+`;
+
+const CancelBtn = styled(Button)`
+ margin: auto 26px auto 0;
+ width: 123px;
+`;
+// ์นดํ
๊ณ ๋ฆฌ ๋ฉ๋ด ์คํ์ผ ๋
+
+const ItemContainer = styled.ul`
+ flex-direction: column;
+ display: flex;
+`;
+
+const ErrorMessage = styled.span`
+ color: ${theme.colors.orange.main};
+ font-weight: 700;
+ font-size: 18px;
+`;
+
+export default AdminHistroyItemList;
diff --git a/src/components/admin/AdminModalTemplate.tsx b/src/components/admin/AdminModalTemplate.tsx
new file mode 100644
index 00000000..599773c9
--- /dev/null
+++ b/src/components/admin/AdminModalTemplate.tsx
@@ -0,0 +1,22 @@
+import styled from "styled-components";
+import { PropsWithChildren } from "react";
+
+function AdminModalTemplate({children}: PropsWithChildren) {
+ return (
+
+ {children}
+
+ )
+}
+
+const ModalBackground = styled.div`
+ top: 0;
+ left: 0;
+ z-index: 10;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ backdrop-filter: brightness(60%);
+`
+
+export default AdminModalTemplate;
\ No newline at end of file
diff --git a/src/components/admin/AdminNav.tsx b/src/components/admin/AdminNav.tsx
new file mode 100644
index 00000000..9df03dbd
--- /dev/null
+++ b/src/components/admin/AdminNav.tsx
@@ -0,0 +1,71 @@
+import { Link } from "react-router-dom";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { MdKeyboardArrowRight } from "react-icons/md";
+
+function AdminNav() {
+ return (
+
+
+
+
+
+
+
+
+ ๋ชจ๋ ์ ํ ์กฐํ
+
+
+ ์ ์ฒด ๊ฑฐ๋ ๋ด์ญ
+
+
+ ์ฌ์ฉ์ ์กฐํ
+
+
+
+ );
+}
+
+const AdminNavigator = styled.nav`
+ flex-direction: column;
+ display: flex;
+ width: 100%;
+`;
+
+const AdminNavContainer = styled.ul`
+ border-bottom: 1px solid ${theme.colors.white};
+ color: ${theme.colors.white};
+`;
+
+const LogoAdminImg = styled.div`
+ justify-content: center;
+ padding-right: 8px;
+ height: 150px;
+ display: flex;
+`
+
+const Listname = styled.li`
+ height: 52px;
+ display: flex;
+ font-size: 20px;
+ transition: 0.1s;
+ padding-left: 18px;
+ align-items: center;
+ justify-content: space-between;
+ border-top: 1px solid ${theme.colors.white};
+ svg {
+ font-size: 30px;
+ margin-right: 6px;
+ }
+ :hover {
+ font-size: 21px;
+ padding-left: 16px;
+ background-color: #0000001c;
+ svg {
+ font-size: 32px;
+ margin-right: 5px;
+ }
+ }
+`;
+
+export default AdminNav;
diff --git a/src/components/admin/AdminProductItem.tsx b/src/components/admin/AdminProductItem.tsx
new file mode 100644
index 00000000..1359ddf6
--- /dev/null
+++ b/src/components/admin/AdminProductItem.tsx
@@ -0,0 +1,532 @@
+import Button from "../common/Button";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { FormEvent, useState } from "react";
+import { AiOutlineClose } from "react-icons/ai";
+import AdminModalTemplate from "./AdminModalTemplate";
+import { formatDollar } from "../../lib/Function/commonFn";
+import { IEditProduct, productDel, productEdit } from "../../lib/API/adminAPI";
+
+//์๋ต ํ์
+interface IProduct {
+ id: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ photo: string | null;
+ isSoldOut: boolean;
+ discountRate: number;
+ onclick: any;
+}
+
+function AdminProductItem(props: IProduct) {
+ //๋ชจ๋ฌ ์ํ ๊ธฐ๋ณธ๊ฐ false๋ค true๋ก ๋ฐ๋๋ฉด modalOpen์ ๊ฐ์ด๋๋ฉฐ ์ด ๊ฐ์ return๋ฌธ์ AdminModal ์ปดํฌ๋ํธ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
+ const [modalOpen, setModalOpen] = useState(false);
+ const [ThumbnailImg, setThumbnailImg] = useState("");
+ const [PhotoImg, setPhotoImg] = useState("");
+ const [ThumbnailFile, setThumbnailFile] = useState(null); //์ ํ ์ธ๋ค์ผ ํ์ผ๋ช
์ํ
+ const [PhotoFile, setPhotoFile] = useState(null); //์์ธ ์ด๋ฏธ์ง ์ธ๋ค์ผ ํ์ผ๋ช
์ํ
+ const [thisProduct, setThisProduct] = useState(null);
+
+ //๋ชจ๋ฌ ์์ฒญ setModalOpen()์ true ๊ฐ์ ๋ณด๋ธ๋ค.
+ const editModal = (
+ event: React.MouseEvent,
+ props: IProduct,
+ ) => {
+ event.preventDefault();
+ setModalOpen(true);
+ setThisProduct(props);
+ };
+
+ const [put, setPut] = useState();
+
+ // ์ ํ ์ญ์ ํจ์
+ const onDelete = async (
+ event: React.MouseEvent,
+ ID: string,
+ ) => {
+ if (window.confirm("์ญ์ ํ์๊ฒ ์ต๋๊น?")) {
+ event.preventDefault();
+ await productDel(ID);
+ console.log("์ ํ ์ญ์ ์๋ฃ");
+ setPut(props.onclick);
+ }
+ };
+
+ //์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง ๋๋๋ง
+ function ThumbnailUpload(event: React.ChangeEvent) {
+ const files = event.target.files as FileList;
+ for (const file of files) {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.addEventListener("load", (e) => {
+ setThumbnailImg((e.target as FileReader).result as string);
+ });
+ }
+ }
+
+ //์ ํ ์์ธ ์ด๋ฏธ์ง ๋๋๋ง
+ function PhotoUpload(event: React.ChangeEvent) {
+ const files = event.target.files as FileList;
+ for (const file of files) {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.addEventListener("load", (e) => {
+ setPhotoImg((e.target as FileReader).result as string);
+ });
+ }
+ }
+
+ //์ ํ ์์ input์ ์
๋ ฅ๋๋ ๊ฐ์ state์ ์ ์ฅํ๋ ํจ์
+ const onChange = (event: any) => {
+ const { name, value } = event.target;
+ // ๊ฐ๊ฒฉ ์
๋ ฅ๋์ ์ซ์๊ฐ ์๋ ๊ฐ์ ์
๋ ฅํ๋ฉด 0์ ๋ฐํ
+ let updatedValue: string | number = value;
+ if (name === "price") {
+ updatedValue = value === "" || isNaN(Number(value)) ? "" : Number(value);
+ }
+
+ // id๋ ๊ฐ๋ณ state์ ์ ์ฅ
+ setUpdateForm((prev) => ({
+ ...prev,
+ [name]: updatedValue,
+ }));
+ };
+
+ //์ ํ ์ถ๊ฐ input์ ์
๋ ฅ๋๋ tags๊ฐ์ state์ ์ ์ฅํํ๊ณ ์ฝํ ๊ธฐ์ค์ผ๋ก ์๋ผ setProductForm์ ๋ด๋ณด๋ด๋ ํจ์
+ const onChangeTags = (event: any) => {
+ const { name, value } = event.target;
+ let updatedTags: never[] = [];
+ if (name === "tags") {
+ updatedTags = value.split(",");
+ }
+ setUpdateForm((prev: any) => ({
+ ...prev,
+ tags: updatedTags,
+ }));
+ };
+
+ //์ํ ์์ ์ ์ ๋ณด ์ํ
+ const [updateform, setUpdateForm] = useState({});
+
+ //์ ํ ์ถ๊ฐ ํผ ์
๋ ฅ ํ ์ ์ถ์ API๋ก ๊ฐ์ ์ ๋ฌํด ์ ํ ๋ฑ๋ก
+ const onSubmit = async (event: FormEvent, id: string) => {
+ event.preventDefault();
+ //์์ดํ
์ id ๊ฐ์ ๋ฐ์ productEdit์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด ๋ณด๋ธ๋ค.
+ await productEdit(id, updateform, ThumbnailImg, PhotoImg);
+ //input ์ด๊ธฐํ
+ setUpdateForm({
+ tags: [],
+ price: 0,
+ title: "",
+ isSoldOut: false,
+ discountRate: 0,
+ description: "",
+ photoBase64: "",
+ thumbnailBase64: "",
+ });
+ //์ฐฝ ๋ซ๊ธฐ ์์ฒญ
+ setModalOpen(false);
+ setPut(props.onclick);
+ };
+
+ //๋ชจ๋ฌ ์ฐฝ ๋ซ๊ธฐ ๊ธฐ๋ฅ
+ const ModalBoxCloses = (event: any) => {
+ event.preventDefault();
+ setModalOpen(false); //setModalOpen ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
+ };
+
+ //์ ํ ์ธ๋ค์ผ ํ์ผ๋ช
ํ์ ๊ธฐ๋ฅ
+ const ThumbnailFileChange = (event: any) => {
+ const file = event.target.files[0];
+ setThumbnailFile(file ? file.name : null);
+ };
+
+ //์์ธ ์ด๋ฏธ์ง ์ธ๋ค์ผ ํ์ผ๋ช
ํ์ ๊ธฐ๋ฅ
+ const PhotoFileChange = (event: any) => {
+ const file = event.target.files[0];
+ setPhotoFile(file ? file.name : null);
+ };
+
+ return (
+ <>
+
+
+
+ {props.thumbnail &&
}
+ {!props.thumbnail && (
+
+ )}
+
+ {put}
+ {props.title}
+ {props.id}
+ {formatDollar(props.price)}
+ {props.tags.join(", ")}
+ {props.isSoldOut ? "X" : "O"}
+ {props.discountRate}
+
+
+ ) => {
+ editModal(event, props);
+ }}
+ adminedit
+ >
+ ์์
+
+ {
+ onDelete(event, props.id);
+ }}
+ >
+ ์ญ์
+
+
+
+ <>
+ {modalOpen && thisProduct && (
+
+
+
+
+
+
+ ์ ํ ์์
+
+
+
+
+ )}
+ >
+ >
+ );
+}
+
+const FormContainer = styled.ul`
+ width: 80%;
+ display: flex;
+ flex-direction: column;
+ li {
+ margin-bottom: 10px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ input {
+ width: 350px;
+ height: 40px;
+ padding-left: 10px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+ background-color: ${theme.colors.gray[2]};
+ }
+ }
+`;
+
+const TitleAdd = styled.li`
+ margin: auto;
+ font-size: 36px;
+ padding-bottom: 50px;
+ font-family: "GmarketSans";
+ font-weight: 700;
+`;
+
+const FileAddBtn = styled.label`
+ width: 90px;
+ height: 26px;
+ display: flex;
+ cursor: pointer;
+ font-size: 13px;
+ transition: 0.3s;
+ line-height: 24px;
+ border-radius: 20px;
+ justify-content: center;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const FileAddname = styled.div`
+ width: 48%;
+ display: flex;
+ font-size: 14px;
+ font-weight: 400;
+ color: ${theme.colors.gray[3]};
+`;
+
+const FileTltle = styled.div`
+ width: 150px;
+ display: flex;
+`;
+
+const Thumbnail = styled.div`
+ height: 30px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 10px;
+ justify-content: space-between;
+`;
+
+const Photo = styled.div`
+ height: 30px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+ justify-content: space-between;
+`;
+
+const TitleInput = styled.li``;
+const PriceInput = styled.li``;
+const DescriptionInput = styled.div`
+ display: flex;
+ margin-bottom: 10px;
+ justify-content: space-between;
+ textarea {
+ width: 350px;
+ resize: none;
+ height: 200px;
+ padding: 10px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+
+const TagsInput = styled.li``;
+const DiscountRateInput = styled.li``;
+
+const ItemAddBtn = styled(Button)`
+ margin-top: 20px;
+`;
+
+const ModalClose = styled.button`
+ top: 1.5rem;
+ right: 2rem;
+ width: 2rem;
+ height: 2rem;
+ border: none;
+ position: absolute;
+ background-color: transparent;
+ color: ${(props) => props.theme.colors.gray[5]};
+ &:hover {
+ cursor: pointer;
+ }
+`;
+
+const ModalAdd = styled.div`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ width: 640px;
+ height: 800px;
+ display: flex;
+ position: fixed;
+ align-items: center;
+ border-radius: 20px;
+ flex-direction: column;
+ justify-content: space-evenly;
+ background-color: ${(props) => props.theme.colors.white};
+`;
+
+const ItemBox = styled.div`
+ width: 100%;
+ display: flex;
+ font-size: 18px;
+`;
+
+const BtnBox = styled.div`
+ width: 134px;
+ display: flex;
+ margin: auto 26px auto 0;
+`;
+
+const EditBtn = styled(Button)``;
+
+const DeleteBtn = styled(Button)`
+ margin-left: 6px;
+`;
+
+const ItemContainer = styled.div`
+ height: 70px;
+ display: flex;
+ border-radius: 5px;
+ transition: 0.1s;
+ background-color: ${theme.colors.white};
+ border: 1px solid ${theme.colors.gray[7]};
+ &:hover {
+ transform: scale(0.99);
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+
+const ProductImg = styled.div`
+ width: 15%;
+ display: flex;
+ padding: auto;
+ max-height: 100%;
+ align-items: center;
+ justify-content: center;
+ margin: 8px 0;
+ img {
+ height: 100%;
+ display: flex;
+ border-radius: 5px;
+ }
+`;
+
+const ProductTitle = styled.div`
+ width: 20%;
+ margin: auto;
+ display: flex;
+ font-weight: 700;
+ justify-content: center;
+`;
+
+const ProductId = styled.div`
+ width: 20%;
+ margin: auto;
+ display: flex;
+ font-size: 14px;
+ justify-content: center;
+`;
+
+const ProductPrice = styled.div`
+ width: 10%;
+ margin: auto;
+ display: flex;
+ font-size: 14px;
+ justify-content: center;
+`;
+
+const ProductTags = styled.div`
+ width: 15%;
+ margin: auto;
+ display: flex;
+ font-size: 14px;
+ justify-content: center;
+`;
+
+const ProductIsSoldOut = styled.div`
+ width: 10%;
+ margin: auto;
+ display: flex;
+ font-size: 14px;
+ justify-content: center;
+`;
+
+const ProductDiscountRate = styled.div`
+ width: 10%;
+ margin: auto;
+ display: flex;
+ font-size: 14px;
+ justify-content: center;
+`;
+
+export default AdminProductItem;
diff --git a/src/components/admin/AdminProductItemAdd.tsx b/src/components/admin/AdminProductItemAdd.tsx
new file mode 100644
index 00000000..9abd88bb
--- /dev/null
+++ b/src/components/admin/AdminProductItemAdd.tsx
@@ -0,0 +1,359 @@
+import Button from "../common/Button";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { FormEvent, useState } from "react";
+import { AiOutlineClose } from "react-icons/ai";
+import GlobalStyle from "../../styles/GlobalStyle";
+import { productPost } from "../../lib/API/adminAPI";
+
+function AdminProductItemAdd({ setModalOpen }: any) {
+ const [ThumbnailImg, setThumbnailImg] = useState("");
+ const [PhotoImg, setPhotoImg] = useState("");
+ const [ThumbnailFile, setThumbnailFile] = useState(null); //์ ํ ์ธ๋ค์ผ ํ์ผ๋ช
์ํ
+ const [PhotoFile, setPhotoFile] = useState(null); //์์ธ ์ด๋ฏธ์ง ์ธ๋ค์ผ ํ์ผ๋ช
์ํ
+
+ //์ ํ ์ธ๋ค์ผ ์ด๋ฏธ์ง ๋๋๋ง
+ function ThumbnailUpload(event: React.ChangeEvent) {
+ const files = event.target.files as FileList;
+ for (const file of files) {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.addEventListener("load", (e) => {
+ setThumbnailImg((e.target as FileReader).result as string);
+ });
+ }
+ }
+
+ //์ ํ ์์ธ ์ด๋ฏธ์ง ๋๋๋ง
+ function PhotoUpload(event: React.ChangeEvent) {
+ const files = event.target.files as FileList;
+ for (const file of files) {
+ const reader = new FileReader();
+ reader.readAsDataURL(file);
+ reader.addEventListener("load", (e) => {
+ setPhotoImg((e.target as FileReader).result as string);
+ });
+ }
+ }
+
+ //์ ํ ์ถ๊ฐ input์ ์
๋ ฅ๋๋ ๊ฐ์ state์ ์ ์ฅํ๋ ํจ์
+ const onChange = (event: any) => {
+ const { name, value } = event.target;
+ let updatedValue: string | number = value;
+
+ if (name === "price") {
+ updatedValue = value === "" || isNaN(Number(value)) ? 0 : Number(value);
+ }
+
+ setProductForm((prev: any) => ({
+ ...prev,
+ [name]: updatedValue,
+ }));
+ };
+
+ //์ ํ ์ถ๊ฐ input์ ์
๋ ฅ๋๋ tags๊ฐ์ state์ ์ ์ฅํํ๊ณ ์ฝํ ๊ธฐ์ค์ผ๋ก ์๋ผ setProductForm์ ๋ด๋ณด๋ด๋ ํจ์
+ const onChangeTags = (event: any) => {
+ const { name, value } = event.target;
+ let updatedTags: never[] = [];
+
+ if (name === "tags") {
+ updatedTags = value.split(",");
+ console.log(updatedTags);
+ }
+
+ setProductForm((prev: any) => ({
+ ...prev,
+ tags: updatedTags,
+ }));
+ };
+
+ //์ํ ์ถ๊ฐ์ ์ ๋ณด ์ํ
+ const [productform, setProductForm] = useState({
+ tags: [],
+ price: 0,
+ title: "",
+ isSoldOut: 0,
+ discountRate: 0,
+ description: "",
+ photoBase64: "",
+ thumbnailBase64: "",
+ });
+
+ //์ ํ ์ถ๊ฐ ํผ ์
๋ ฅ ํ ์ ์ถ์ API๋ก ๊ฐ์ ์ ๋ฌํด ์ ํ ๋ฑ๋ก
+ const onSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ await productPost(productform, ThumbnailImg, PhotoImg);
+ //input ์ด๊ธฐํ
+ setProductForm({
+ tags: [],
+ price: 0,
+ title: "",
+ isSoldOut: 0,
+ discountRate: 0,
+ description: "",
+ photoBase64: "",
+ thumbnailBase64: "",
+ });
+ //์ฐฝ ๋ซ๊ธฐ ์์ฒญ
+ setModalOpen(false);
+ };
+
+ //๋ชจ๋ฌ ์ฐฝ ๋ซ๊ธฐ ํจ์
+ const ModalBoxClose = (event: any) => {
+ event.preventDefault();
+ setModalOpen(false); //setModalOpen ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ์ ๋ฌํฉ๋๋ค.
+ };
+
+ //์ ํ ์ธ๋ค์ผ ํ์ผ๋ช
ํ์ ํจ์
+ const ThumbnailFileChange = (event: any) => {
+ const file = event.target.files[0];
+ setThumbnailFile(file ? file.name : null);
+ };
+
+ //์์ธ ์ด๋ฏธ์ง ์ธ๋ค์ผ ํ์ผ๋ช
ํ์ ํจ์
+ const PhotoFileChange = (event: any) => {
+ const file = event.target.files[0];
+ setPhotoFile(file ? file.name : null);
+ };
+
+ return (
+
+
+
+
+
+
+ ์ ํ ์ถ๊ฐ
+
+
+
+ );
+}
+
+const FormContainer = styled.ul`
+ width: 80%;
+ display: flex;
+ flex-direction: column;
+ li {
+ margin-bottom: 10px;
+ height: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ input {
+ width: 350px;
+ height: 40px;
+ padding-left: 10px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+ background-color: ${theme.colors.gray[2]};
+ }
+ }
+`;
+
+const TitleAdd = styled.li`
+ margin: auto;
+ font-size: 36px;
+ font-weight: 700;
+ padding-bottom: 50px;
+ font-family: "GmarketSans";
+`;
+
+const FileAddBtn = styled.label`
+ width: 90px;
+ height: 26px;
+ display: flex;
+ cursor: pointer;
+ font-size: 13px;
+ transition: 0.3s;
+ line-height: 24px;
+ border-radius: 20px;
+ justify-content: center;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const FileAddname = styled.div`
+ font-size: 14px;
+ font-weight: 400;
+ margin-left: 20px;
+ color: ${theme.colors.gray[3]};
+`;
+
+const Thumbnail = styled.div`
+ height: 30px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 10px;
+ justify-content: space-between;
+`;
+
+const Photo = styled.div`
+ height: 30px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+ justify-content: space-between;
+`;
+
+const TitleInput = styled.li``;
+const PriceInput = styled.li``;
+const DescriptionInput = styled.div`
+ display: flex;
+ margin-bottom: 10px;
+ justify-content: space-between;
+ textarea {
+ width: 350px;
+ resize: none;
+ height: 200px;
+ padding: 10px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+const TagsInput = styled.li``;
+const IsSoldOutInput = styled.li``;
+const DiscountRateInput = styled.li``;
+
+const ItemAddBtn = styled(Button)`
+ margin-top: 20px;
+`;
+
+const ModalClose = styled.button`
+ top: 1.5rem;
+ right: 2rem;
+ width: 2rem;
+ height: 2rem;
+ border: none;
+ position: absolute;
+ background-color: transparent;
+ color: ${(props) => props.theme.colors.gray[5]};
+ &:hover {
+ cursor: pointer;
+ }
+`;
+
+const ModalAdd = styled.div`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ width: 640px;
+ height: 800px;
+ display: flex;
+ position: fixed;
+ align-items: center;
+ border-radius: 20px;
+ flex-direction: column;
+ justify-content: space-evenly;
+ background-color: ${(props) => props.theme.colors.white};
+`;
+
+export default AdminProductItemAdd;
diff --git a/src/components/admin/AdminProductItemList.tsx b/src/components/admin/AdminProductItemList.tsx
new file mode 100644
index 00000000..d1e55a14
--- /dev/null
+++ b/src/components/admin/AdminProductItemList.tsx
@@ -0,0 +1,262 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { useEffect, useState } from "react";
+import Button from "../../components/common/Button";
+import { productsList } from "../../lib/API/adminAPI";
+import AdminTitle from "../../components/admin/AdminTitle";
+import AdminUserPaging from "../../components/admin/AdminUserPaging";
+import AdminProductItem from "../../components/admin/AdminProductItem";
+import AdminModalTemplate from "../../components/admin/AdminModalTemplate";
+import AdminProductItemAdd from "../../components/admin/AdminProductItemAdd";
+import SubLoading from "../common/SubLoading";
+
+function AdminProductItemList() {
+ const [postPerPage] = useState(6); //ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์
+ const [count, setCount] = useState(0); //์์ดํ
์ด ๊ฐ์
+ const [currentPage, setCurrentPage] = useState(1); //ํ์ฌ ํ์ด์ง. ๊ธฐ๋ณธ๊ฐ '1'
+ const [products, setProducts] = useState([]); //๋ฆฌ์คํธ์ ๋ํ๋ผ ์์ดํ
+ const [indexOfLastPost, setIndexOfLastPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ๋ง์ง๋ง ์์ดํ
์ธ๋ฑ์ค
+ const [indexOfFirstPost, setIndexOfFirstPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ ์์ดํ
์ธ๋ฑ์ค
+ const [currentPosts, setCurrentPosts] = useState([]); //ํ์ฌ ํ์ด์ง์์ ๋ณด์ฌ์ง๋ ์์ดํ
+
+ //๋ชจ๋ฌ ์ํ ๊ธฐ๋ณธ๊ฐ false๋ค true๋ก ๋ฐ๋๋ฉด modalOpen์ ๊ฐ์ด๋๋ฉฐ ์ด ๊ฐ์ return๋ฌธ์ AdminModal ์ปดํฌ๋ํธ ์์ฒญ์ ์ฌ์ฉ๋๋ค.
+ const [modalOpen, setModalOpen] = useState(false);
+ const [isFetching, setIsFetching] = useState(true);
+
+ //๋ชจ๋ฌ ์์ฒญ setModalOpen()์ true ๊ฐ์ ๋ณด๋ธ๋ค.
+ const addModal = (event: React.MouseEvent) => {
+ event.preventDefault();
+ setModalOpen(true);
+ };
+
+ const ModalClose = () => {
+ // setModalOpen(false) ๋๋ ๋ค๋ฅธ ์ํ๋ ๋์์ ์ํํฉ๋๋ค.
+ setModalOpen(false);
+ };
+
+ const setPage = (error: any) => {
+ setCurrentPage(error);
+ };
+
+ //์๋ก๊ณ ์นจ ๊ธฐ๋ฅ
+ const [refresh, setRefresh] = useState(false);
+ function onclick() {
+ setRefresh(!refresh);
+ }
+
+ interface IProduct {
+ id: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ photo: string | null;
+ isSoldOut: boolean;
+ discountRate: number;
+ }
+
+ //์ถ๊ฐํ๊ธฐ ์๋ฃ์ ๋ฆฌ์คํธ ๋๋๋ง
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const itemlist = await productsList();
+ setProducts(itemlist);
+ setCount(itemlist.length); //API๋ก ๋ฐ์ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ์์ดํ
์ ์ด ๊ฐ์ ์ํ๋ก setCount์ ์ ๋ฌ
+ setIsFetching(false);
+ } catch (error) {
+ console.error("UserListPage", error);
+ }
+ }
+ fetchList();
+ }, [modalOpen, refresh]);
+
+ useEffect(() => {
+ setIndexOfLastPost(currentPage * postPerPage); //ํ์ฌ ํ์ด์ง์ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๊ณฑํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ setIndexOfLastPost์ ๋๊ธด๋ค. -> ๋ง์ง๋ง ํฌ์คํธ ์๋ 3
+ setIndexOfFirstPost(indexOfLastPost - postPerPage); //indexOfLastPost์ ๊ฐ๊ณผ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๋บ๋ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ setIndexOfFirstPost์ ์ ๋ฌ -> ์ฒซ๋ฒ์งธ ํฌ์คํธ๋ 0
+ setCurrentPosts(products.slice(indexOfFirstPost, indexOfLastPost)); //products์ ๋ฐฐ์ด์ ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ์ ๋ง์ง๋ง์ ์ธ๋ฑ์ค๊น์ง ๊ฐ์ ๋ณต์ฌ, ๋ฐํํ์ฌ setCurrentPosts์ ์ ๋ฌ
+ }, [currentPage, indexOfLastPost, indexOfFirstPost, postPerPage, products]); //์์ ๊ธฐ๋ฅ์ด ๋๋๋ฉด ๋ฐฐ์ด ์์ ๊ฒฐ๊ณผ๋ค์ ํ ๋ฒ ์คํ
+
+ return (
+
+ ๋ชจ๋ ์ ํ ์กฐํ
+
+
+ ์ํ์ด๋ฏธ์ง
+ ์ํ๋ช
+ ์ ํID
+ ์ ํ ๊ฐ๊ฒฉ
+ ํ๊ทธ
+ ์ฌ๊ณ
+ ํ ์ธ์จ
+
+
+ ์ถ๊ฐํ๊ธฐ
+
+ {modalOpen && (
+
+
+
+ )}
+
+ {isFetching ? (
+
+ ) : (
+
+ {currentPosts && currentPosts.length > 0 ? (
+ currentPosts.map((productData: any) => (
+
+ ))
+ ) : (
+ ์ ํ์ด ์์ต๋๋ค. //๋ฐ์ดํฐ๊ฐ ์๋ ์ํ๋ ํด๋น ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ค.
+ )}
+
+ )}
+
+
+
+
+
+ );
+}
+
+const ItemContainer = styled.div`
+ gap: 10px 0;
+ width: 100%;
+ display: grid;
+ flex-wrap: wrap;
+ overflow: auto;
+ -ms-overflow-style: none;
+ ::-webkit-scrollbar {
+ display: none !important;
+ }
+ max-height: 500px;
+ grid-template-rows: repeat(0, 6fr);
+ grid-template-columns: repeat(0, 1fr);
+`;
+
+const UserData = styled.div`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: flex;
+ margin: 0 auto;
+ position: absolute;
+ align-items: center;
+ justify-content: center;
+ color: ${theme.colors.gray[3]};
+`;
+
+const PageNation = styled.div`
+ left: 0;
+ right: 0;
+ bottom: 0;
+ width: 100%;
+ height: 70px;
+ display: flex;
+ position: absolute;
+ align-items: center;
+ justify-content: center;
+ background-color: ${theme.colors.white};
+`;
+
+const AdminOrderContainer = styled.div`
+ bottom: 0;
+ height: 90%;
+ display: flex;
+ margin: 0 30px;
+ overflow: hidden;
+ position: relative;
+ flex-direction: column;
+`;
+
+const CategoryMenuContainer = styled.div`
+ width: 100%;
+ height: 90px;
+ display: flex;
+ font-size: 18px;
+ font-weight: 700;
+ padding-right: 1px;
+ align-items: center;
+`;
+
+const ItemBox = styled.div`
+ width: 100%;
+ display: flex;
+`;
+
+const Thumbnail = styled.div`
+ width: 15%;
+ height: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const Title = styled.div`
+ width: 20%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const ProductId = styled.div`
+ width: 20%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const Price = styled.div`
+ width: 10%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const Tags = styled.div`
+ width: 15%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const IsSoldOut = styled.div`
+ width: 10%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-right: 1px solid ${theme.colors.gray[5]};
+`;
+
+const DiscountRate = styled.div`
+ width: 10%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+`;
+
+const AddBtn = styled(Button)`
+ margin: auto 26px auto 0;
+`;
+
+export default AdminProductItemList;
diff --git a/src/components/admin/AdminTemplate.tsx b/src/components/admin/AdminTemplate.tsx
new file mode 100644
index 00000000..ac90d23f
--- /dev/null
+++ b/src/components/admin/AdminTemplate.tsx
@@ -0,0 +1,26 @@
+import { PropsWithChildren } from "react";
+import styled from "styled-components";
+
+function AdminTemplate({children}: PropsWithChildren) {
+ return(
+
+ {children}
+
+ );
+}
+
+//๊ด๋ฆฌ์ ํ์ด์ง ๋ฐฐ๊ฒฝ ํ์ด์ง ์๋จ์ ์์นํ์ฌ ํ๋ฉด ํ์
+const AdminContainer = styled.div`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 20;
+ width: 100vw;
+ height: 100vh;
+ display: flex;
+ position: absolute;
+ background-color: #fff;
+ `
+
+export default AdminTemplate;
diff --git a/src/components/admin/AdminTitle.tsx b/src/components/admin/AdminTitle.tsx
new file mode 100644
index 00000000..2c8159dc
--- /dev/null
+++ b/src/components/admin/AdminTitle.tsx
@@ -0,0 +1,28 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+
+type AdminChildren = {
+ children: React.ReactNode;
+}
+
+function AdminTitle({children}:AdminChildren) {
+ return(
+
+ {children}
+
+ )
+}
+
+const TitleContainer = styled.div`
+ border-bottom: 1px solid ${theme.colors.gray[3]};
+ height: 68px;
+ width: 100%;
+`;
+
+const Title = styled.div`
+ font-size: 28px;
+ margin-top: 25px;
+ font-weight: 700;
+ font-family: 'GmarketSans';
+`;
+export default AdminTitle;
\ No newline at end of file
diff --git a/src/components/admin/AdminUserItem.tsx b/src/components/admin/AdminUserItem.tsx
new file mode 100644
index 00000000..11abdc2c
--- /dev/null
+++ b/src/components/admin/AdminUserItem.tsx
@@ -0,0 +1,53 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { UserList } from "../../lib/API/adminAPI";
+
+function AdminUserItem(props:UserList) {
+ return (
+
+
+ {props.profileImg &&
}
+ {!props.profileImg &&
}
+
+ {props.email}
+ {props.displayName}
+
+ );
+}
+
+const ItemContainer = styled.div`
+ background-color: ${theme.colors.gray[2]};
+ border: 1px solid ${theme.colors.gray[7]};
+ flex-direction: column;
+ border-radius: 5px;
+ overflow: hidden;
+ display: flex;
+ &:hover {
+ transform: scale(1.03);
+ border: 1px solid ${theme.colors.gray[3]};
+ }
+`;
+
+const ProfileImg = styled.div`
+ background-color: ${theme.colors.white};
+ justify-content: center;
+ max-height: 120px;
+ display: flex;
+ img {
+ max-height: 100%;
+ margin: 10px;
+ }
+`;
+
+const UserEmail = styled.div`
+ margin: 10px auto 0;
+ font-size: 12px;
+`;
+
+const UserName = styled.div`
+ margin: 8px auto 10px;
+ font-weight: 700;
+ font-size: 18px;
+`;
+
+export default AdminUserItem;
diff --git a/src/components/admin/AdminUserPaging.tsx b/src/components/admin/AdminUserPaging.tsx
new file mode 100644
index 00000000..99d501f5
--- /dev/null
+++ b/src/components/admin/AdminUserPaging.tsx
@@ -0,0 +1,87 @@
+import Pagination from "react-js-pagination";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+
+interface AdminUserPagingProps {
+ page: number;
+ count: number;
+ setPage: (page: number) => void;
+ }
+
+const AdminUserPaging: React.FC = ({page, count, setPage}) => {
+
+ return (
+
+ "} //๋ค์ ํ
์คํธ
+ lastPageText={""} //๋งจ ๋ง์ง๋ง ์ด๋ ํ
์คํธ
+ firstPageText={""} //๋งจ ์์ผ๋ก ์ด๋ ํ
์คํธ
+ itemClassFirst={"FirstArrow"} //๋งจ ์์ผ๋ก ์ด๋ ํ
์คํธ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ itemClassPrev={"PrevArrow"} //๋งจ ์ด์ ์ด๋ ํ
์คํธ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ itemClassNext={"NextArrow"} //๋งจ ๋ค์ ์ด๋ ํ
์คํธ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ itemClassLast={"ListArrow"} //๋งจ ๋ง์ง๋ง ์ด๋ ํ
์คํธ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ activeClass={"active"} //ํ์ด์ง ๋ฒํธ ํ
์คํธ ์ ํ ์ํ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ itemClass={"item"} //๋ฒํธ ํ์ด์ง ํ
์คํธ ์คํ์ผ ์ ์ฉ ํด๋์ค๋ช
+ onChange={setPage} //ํ์ด์ง๊ฐ ๋ฐ๋๋ฉด ํธ๋ค๋ง ์์ผ์ค ํจ์
+ />
+
+ );
+}
+
+const PageStyles = styled.div`
+.pagination{
+ margin-bottom: 30px;
+ display: flex;
+ li {
+ margin: 6px;
+ display: flex;
+ a {
+ line-height: 34px;
+ display: flex;
+ }
+ }
+
+ .FirstArrow, .ListArrow {
+ display: none;
+ }
+
+ .PrevArrow a, .NextArrow a{
+ background-color: ${theme.colors.orange.main};
+ color: ${theme.colors.white};
+ line-height: 30px;
+ justify-content: center;
+ border-radius: 5px;
+ transition: 0.2s;
+ display: flex;
+ height: 30px;
+ width: 30px;
+ &:hover {
+ background-color: ${theme.colors.orange.hover};
+ }
+ }
+
+ .item {
+ justify-content: center;
+ display: flex;
+ height: 30px;
+ width: 30px;
+ }
+
+ .active {
+ color: ${theme.colors.orange.main};
+ justify-content: center;
+ border-radius: 5px;
+ line-height: 34px;
+ display: flex;
+ height: 30px;
+ width: 30px;
+ }
+ }
+`
+
+export default AdminUserPaging;
diff --git a/src/components/auth/AuthForm.tsx b/src/components/auth/AuthForm.tsx
new file mode 100644
index 00000000..7fd49d89
--- /dev/null
+++ b/src/components/auth/AuthForm.tsx
@@ -0,0 +1,526 @@
+import { Dispatch, FormEvent, SetStateAction, useState } from "react";
+import { NavLink, useNavigate } from "react-router-dom";
+import styled from "styled-components";
+import { login, register } from "../../lib/API/userAPI";
+import Button from "../common/Button";
+import Loading from "../common/Loading";
+import { theme } from "../../styles/theme";
+
+// Interface
+interface IAuthFormProps {
+ type: string;
+ setUsername: Dispatch>;
+}
+
+interface ITextMap {
+ [key: string]: string;
+}
+
+// Constant / Variable
+const textMap: ITextMap = {
+ // ๋ก๊ทธ์ธ / ํ์๊ฐ์
์ ๋ฐ๋ฅธ ์ ๋ชฉ
+ login: "์ด๋ฉ์ผ ๋ก๊ทธ์ธ",
+ register: "ํ์๊ฐ์
",
+};
+
+const PARAMS = {
+ // URL ํ๋ฆฌ๋ฏธํฐ End-Point
+ login: "/auth/login",
+ register: "/auth/register",
+};
+
+function AuthForm({ type, setUsername }: IAuthFormProps) {
+ // ์ปดํฌ๋ํธ ํ์
์ ๋ฐ๋ฅธ ์ ๋ชฉ
+ const text = textMap[type];
+
+ // Hooks
+ // ์
๋ ฅ / ์ถ๋ ฅ
+ const [email, setEmail] = useState("");
+ const [displayNameMessage, setDisplayNameMessage] = useState("");
+ const [password, setPassword] = useState("");
+ const [passwordConfirm, setPasswordConfirm] = useState("");
+ const [displayName, setDisplayName] = useState("");
+ const [profileImgBase64, setProfileImgBase64] = useState("");
+
+ // ๋ฉ์์ง
+ const [loginMessage, setLoginMessage] = useState("");
+ const [registerMessage, setRegisterMessage] = useState("");
+ const [emailMessage, setEmailMessage] = useState("");
+ const [passwordMessage, setPasswordMessage] = useState("");
+ const [passwordConfirmMessage, setPasswordConfirmMessage] = useState("");
+
+ // ์ ํจ์ฑ
+ const [isDisplayName, setIsDisplayName] = useState(false);
+ const [isPasswordConfirm, setIsPasswordConfirm] = useState(false);
+
+ const [loading, setLoading] = useState(false);
+
+ // ๋ผ์ฐํ
+ const navigate = useNavigate();
+
+ // Function
+ const onLoginChange = (event: FormEvent) => {
+ const { name, value } = event.target as HTMLInputElement;
+ if (name === "email") {
+ setEmail(value);
+ } else if (name === "password") {
+ setPassword(value);
+ }
+ };
+
+ const onRegisterChange = (event: FormEvent) => {
+ const { name, value, files } = event.target as HTMLInputElement;
+ if (name === "email") {
+ // ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ
+ const rEmail =
+ /([\w-.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
+ if (!rEmail.test(value)) {
+ setEmailMessage("์ด๋ฉ์ผ ํ์์ผ๋ก ์ ์ด์ฃผ์ธ์.");
+ } else {
+ setEmailMessage("");
+ setEmail(value);
+ }
+ } else if (name === "password") {
+ // ํจ์ค์๋ ์ ํจ์ฑ ๊ฒ์ฌ
+ const rPassword = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,25}$/;
+ if (!rPassword.test(value)) {
+ setPasswordMessage(
+ "์ซ์ + ์๋ฌธ + ํน์๋ฌธ์ ์กฐํฉ์ผ๋ก 8์๋ฆฌ ์ด์ ์
๋ ฅํด์ฃผ์ธ์.",
+ );
+ } else {
+ setPasswordMessage("");
+ setPassword(value);
+ }
+ } else if (name === "displayName") {
+ // ๋๋ค์ ์ ํจ์ฑ ๊ฒ์ฌ
+ if (value.length <= 2 || value.length > 5) {
+ setDisplayName(value);
+ setIsDisplayName(true);
+ } else if (value.length < 1 || value.length > 6) {
+ setDisplayNameMessage("2๊ธ์ ์ด์ 5๊ธ์ ๋ฏธ๋ง์ผ๋ก ์
๋ ฅํด์ฃผ์ธ์.");
+ setIsDisplayName(false);
+ }
+ } else if (name === "passwordConfirm") {
+ // ๋น๋ฐ๋ฒํธ ์ผ์น ์ ํจ์ฑ ๊ฒ์ฌ
+ if (password === value) {
+ setPasswordConfirm(value);
+ setPasswordConfirmMessage("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํฉ๋๋ค.");
+ setIsPasswordConfirm(true);
+ } else {
+ setPasswordConfirmMessage("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
+ setIsPasswordConfirm(false);
+ }
+ } else if (name === "profileImgBase64") {
+ const file = files as FileList;
+ const reader = new FileReader();
+ reader.readAsDataURL(file[0]);
+ return new Promise((resolve) => {
+ reader.onload = () => {
+ setProfileImgBase64(reader.result as string);
+ resolve();
+ };
+ });
+ }
+ };
+
+ const onRegister = async (event: FormEvent) => {
+ event.preventDefault();
+ if (email === "" || password === "" || displayName === "") {
+ // ์
๋ ฅ๊ฐ์ด ํ๋๋ผ๋ ์์ ๋ ๋ฉ์์ง ์ถ๋ ฅ
+ setRegisterMessage("ํ์ ์
๋ ฅ ์ฌํญ์
๋๋ค!");
+ } else {
+ // ์
๋ ฅ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ์ ๋ ํ์๊ฐ์
์์ฒญ
+ setLoading(true);
+ await register(email, password, displayName, profileImgBase64).then(
+ (response) => {
+ if (typeof response === "string") {
+ setRegisterMessage("์ด๋ฏธ ๊ณ์ ์ด ์์ต๋๋ค!");
+ console.log(response);
+ } else {
+ const username = localStorage.getItem("username");
+ setUsername(username || "");
+ setEmail("");
+ setPassword("");
+ setProfileImgBase64("");
+ setPasswordConfirm("");
+ navigate("/");
+ }
+ },
+ );
+ }
+ setTimeout(() => setLoading(false), 5000);
+ };
+
+ const onLogin = async (event: FormEvent) => {
+ event.preventDefault();
+ if (email === "" || password === "") {
+ // ์
๋ ฅ๊ฐ์ด ํ๋๋ผ๋ ์์ ๋ ๋ฉ์์ง ์ถ๋ ฅ
+ setLoginMessage("์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํด์ฃผ์ธ์!");
+ } else {
+ // ์
๋ ฅ๊ฐ์ด ์ ๋๋ก ๋ค์ด๊ฐ์ ๋ ๋ก๊ทธ์ธ ์์ฒญ
+ setLoading(true);
+ const username = localStorage.getItem("username");
+ await login(email, password).then((response) => {
+ if (response === undefined) {
+ setLoginMessage("์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํด์ฃผ์ธ์!");
+ } else {
+ event.preventDefault();
+ setUsername(username || "");
+ setEmail("");
+ setPassword("");
+ navigate("/", {
+ state: { name: localStorage.getItem("username") },
+ });
+ }
+ });
+ }
+ setTimeout(() => setLoading(false), 5000);
+ };
+
+ // Render
+ return (
+ <>
+ {loading && }
+
+
+ {/* NavLink๋ฅผ Styled-Components๋ก ์คํ์ผ๋ง */}
+ ๋ก๊ทธ์ธ
+ ํ์๊ฐ์
+
+ {text}
+
+ {/* Login */}
+ {type === "login" && (
+ <>
+
+
+
+
+
+
+ ๋ก๊ทธ์ธ
+
+
+ {loginMessage}
+ >
+ )}
+ {/* Register */}
+ {type === "register" && (
+ <>
+
+
+ {profileImgBase64 ? "" :
}
+
+
+ ํ๋กํ ์ด๋ฏธ์ง
+
+ {profileImgBase64
+ ? "์ด๋ฏธ์ง ์
๋ก๋ ์๋ฃ"
+ : "์ ํ๋ ํ์ผ ์์"}
+
+ ์
๋ก๋
+
+
+
+ ๋๋ค์
+
+
+ {isDisplayName && (
+ {displayNameMessage}
+ )}
+
+ ์ด๋ฉ์ผ
+
+
+ {emailMessage && {emailMessage}}
+
+ ๋น๋ฐ๋ฒํธ
+
+
+ {passwordMessage && (
+ {passwordMessage}
+ )}
+
+ ๋น๋ฐ๋ฒํธ ํ์ธ
+
+
+ {passwordConfirmMessage && (
+
+ {passwordConfirmMessage}
+
+ )}
+
+ ํ์๊ฐ์
+
+
+ {registerMessage}
+ >
+ )}
+
+
+ >
+ );
+}
+
+// Style
+const AuthFormBlock = styled.div`
+ border-radius: 1rem;
+ padding-bottom: 40px;
+ border: 1px solid ${theme.colors.gray[3]};
+ h3 {
+ padding-top: 30px;
+ text-align: center;
+ margin: 20px 0;
+ font-weight: 700;
+ font-size: 1.5rem;
+ font-family: 'GmarketSans';
+ }
+`;
+
+const ProfileImgs = styled.div`
+ background-color: ${theme.colors.white};
+ justify-content: center;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ overflow: hidden;
+ border-radius: 100%;
+ img {
+ border-radius: 100%;
+ }
+`;
+
+const StyledForm = styled.form`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ padding: 1rem;
+`;
+
+const Tab = styled.div`
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+const TabButton = styled(NavLink)`
+ width: 100%;
+ border: none;
+ display: flex;
+ color: #b7b7b7;
+ height: 3.125rem;
+ align-items: center;
+ background: ${theme.colors.gray[2]};
+ justify-content: center;
+ /* border: 1px solid #ccc; */
+ &:first-child {
+ border-radius: 16px 0 0 0;
+ }
+ &:last-child {
+ border-radius: 0 16px 0 0;
+ }
+ /* .active๋ผ๋ ํด๋์ค์ด๋ฆ์ ๋ฃ์ด์ฃผ๋ฉด ๋ผ์ฐํ
๋๋ฉด์ active๋ผ๋ ํด๋์ค์ด๋ฆ์ด ์๋์ผ๋ก ์ ์ฉ */
+ &.active {
+ background: #fff;
+ font-weight: 700;
+ color: #000;
+ }
+`;
+
+// Login
+const LoginForm = styled.div`
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ gap: 20px;
+ height: 80px;
+`;
+
+const LoginInputWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ height: 100%;
+ gap: 8px;
+`;
+
+const StyledInput = styled.input`
+ outline: none;
+ width: 200px;
+ padding: 0.5rem;
+ border-radius: 4px;
+ font-size: 0.875rem;
+ background: ${theme.colors.gray[2]};
+ border: 1px solid ${theme.colors.gray[3]};
+ &:focus {
+ border: 1px solid #707070;
+ }
+ &::placeholder {
+ color: ${theme.colors.gray[3]};
+ }
+`;
+
+const LoginError = styled.span`
+ color: #f00;
+ font-weight: 700;
+ margin-top: 1.25rem;
+`;
+
+const ErrorMessage = styled.span`
+ color: #f00;
+ font-size: 12px;
+ font-weight: 700;
+ align-self: flex-end;
+ &.success {
+ color: #229bff;
+ }
+ &.failure {
+ color: #f00;
+ }
+`;
+
+const LoginButton = styled(Button)`
+ height: 100%;
+ width: 90px;
+ font-weight: 400;
+`;
+
+// Register
+const RegisterForm = styled.div`
+ gap: 10px;
+ display: flex;
+ width: 330px;
+ flex-direction: column;
+`;
+
+const ProfileImage = styled.div<{ profileImg?: string }>`
+ width: 120px;
+ height: 120px;
+ display: flex;
+ align-self: center;
+ background: #ccc;
+ border-radius: 50%;
+ align-items: center;
+ margin-bottom: 20px;
+ margin-bottom: 36px;
+ background-size: cover;
+ justify-content: center;
+ border: 1px solid #ccc;
+ background-position: center center;
+ background-image: url(${(props) => props.profileImg});
+`;
+
+const RegisterInputBlock = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+`;
+
+const RegisterLabel = styled.span`
+ font-size: 0.875rem;
+ font-weight: 700;
+ &::after {
+ content: "*";
+ margin: 0 4px;
+ color: ${theme.colors.orange.main};
+ font-size: 14px;
+ }
+`;
+
+const ImageLabel = styled.span`
+ font-size: 0.875rem;
+ font-weight: 700;
+`;
+
+const ImageMessage = styled.span`
+ font-size: 12px;
+ color: #818181;
+ &.message {
+ color: ${theme.colors.orange.main};
+ }
+`;
+
+const ImageUpload = styled.input`
+ display: none;
+`;
+
+const UploadButton = styled.label`
+ width: 60px;
+ height: 26px;
+ display: flex;
+ cursor: pointer;
+ font-size: 13px;
+ transition: 0.3s;
+ line-height: 24px;
+ border-radius: 20px;
+ justify-content: center;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const RegisterButton = styled(Button)`
+ margin-top: 1rem;
+`;
+
+const RegisterErrorMessage = styled.span`
+ font-size: 14px;
+ font-weight: 700;
+ color: #f00;
+ margin-top: 1rem;
+`;
+
+export default AuthForm;
diff --git a/src/components/auth/AuthTemplate.tsx b/src/components/auth/AuthTemplate.tsx
new file mode 100644
index 00000000..395fc8b7
--- /dev/null
+++ b/src/components/auth/AuthTemplate.tsx
@@ -0,0 +1,31 @@
+import { PropsWithChildren } from "react";
+import styled from "styled-components";
+
+function AuthTemplate({ children }: PropsWithChildren) {
+ return (
+
+ {children}
+
+ );
+}
+
+const AuthTemplateBlock = styled.div`
+ /* position: absolute; */
+ left: 0;
+ top: 200px;
+ bottom: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+`;
+
+const WhiteBox = styled.div`
+ box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.025);
+ width: 30rem;
+ background: #fff;
+ border-radius: 2px;
+`;
+
+export default AuthTemplate;
diff --git a/src/components/common/Button.tsx b/src/components/common/Button.tsx
new file mode 100644
index 00000000..db26c383
--- /dev/null
+++ b/src/components/common/Button.tsx
@@ -0,0 +1,211 @@
+import { theme } from "../../styles/theme";
+import styled, { css } from "styled-components";
+
+interface IButtonProps {
+ [rest: string]: any;
+}
+
+function Button({ ...rest }: IButtonProps) {
+ return ;
+}
+
+const StyledButton = styled.button<{
+ active?: boolean;
+ middleWidth?: boolean;
+ fullWidth?: boolean;
+ login?: boolean;
+ register?: boolean;
+ orange?: boolean;
+ reverse?: boolean;
+ adminlogout?: boolean;
+ admin?: boolean;
+ admindel?: boolean;
+ adminedit?: boolean;
+ adminadd?: boolean;
+ minidel?: boolean;
+}>`
+ border: none;
+ outline: none;
+ cursor: pointer;
+ border-radius: 5px;
+ background: #707070;
+ color: #fff;
+ &:disabled {
+ background: #ccc;
+ color: #707070;
+ cursor: not-allowed;
+ opacity: 0.5;
+ }
+ ${(rest) =>
+ rest.active &&
+ css`
+ padding: 0.5rem 1rem;
+ background: #333;
+ color: #fff;
+ `}
+ ${(rest) =>
+ rest.middleWidth &&
+ css`
+ width: 160px;
+ height: 2.5rem;
+ &:hover {
+ font-weight: 700;
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.fullWidth &&
+ css`
+ padding: 0.75rem 0;
+ width: 100%;
+ font-size: 1.125rem;
+ `}
+ ${(rest) =>
+ rest.login &&
+ css`
+ background: ${theme.colors.orange.main};
+ border-radius: 5px;
+ font-size: 1rem;
+ transition: 0.1s;
+ &:hover {
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.register &&
+ css`
+ background: ${theme.colors.orange.main};
+ width: 100%;
+ `}
+ ${(rest) =>
+ rest.orange &&
+ css`
+ background: ${theme.colors.orange.main};
+ transition: 0.1s;
+ &:hover {
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.reverse &&
+ css`
+ background: ${theme.colors.white};
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ `}
+ ${(rest) =>
+ rest.adminlogout &&
+ css`
+ width: 120px;
+ font-size: 1rem;
+ transition: 0.1s;
+ transition: 0.3s;
+ background: none;
+ border-radius: 1.25rem;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ font-weight: 700;
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.main};
+ }
+ `}
+ ${(rest) =>
+ rest.admin &&
+ css`
+ width: 134px;
+ height: 40px;
+ font-size: 1rem;
+ transition: 0.1s;
+ border-radius: 5px;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ &:hover {
+ font-weight: 700;
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.admindel &&
+ css`
+ width: 60px;
+ height: 40px;
+ font-size: 1rem;
+ transition: 0.1s;
+ border-radius: 5px;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ &:hover {
+ font-weight: 700;
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.adminedit &&
+ css`
+ width: 60px;
+ height: 40px;
+ font-size: 1rem;
+ background: none;
+ transition: 0.1s;
+ border-radius: 5px;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ font-weight: 700;
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.main};
+ }
+ `}
+ ${(rest) =>
+ rest.adminadd &&
+ css`
+ width: 100%;
+ height: 40px;
+ font-size: 1rem;
+ transition: 0.3s;
+ border-radius: 5px;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ &:hover {
+ font-weight: 700;
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.hover};
+ }
+ `}
+ ${(rest) =>
+ rest.minidel &&
+ css`
+ width: 40px;
+ height: 20px;
+ border: none;
+ display: flex;
+ font-size: 12px;
+ cursor: pointer;
+ transition: 0.1s;
+ line-height: 18px;
+ padding-right: 6px;
+ border-radius: 5px;
+ justify-content: center;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ :hover {
+ transform: scale(1.03);
+ background-color: ${theme.colors.orange.hover};
+ }
+ `}
+`;
+
+export default Button;
diff --git a/src/components/common/Carousel.tsx b/src/components/common/Carousel.tsx
new file mode 100644
index 00000000..b3a462b9
--- /dev/null
+++ b/src/components/common/Carousel.tsx
@@ -0,0 +1,80 @@
+import Slider, { CustomArrowProps, Settings } from "react-slick";
+import "slick-carousel/slick/slick.css";
+import "slick-carousel/slick/slick-theme.css";
+import styled from "styled-components";
+import { MdArrowBackIosNew, MdArrowForwardIos } from "react-icons/md";
+
+interface ICarouselProps {
+ children: React.ReactNode;
+ slides: number;
+ color: string;
+}
+
+function Carousel({ children, slides, color }: ICarouselProps) {
+ // NextArrow ์ปดํฌ๋ํธ
+ const NextArrow = ({
+ currentSlide,
+ slideCount,
+ ...props
+ }: CustomArrowProps) => {
+ return ;
+ };
+
+ // PrevArrow ์ปดํฌ๋ํธ
+ const PrevArrow = ({
+ currentSlide,
+ slideCount,
+ ...props
+ }: CustomArrowProps) => {
+ return ;
+ };
+
+ const settings: Settings = {
+ dots: true,
+ infinite: true,
+ speed: 300,
+ slidesToShow: slides,
+ autoplay: true,
+ arrows: true,
+ nextArrow: ,
+ prevArrow: ,
+ responsive: [
+ {
+ breakpoint: 768,
+ settings: {
+ slidesToShow: 2,
+ },
+ },
+ {
+ breakpoint: 480,
+ settings: {
+ slidesToShow: 1,
+ },
+ },
+ ],
+ };
+
+ return {children};
+}
+
+const StyledSlider = styled(Slider)`
+ position: relative;
+
+ .slick-prev {
+ position: absolute;
+ left: -80px;
+ }
+
+ .slick-next {
+ position: absolute;
+ right: -70px;
+ }
+
+ .slick-prev::before,
+ .slick-next::before {
+ opacity: 0;
+ display: none;
+ }
+`;
+
+export default Carousel;
diff --git a/src/components/common/Footer.tsx b/src/components/common/Footer.tsx
new file mode 100644
index 00000000..1f3f510e
--- /dev/null
+++ b/src/components/common/Footer.tsx
@@ -0,0 +1,173 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { BsFacebook, BsGithub, BsInstagram, BsYoutube } from "react-icons/bs";
+
+function Footer() {
+ return (
+
+
+
+
+
+
+
+
+
๊ณ ๊ฐ์ผํฐ
+
24์๊ฐ ์ฐ์ค๋ฌดํด
+
+ 1566-1004
+
+ (์ฃผ)์์ดํธ ์คํ์ด์ค ๊ทธ๋ฃน
+
+ ์ฌ์
์ ๋ฑ๋ก๋ฒํธ : 150-66-100004 | ๋ํ : ๋ฉ๋กฑ๋จธ์คํฌ
+
+ ํธ์คํ
์๋น์ค : ์ฃผ์ํ์ฌ ์๋ฒ๋๋ ์๋ง์กด ์๋ฒ | ํต์ ํ๋งค์
์ ๊ณ ๋ฒํธ:
+ 2023-์์ธ๊ฐ๋จ-03377
+
+ 06241 ์์ธ ๊ฐ๋จ๊ตฌ ๊ฐ๋จ๋๋ก 364, 10์ธต 11์ธต (๊ฐ๋จ์ญ, ๋ฏธ์๋น๋ฉ)
+
+ ๊ณ ๊ฐ์ผํฐ : ์์ธ ๊ฐ๋จ๊ตฌ ๊ฐ๋จ๋๋ก 364, 12์ธต (๊ฐ๋จ์ญ, ๋ฏธ์๋น๋ฉ)
+
+
+
+ ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ฐฉ์นจ
+ ์๋น์ค ์ด์ฉ์ฝ๊ด
+ ์ด์ฉ์๋ด
+ ๊ทธ๋ฃน ์๊ฐ
+
+
+
+
+
+
+
+
+
+ ยฉ 2023. 8 SPACE GROUP All rights reserved.
+
+ );
+}
+
+const Container = styled.footer`
+ height: 22.1875rem;
+ display: flex;
+ margin-top: 6.25rem;
+ align-items: center;
+ flex-direction: column;
+ justify-content: center;
+ background: ${theme.colors.gray[4]};
+`;
+
+const Contents = styled.footer`
+ width: 75rem;
+ height: 18.75rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+`;
+
+const Logo = styled.footer`
+ width: 25%;
+ img {
+ opacity: 30%;
+ }
+`;
+
+const FooterContent = styled.footer`
+ width: 50%;
+ display: flex;
+ padding-left: 25px;
+ flex-direction: column;
+ color: ${theme.colors.gray[5]};
+ border-left: 3px solid ${theme.colors.gray[3]};
+`;
+
+const Customer = styled.footer`
+ height: 45px;
+ display: flex;
+ margin-bottom: 20px;
+ .CustomerTitle {
+ justify-content: center;
+ div:first-child {
+ display: flex;
+ font-size: 22px;
+ font-weight: 700;
+ margin: 4px 0 3px 0;
+ }
+ div:last-child {
+ display: flex;
+ font-size: 11px;
+ align-items: end;
+ padding-left: 2px;
+ }
+ }
+ .CustomerAddres {
+ font-size: 45px;
+ font-weight: 700;
+ margin-left: 18px;
+ }
+`;
+
+const Company = styled.footer`
+ display: flex;
+ font-size: 18px;
+ font-weight: 700;
+ margin-bottom: 20px;
+`;
+
+const Business = styled.footer`
+ display: flex;
+ font-size: 12px;
+ line-height: 18px;
+ margin-bottom: 20px;
+`;
+
+const Service = styled.footer`
+ display: flex;
+ div {
+ width: 94px;
+ height: 20px;
+ display: flex;
+ cursor: pointer;
+ font-size: 10px;
+ padding-top: 1px;
+ margin-right: 8px;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid ${theme.colors.gray[3]};
+ }
+`;
+
+const SocialMenu = styled.footer`
+ width: 25%;
+ height: 75%;
+ display: flex;
+ align-items: end;
+ justify-content: end;
+ padding-left: 20px;
+ svg {
+ display: flex;
+ font-size: 32px;
+ cursor: pointer;
+ align-items: end;
+ transition: 0.1s;
+ margin-right: 20px;
+ color: ${theme.colors.orange.main};
+ &:hover {
+ transform: scale(1.1);
+ }
+ }
+`;
+
+const Copy = styled.div`
+ width: 100%;
+ height: 55px;
+ display: flex;
+ font-size: 14px;
+ align-items: center;
+ justify-content: center;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+`;
+
+export default Footer;
diff --git a/src/components/common/GrayInput.tsx b/src/components/common/GrayInput.tsx
new file mode 100644
index 00000000..a7418f2e
--- /dev/null
+++ b/src/components/common/GrayInput.tsx
@@ -0,0 +1,41 @@
+import styled, { css } from "styled-components";
+
+// ์ ํฌ props ๋์ rest๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์์ต๋๋ค.
+function GrayInput({ ...props }) {
+ return ;
+}
+
+const StyledInput = styled.input<{
+ middleWidth?: boolean;
+ fullWidth?: boolean;
+}>`
+ width: 200px;
+ outline: none;
+ font-size: 14px;
+ padding: 0.5rem;
+ border-radius: 5px;
+ background: ${(props) => props.theme.colors.gray[2]};
+ border: 1px solid ${(props) => props.theme.colors.gray[3]};
+
+ &::placeholder {
+ color: ${(props) => props.theme.colors.gray[3]};
+ }
+
+ &:focus {
+ border: 1px solid ${(props) => props.theme.colors.gray[5]};
+ }
+
+ ${(props) =>
+ props.middleWidth &&
+ css`
+ width: 416px;
+ `}
+
+ ${(props) =>
+ props.fullWidth &&
+ css`
+ width: 549px;
+ `}
+`;
+
+export default GrayInput;
diff --git a/src/components/common/Header.tsx b/src/components/common/Header.tsx
new file mode 100644
index 00000000..f5940d9f
--- /dev/null
+++ b/src/components/common/Header.tsx
@@ -0,0 +1,329 @@
+import { theme } from "../../styles/theme";
+import styled from "styled-components";
+import { IoMdHeart } from "react-icons/io";
+import { HiShoppingCart } from "react-icons/hi";
+import { MdSearch } from "react-icons/md";
+import { Link, useLocation, useNavigate } from "react-router-dom";
+import {
+ ChangeEventHandler,
+ Dispatch,
+ SetStateAction,
+ useEffect,
+ useState,
+} from "react";
+import { check, logout } from "../../lib/API/userAPI";
+import SubHeader from "./SubHeader";
+import MainSearched from "../main/MainSearched";
+import { useQuery } from "react-query";
+
+interface IMainPageProps {
+ username: string;
+ setUsername: Dispatch>;
+ clickedTag: string;
+ inputText: string;
+ clickTagHandler: (tag: string) => void;
+ searchHandler: ChangeEventHandler;
+}
+
+export interface ICheckData {
+ email: string;
+ displayName: string;
+ profileImg: string | null;
+}
+
+function Header({
+ username,
+ setUsername,
+ clickedTag,
+ inputText,
+ clickTagHandler,
+ searchHandler,
+}: IMainPageProps) {
+ const navigate = useNavigate();
+ const [userImg, setUserImg] = useState("");
+ const [isAdmin, setIsAdmin] = useState(false);
+ const ADMIN_EMAIL = process.env.REACT_APP_EMAIL;
+ const ADMIN_NAME = process.env.REACT_APP_DISPLAY_NAME;
+ const [isFocused, setIsFocused] = useState(false);
+
+ // useQuery๋ฅผ ์ฌ์ฉํด ํ์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆ. ํด๋น ๋ฐ์ดํฐ๋ฅผ ์บ์ฑ
+ // ๋น๋๊ธฐ ํจ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋์ ์๋ฃ๋๋ฉด ์ ์ ๋ช
๊ณผ ํ๋กํ ์ฌ์ง์ state๋ก ์ ๋ฌ
+ // ๊ด๋ฆฌ์ ๊ถํ ๋ถ์ฌ ์ฌ๋ถ ํ๋จ
+ // staleTime์ผ๋ก ์บ์ฑ๋ ๋ฐ์ดํฐ์ ์ ํจ์๊ฐ์ 1000ms๋ก ์ค์
+ const { refetch } = useQuery("check", check, {
+ onSuccess: (res) => {
+ setUsername(res.displayName);
+ setUserImg(res.profileImg);
+
+ res.email === ADMIN_EMAIL && res.displayName === ADMIN_NAME
+ ? setIsAdmin(true)
+ : setIsAdmin(false);
+ },
+ refetchOnWindowFocus: false,
+ });
+
+ useEffect(() => {
+ refetch();
+ }, [refetch, username]);
+
+ const onLogout = async () => {
+ await logout();
+ localStorage.removeItem("Token");
+ localStorage.removeItem("username");
+ localStorage.clear();
+ setUsername("");
+ alert("๋ก๊ทธ์์ ๋์์ต๋๋ค.");
+ navigate("/");
+ };
+
+ // MainPage์์๋ง SubHeader ์ปดํฌ๋ํธ ์ถ๋ ฅ
+ const location = useLocation();
+
+ const getSubHeader = () => {
+ if (location.pathname === "/") {
+ return (
+
+ );
+ } else {
+ return null;
+ }
+ };
+
+ // input์ Focus๊ฐ ํด์ ๋๋ฉด isFocused์ false๋ฅผ 80ms๋ค์ ์ ๋ฌ
+ const handleInputBlur = () => {
+ setTimeout(() => {
+ setIsFocused(false);
+ }, 250);
+ };
+
+ // input์ Focus๊ฐ ๋๋ฉด isFocused์ true๋ฅผ ์ ๋ฌ
+ const handleInputFocus = () => {
+ setIsFocused(true);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ {inputText.length > 0 && isFocused && (
+
+ )}
+
+
+
+ {isAdmin && (
+
+ ๊ด๋ฆฌ์ ํ์ด์ง
+
+ )}
+ {username ? (
+ <>
+
+ {username}
+
+
+ |
+ ๋ก๊ทธ์์
+ >
+ ) : (
+ <>
+ ๋ก๊ทธ์ธ
+ |
+ ํ์๊ฐ์
+ >
+ )}
+
+
+
+
+
+
+
+
+
+
+ {userImg ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+ {getSubHeader()}
+ >
+ );
+}
+
+const HeaderContainer = styled.header`
+ display: flex;
+ height: 9.375rem;
+ align-items: center;
+ justify-content: center;
+ background-color: #ff6214;
+ border-bottom: 1px solid ${theme.colors.gray};
+`;
+
+const HeaderWrapper = styled.div`
+ width: 75rem;
+ height: 5rem;
+ display: flex;
+ max-width: 75rem;
+ position: relative;
+ align-items: center;
+ justify-content: space-between;
+`;
+
+const Logo = styled(Link)`
+ width: 30%;
+`;
+
+const Search = styled.div`
+ display: flex;
+ transition: 0.1s;
+ position: relative;
+ border-radius: 0.625rem;
+ justify-content: center;
+ svg {
+ right: 0.75rem;
+ cursor: pointer;
+ position: absolute;
+ font-size: 1.75rem;
+ font-size: 1.75rem;
+ top: calc((3rem - 1.8rem) / 2);
+ color: ${theme.colors.orange.main};
+ }
+ &:hover {
+ box-shadow: 0px 3px 10px 3px #00000030;
+ }
+`;
+
+const SearchInput = styled.input`
+ border: none;
+ height: 3rem;
+ width: 26.25rem;
+ font-size: 18px;
+ padding-left: 1rem;
+ border-radius: 0.625rem;
+ &:focus {
+ outline: none;
+ box-shadow: 0px 2px 10px 2px #00000046;
+ }
+`;
+
+const User = styled.div`
+ width: 30%;
+ height: 66px;
+ display: flex;
+ flex-direction: column;
+`;
+
+const Auth = styled.div`
+ gap: 1.25rem;
+ display: flex;
+ justify-content: end;
+ color: ${theme.colors.white};
+ h2 {
+ transition: 0.1s;
+ &:hover {
+ font-weight: 700;
+ color: ${theme.colors.orange.pressed};
+ }
+ }
+`;
+
+const AdminLink = styled(Link)`
+ width: 74px;
+ display: flex;
+ height: 15px;
+ font-size: 10px;
+ font-weight: 700;
+ transition: 0.1s;
+ align-items: center;
+ border-radius: 1.25rem;
+ justify-content: center;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.white};
+ background-color: ${theme.colors.white};
+ &:hover {
+ h2 {
+ color: ${theme.colors.white};
+ }
+ color: ${theme.colors.white};
+ border: 1px solid ${theme.colors.orange.pressed};
+ background-color: ${theme.colors.orange.pressed};
+ transform: scale(1.02);
+ }
+`;
+
+const LogoutBtn = styled.button`
+ padding: 0;
+ border: none;
+ height: 1rem;
+ cursor: pointer;
+ font-size: 16px;
+ line-height: 12px;
+ background: none;
+ transition: 0.1s;
+ color: ${theme.colors.white};
+ &:hover {
+ font-weight: 700;
+ color: ${theme.colors.orange.pressed};
+ }
+`;
+
+const LinkWrapper = styled.div`
+ gap: 1rem;
+ display: flex;
+ margin-top: 1.25rem;
+ align-items: center;
+ justify-content: end;
+ > a {
+ margin: auto 0;
+ font-size: 30px;
+ > svg {
+ font-size: 24px;
+ transition: 0.1s;
+ margin-top: 10px;
+ margin-right: 6px;
+ color: ${theme.colors.white};
+ &:hover {
+ transform: scale(1.2);
+ color: ${theme.colors.orange.pressed};
+ }
+ }
+ }
+`;
+
+const UserImg = styled.div`
+ width: 40px;
+ height: 40px;
+ display: flex;
+ transition: 0.1s;
+ border-radius: 100%;
+ background-color: ${theme.colors.white};
+ img {
+ border-radius: 100%;
+ }
+ &:hover {
+ transform: scale(1.1);
+ box-shadow: 0px 2px 6px 2px #00000046;
+ }
+`;
+
+export default Header;
diff --git a/src/components/common/Loading.tsx b/src/components/common/Loading.tsx
new file mode 100644
index 00000000..98f39a97
--- /dev/null
+++ b/src/components/common/Loading.tsx
@@ -0,0 +1,34 @@
+import { BounceLoader } from "react-spinners";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+
+function Loading() {
+ return (
+
+
+ ๋ก๋ฉ ์ค...
+
+ );
+}
+
+const Wrapper = styled.div`
+ width: 100%;
+ height: 100vh;
+ background: ${theme.colors.orange.main};
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ gap: 20px;
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 99999;
+ span {
+ font-size: 20px;
+ font-weight: 700;
+ color: #fff;
+ }
+`;
+
+export default Loading;
diff --git a/src/components/common/SubHeader.tsx b/src/components/common/SubHeader.tsx
new file mode 100644
index 00000000..859766a0
--- /dev/null
+++ b/src/components/common/SubHeader.tsx
@@ -0,0 +1,78 @@
+import Tag from "./Tag";
+import styled from "styled-components";
+import Banner from "../main/MainBanner";
+import { theme } from "../../styles/theme";
+
+const tags = [
+ { key: 0, tag: "ALL" },
+ { key: 1, tag: "#ํ์๊ณ ๋ถ๋์ฐ" },
+ { key: 2, tag: "#์ฌ๊ฑด์ ์งํ์ " },
+ { key: 3, tag: "#์ฐ์ฃผ๋ณต" },
+ { key: 4, tag: "#์ฐ์ฃผ ์๋" },
+ { key: 5, tag: "#์ฐ์ฃผ์ " },
+ { key: 6, tag: "#ํน๊ฐ ์ํ" },
+];
+
+interface ISubHeaderProps {
+ clickedTag: string;
+ clickTagHandler: (tag: string) => void;
+}
+
+// Tag ์ปดํฌ๋ํธ์ selected์ ์ ํ ์ฌ๋ถ๋ฅผ boolean์ผ๋ก ์ ๋ฌ
+// ํ๊ทธ๊ฐ ์ ํ๋๊ฑฐ๋, ๊ฒ์์ฐฝ์ ๊ฒ์์ด๋ฅผ ์
๋ ฅ ์, Banner๋ฅผ ์ถ๋ ฅํ์ง ์๋๋ค.
+function SubHeader({ clickedTag, clickTagHandler }: ISubHeaderProps) {
+ return (
+ <>
+
+
+
+ {tags.map((value) => (
+ clickTagHandler(value.tag)}
+ >
+ {value.tag}
+
+ ))}
+
+
+
+ {clickedTag.length > 0 ? "" : }
+ >
+ );
+}
+
+const TagContainer = styled.div`
+ width: 100%;
+ display: flex;
+ height: 7.5rem;
+ justify-content: center;
+ background: linear-gradient(
+ ${theme.colors.orange.main},
+ ${theme.colors.orange.linear}
+ );
+`;
+
+const TagBG = styled.div`
+ width: 100%;
+ display: flex;
+ background-size: auto;
+ justify-content: center;
+ background-repeat: no-repeat;
+ background-position: center bottom;
+ background-image: url("/images/TagMenuImage.svg");
+`;
+
+const TagWrapper = styled.div`
+ margin-bottom: 20px;
+ display: flex;
+ width: 1088px;
+ max-width: 1088px;
+ align-items: center;
+ justify-content: space-between;
+ > div {
+ }
+`;
+
+export default SubHeader;
diff --git a/src/components/common/SubLoading.tsx b/src/components/common/SubLoading.tsx
new file mode 100644
index 00000000..1ccad91f
--- /dev/null
+++ b/src/components/common/SubLoading.tsx
@@ -0,0 +1,51 @@
+import styled, { keyframes } from "styled-components";
+import { theme } from "../../styles/theme";
+
+function SubLoading() {
+ return (
+
+
+
+ ๋ก๋ฉ ์ค...
+
+
+ );
+}
+
+const flyAnimation = keyframes`
+ 0% {
+ transform: translate(0, 40%);
+ }
+ 100% {
+ transform: translate(0, -20%);
+ }
+`;
+
+const Box = styled.div`
+ margin: 180px auto;
+ width: 200px;
+ height: 200px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ img {
+ margin: auto;
+ animation: ${flyAnimation} 1.5s ease-out infinite;
+ }
+ div {
+ width: 0 auto;
+ font-family: "GmarketSans";
+ color: ${theme.colors.orange.main};
+ font-size: 1.25rem;
+ font-weight: 700;
+ justify-content: center;
+ display: flex;
+ }
+`
+
+const StyledSpinner = styled.div`
+ width: 100%;
+ height: 80%;
+`;
+
+export default SubLoading;
diff --git a/src/components/common/Tag.tsx b/src/components/common/Tag.tsx
new file mode 100644
index 00000000..3d75f874
--- /dev/null
+++ b/src/components/common/Tag.tsx
@@ -0,0 +1,56 @@
+import { useState } from "react";
+import styled, { css } from "styled-components";
+import { theme } from "../../styles/theme";
+
+interface ITagProps {
+ [props: string]: any;
+}
+
+function Tag({ ...props }: ITagProps) {
+ const [isSelected, setSelected] = useState(false);
+
+ // Tag ํ ๊ธํ
+ const handleClick = () => {
+ setSelected((prevState) => !prevState);
+ };
+
+ return (
+
+ );
+}
+
+const StyledTag = styled.button<{
+selected: boolean;
+}>`
+ display: flex;
+ height: 2.5rem;
+ cursor: pointer;
+ font-size: 18px;
+ transition: 0.1s;
+ background: none;
+ align-items: center;
+ box-sizing: border-box;
+ border-radius: 1.25rem;
+ justify-content: center;
+ color: ${theme.colors.white};
+ padding: 16px 26px 16px 26px;
+ border: 1.5px solid ${theme.colors.white};
+ &:hover{
+ transform: scale(1.04);
+ background-color: ${theme.colors.orange.pressed};
+ border: 1.5px solid ${theme.colors.orange.pressed};
+ }
+ ${(props) =>
+ props.selected &&
+ css`
+ background-color: ${props.theme.colors.orange.pressed};
+ border: 1.5px solid ${props.theme.colors.orange.pressed};
+ `}
+`;
+
+export default Tag;
diff --git a/src/components/main/Card/MainSearchedCard.tsx b/src/components/main/Card/MainSearchedCard.tsx
new file mode 100644
index 00000000..8221ce55
--- /dev/null
+++ b/src/components/main/Card/MainSearchedCard.tsx
@@ -0,0 +1,124 @@
+// Tagged-Components์ ๊ณต์ฉ ์ปดํฌ๋ํธ
+
+import styled from "styled-components";
+import { IProduct } from "../../../lib/API/adminAPI";
+import { formatDollar } from "../../../lib/Function/commonFn";
+import { Link } from "react-router-dom";
+
+interface ISearchedCard {
+ list: IProduct[];
+}
+
+// ๊ฒ์ ๊ฒฐ๊ณผ (list)๊ฐ ์์ ๋(length > 0)์ ์์ ๋๋ฅผ ๊ตฌ๋ถํ์ฌ ์กฐ๊ฑด๋ถ ์ถ๋ ฅ
+function MainSearchedCard({ list }: ISearchedCard) {
+ return (
+
+
+ {list.length > 0 &&
+ list.map((item) => (
+
+
+
+
+ {item.title}
+
+
+ {formatDollar(item.price)}
+ {item.discountRate !== 0 && (
+ {item.discountRate}% ํ ์ธ์ค!
+ )}
+
+
+
+ ))}
+
+
+ );
+}
+
+const Container = styled.div`
+ z-index: 2;
+ top: 3.3rem;
+ position: absolute;
+ width: 420px;
+ padding: 5px 0px 10px 0px;
+ border-radius: 10px;
+`;
+
+const Wrapper = styled.div`
+ display: flex;
+ max-width: 1200px;
+ flex-direction: column;
+`;
+
+const SearchList = styled.div`
+ width: 100%;
+ margin: 3px 0;
+ padding: 10px;
+ display: flex;
+ transition: 0.1s;
+ align-items: center;
+ border-radius: 10px;
+ justify-content: space-between;
+ box-shadow: 0px 0px 8px 1px #00000035;
+ background-color: ${(props) => props.theme.colors.white};
+ &:hover {
+ background-color: ${(props) => props.theme.colors.gray[2]};
+ transform: scale(0.99);
+ box-shadow: 0px 0px 4px 0px #00000022;
+ }
+`;
+
+const WrapperLeft = styled.div`
+ display: flex;
+ gap: 1.25rem;
+`;
+
+const ItemTitle = styled.div`
+ display: flex;
+ align-items: center;
+ font-weight: 700;
+`;
+
+const WrapperRight = styled.div`
+ gap: 5px;
+ display: flex;
+ align-items: end;
+ flex-direction: column;
+ span:first-child {
+ font-size: 18px;
+ }
+`;
+
+const Discount = styled.span`
+ color: ${(props) => props.theme.colors.orange.main};
+ font-size: 14px;
+`;
+
+const TumbnailImg = styled.img`
+ width: 50px;
+ height: 50px;
+ border-radius: 10px;
+`;
+
+// const NoList = styled.div`
+// display: flex;
+// width: 100%;
+// justify-content: center;
+// align-items: center;
+// font-size: 2rem;
+// margin-top: 5rem;
+// flex-direction: column;
+// `;
+
+// const Rank = styled.div`
+// margin-top: 2rem;
+
+// > span {
+// display: inline-block;
+// padding-top: 2rem;
+// border-bottom: 8px solid ${theme.colors.orange.main};
+// }
+// `;
+
+export default MainSearchedCard;
diff --git a/src/components/main/Card/MainTaggedCard.tsx b/src/components/main/Card/MainTaggedCard.tsx
new file mode 100644
index 00000000..2aa26582
--- /dev/null
+++ b/src/components/main/Card/MainTaggedCard.tsx
@@ -0,0 +1,101 @@
+// Tagged-Components์ ๊ณต์ฉ ์ปดํฌ๋ํธ
+
+import styled from "styled-components";
+import { theme } from "../../../styles/theme";
+import { IProduct } from "../../../lib/API/adminAPI";
+import MainCommet from "../MainItem";
+import SubLoading from "../../common/SubLoading";
+
+interface ITaggedCard {
+ isFetching: boolean;
+ title: string;
+ list: IProduct[];
+}
+
+// ๊ฒ์ ๊ฒฐ๊ณผ (list)๊ฐ ์์ ๋(length > 0)์ ์์ ๋๋ฅผ ๊ตฌ๋ถํ์ฌ ์กฐ๊ฑด๋ถ ์ถ๋ ฅ
+function MainTaggedCard({ isFetching, title, list }: ITaggedCard) {
+ return (
+
+
+
+ {title}
+
+ {isFetching ? (
+
+ ) : (
+
+ {list.map((item) => (
+
+ ))}
+
+ )}
+
+ );
+}
+
+const Container = styled.div``;
+
+const Title = styled.h1`
+ font-size: 46px;
+ display: flex;
+ font-weight: bold;
+ font-family: "GmarketSans";
+ color: ${theme.colors.black};
+ div {
+ width: 8px;
+ height: 43px;
+ display: flex;
+ margin-right: 10px;
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+// const NoList = styled.div`
+// display: flex;
+// width: 100%;
+// justify-content: center;
+// align-items: center;
+// font-size: 2rem;
+// margin-top: 5rem;
+// flex-direction: column;
+// `;
+
+// const Rank = styled.div`
+// margin-top: 2rem;
+
+// > span {
+// display: inline-block;
+// padding-top: 2rem;
+// border-bottom: 8px solid ${theme.colors.orange.main};
+// }
+// `;
+
+const Wrapper = styled.div`
+ display: flex;
+ max-width: 1200px;
+ flex-wrap: wrap;
+
+ > a {
+ margin-top: 3.5rem;
+ margin-right: 16px;
+ }
+
+ > a:nth-child(4n + 0) {
+ margin-right: 0;
+ }
+`;
+
+// const NoAnswer = styled.div`
+// width: 100%;
+// text-align: center;
+// `;
+
+export default MainTaggedCard;
diff --git a/src/components/main/MainBanner.tsx b/src/components/main/MainBanner.tsx
new file mode 100644
index 00000000..66d8466a
--- /dev/null
+++ b/src/components/main/MainBanner.tsx
@@ -0,0 +1,95 @@
+import styled from "styled-components";
+import Carousel from "../common/Carousel";
+import { theme } from "../../styles/theme";
+import { useNavigate } from "react-router-dom";
+
+function Banner() {
+ const navigate = useNavigate();
+
+ // ๋ฌ ๋ถ์ ๋ฐฐ๋
+ const onToTheMoon = () => {
+ navigate("/product/6ENwqwRTuR0GV5X22nTm");
+ };
+ // ์ด๊ด์ ํ๋ฐฐ ๋ฐฐ๋
+ const onToDelivery = () => {
+ navigate("/product/NwRt7wwheSKJl4YH7b0f");
+ };
+ // ํ์ฑ ํฌ์คํ
์ดํธ ๋ฐฐ๋
+ const onToTheMars = () => {
+ navigate("/product/6wfO1el9sgHaB8PsDX3J");
+ };
+
+ return (
+
+
+
+
+
+
+
+ );
+}
+
+const Container = styled.div`
+ width: 100vw;
+ display: flex;
+ color: white;
+ text-align: center;
+ align-items: center;
+ justify-content: center;
+ background-color: ${theme.colors.black};
+
+ .slick-slider {
+ width: 1250px;
+ }
+
+ .slick-list {
+ }
+
+ .slick-dots {
+ position: absolute;
+ bottom: 12px;
+ }
+
+ .slick-arrow {
+ width: 5rem;
+ height: 4rem;
+ top: 210px;
+ }
+
+ .slick-prev {
+ opacity: 0;
+ transition: 0.2s;
+ &:hover {
+ opacity: 0.6;
+ }
+ }
+
+ .slick-next {
+ opacity: 0;
+ transition: 0.2s;
+ right: -68px;
+ &:hover {
+ opacity: 0.6;
+ }
+ }
+`;
+
+const Image = styled.img`
+ vertical-align: bottom;
+ cursor: pointer;
+`;
+
+export default Banner;
diff --git a/src/components/main/MainBuyBtn.tsx b/src/components/main/MainBuyBtn.tsx
new file mode 100644
index 00000000..3369cb9a
--- /dev/null
+++ b/src/components/main/MainBuyBtn.tsx
@@ -0,0 +1,64 @@
+// ์ ํ ์์ธํ์ด์ง - ๊ตฌ๋งคํ๊ธฐ ๋ฒํผ ์ปดํฌ๋ํธ
+
+import { useDispatch } from "react-redux";
+import { IProduct } from "../../lib/API/adminAPI";
+import { productDetail } from "../../lib/API/commonAPI";
+import Button from "../common/Button";
+import { useNavigate, useParams } from "react-router-dom";
+import { buyItem } from "../../modules/buyItem";
+
+interface IBuyBtn {
+ quantity: number;
+}
+
+function MainBuyBtn({ quantity }: IBuyBtn) {
+ const { id } = useParams<{ id: string }>();
+ const navigate = useNavigate();
+ const dispatch = useDispatch();
+
+ // id๊ฐ ๊ธฐ๋ฐ์ผ๋ก ๋จ์ผ ์ ํ ์์ธ ์กฐํ
+ const findProduct = async () => {
+ if (id) {
+ const product = await productDetail(id);
+ return product;
+ }
+ return null;
+ };
+
+ const postBuy = (item: IProduct) => {
+ // payment action dispatch
+ dispatch(
+ // payment ์ก์
๊ฐ์ฒด๋ฅผ Redux store์ ์ ๋ฌ๋์ด ์ํ ์
๋ฐ์ดํธ
+ buyItem({
+ productId: item.id as string,
+ title: item.title as string,
+ quantity: quantity,
+ price: item.price,
+ discountRate: item.discountRate as number,
+ }),
+ );
+ };
+
+ const onBuy = async (event: React.MouseEvent) => {
+ event.preventDefault();
+
+ const item = await findProduct();
+ if (item) postBuy(item);
+
+ navigate("/payment");
+ };
+
+ return (
+
+ );
+}
+
+export default MainBuyBtn;
diff --git a/src/components/main/MainCartBtn.tsx b/src/components/main/MainCartBtn.tsx
new file mode 100644
index 00000000..23faf795
--- /dev/null
+++ b/src/components/main/MainCartBtn.tsx
@@ -0,0 +1,90 @@
+import { productDetail } from "../../lib/API/commonAPI";
+import { useParams, useNavigate } from "react-router-dom";
+import { IProductEdit } from "../../lib/API/adminAPI";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+// ์ธํฐํ์ด์ค ์ ์ธ
+interface ICartBtn {
+ quantity: number;
+}
+
+function MainCartBtn({ quantity }: ICartBtn) {
+ // ๋ฐ์ดํฐ ์กฐํ
+ const queryClient = useQueryClient();
+ // ๋ฐ์ดํฐ ์ ์ฅ
+ const res = queryClient.getQueryData("check");
+ // URL๋ก๋ถํฐ ํ์ฌ product์ id๊ฐ ๋์ถ
+ const { id } = useParams<{ id: string }>();
+ const navigate = useNavigate();
+
+ const findProduct = async () => {
+ // ์ ํจํ prdocut์ผ ๊ฒฝ์ฐ
+ if (id) {
+ // ๋จ์ผ ์ ํ ์์ธ ์กฐํ
+ const product: IProductEdit = await productDetail(id);
+ // ๋ค์์ ์ ํ์ ๋ด์์ ๊ฒฝ์ฐ
+ const products: IProductEdit[] = Array(quantity).fill(product);
+ return products;
+ }
+ return null;
+ };
+
+ const postCart = async (updatedCarts: IProductEdit[]) => {
+ // ๊ธฐ์กด์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ product
+ if (res) {
+ const getCartItems = localStorage.getItem(`cart_${res.email}`);
+ let cartItems: IProductEdit[] = [];
+
+ // ํ์ฑ
+ if (getCartItems) {
+ cartItems = JSON.parse(getCartItems);
+ }
+
+ // props๋ก ๋ฐ์ ์ํ๋ค์ push
+ if (cartItems) {
+ cartItems.push(...updatedCarts);
+ }
+
+ // localStorage์ ์ ์ฅ(set)
+ localStorage.setItem(`cart_${res.email}`, JSON.stringify(cartItems));
+ }
+ };
+
+ // ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ ๋ง์ฐ์ค ์ด๋ฒคํธ ํจ์
+ const onCart = async (event: React.MouseEvent) => {
+ event.preventDefault();
+
+ const item = await findProduct();
+ if (item) {
+ // postCart() ์คํ
+ postCart(item);
+ }
+
+ // 2. ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ ํ, CartPage๋ก ์ด๋ํ ์ง์ ๋ํ ์ฌ๋ถ
+ const confirm = window.confirm(
+ "์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ๋ด์์ต๋๋ค. ์ฅ๋ฐ๊ตฌ๋๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?",
+ );
+
+ if (confirm) {
+ navigate("/cart");
+ } else {
+ }
+ };
+
+ return (
+
+ );
+}
+
+export default MainCartBtn;
+
+// ์ฒ์์ Link๋ฅผ ํตํด ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ฅผ ์ด๋์์ผฐ์ผ๋, ๋ก์ปฌ์คํ ๋ฆฌ์ง์ postํ๊ธฐ ์ ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋๋์ด
+// ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ๋์ฐฉํ์ ๋, ์์ง ๋ก์ปฌ ์คํ ๋ฆฌ์ง๊ฐ ๋น์ด์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
+// useNavigator๋ฅผ ํตํด, ์คํ ๋ฆฌ์ง์ ์ ์ฅ์ด ์๋ฃ๋๋ฉด ๊ทธ ๋ค๋ก navigate๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๋ ์์ผ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋ค.
diff --git a/src/components/main/MainCartList.tsx b/src/components/main/MainCartList.tsx
new file mode 100644
index 00000000..32194284
--- /dev/null
+++ b/src/components/main/MainCartList.tsx
@@ -0,0 +1,274 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import { Dispatch, SetStateAction, useEffect, useState } from "react";
+import { IProduct } from "../../lib/API/adminAPI";
+import MainCartListBtn from "./MainCartListBtn";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { useDispatch } from "react-redux";
+import { setQuantity } from "../../modules/cartItem";
+import Button from "../common/Button";
+import { BsCheckLg } from "react-icons/bs";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+
+interface IsetisChecked {
+ isChecked: boolean;
+ setIsChecked: Dispatch>;
+}
+
+function MainCartList({ isChecked, setIsChecked }: IsetisChecked) {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ const dispatch = useDispatch();
+ const [carts, setCarts] = useState([]);
+ const [checkedIds, setCheckedIds] = useState([]);
+ const [isDeleted, setIsDeleted] = useState(false);
+
+ // ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ด ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก ์กฐํ ๋ฐ ์ฅ๋ฐ๊ตฌ๋ ๋ด ์ํ ์ ๋ณด dispatch
+ useEffect(() => {
+ getCart();
+ }, []);
+
+ useEffect(() => {
+ if (checkedIds.length) {
+ setIsChecked(true);
+ } else {
+ setIsChecked(false);
+ }
+ }, [checkedIds]);
+
+ const getCart = async () => {
+ // ์ธ์ฆ ํ์ธ
+ if (res) {
+ // ๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก GET
+ const getCartItems = localStorage.getItem(`cart_${res.email}`);
+ const prevCartItems = JSON.stringify(carts);
+
+ // ์ฅ๋ฐ๊ตฌ๋ ๋ด ์ํ์ด ์๋ค๋ฉด
+ if (getCartItems && getCartItems !== prevCartItems) {
+ // JSON ํ์ฑ
+ const cartItems: IProduct[] = JSON.parse(getCartItems);
+
+ // carts state Update
+ setCarts(cartItems);
+
+ // ์๋ ๊ณ์ฐ
+ const amount: { [title: string]: number } = {}; // ๊ฐ์ฒด ์์ฑ
+ cartItems.forEach((item) => {
+ // item ๊ฐ์ฒด์ title ์์ฑ์ ๋ณ์์ ํ ๋น
+ const { title } = item;
+ // amount ๊ฐ์ฒด์ ํด๋น title ์์ฑ์ด ์กด์ฌํ๋ ์ง์ ๋ฐ๋ผ ์๋ ํ ๋น
+ amount[title as string]
+ ? (amount[title as string] += 1)
+ : (amount[title as string] = 1);
+ });
+
+ // ์๋์ ๋ง๊ฒ state์ dispatch
+ Object.entries(amount).forEach(([title, quantity]) => {
+ // [key, value] - [title, quantity]
+ const cartItem = cartItems.find((item) => item.title === title);
+ if (cartItem) {
+ const { id } = cartItem;
+ dispatch(
+ setQuantity({
+ productId: id as string,
+ title: title as string,
+ quantity: quantity,
+ price:
+ cartItems.find((item) => item.title === title)?.price || 0,
+ discountRate:
+ cartItems.find((item) => item.title === title)
+ ?.discountRate || 0,
+ }),
+ );
+ }
+ });
+ } else if (!prevCartItems) {
+ // ์ํ์ด ์๋ ๊ฒฝ์ฐ ๋น ๋ฐฐ์ด
+ setCarts([]);
+ }
+ }
+ };
+ if (isDeleted) {
+ getCart();
+ }
+
+ // new Set ๋ฉ์๋๋ก ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ์ํ์ id๋ง ์ถ์ถํ ๋ฐฐ์ด ์ ์ธ
+ // ์ถํ์, ๊ธฐ์กด์ carts์ ๋น๊ต(filtering)ํ์ฌ ์ํ์ ๊ฐ์๋ฅผ ๊ณ์ฐ
+ const settedCart = Array.isArray(carts)
+ ? Array.from(new Set(carts.map((cart) => cart.id)))
+ : [];
+
+ // ์ ํ๋ ์ํ์ ์ผ๊ด ์ญ์
+ const deleteChecked = async () => {
+ if (checkedIds.length) {
+ const confirm = window.confirm("์ ํํ ์ํ์ ์ญ์ ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ const updatedCarts = carts.filter(
+ (cart) => !checkedIds.includes(cart.id as string),
+ );
+ if (res) {
+ localStorage.setItem(
+ `cart_${res.email}`,
+ JSON.stringify(updatedCarts),
+ );
+ }
+ }
+ window.location.reload();
+ getCart();
+ }
+ };
+
+ // check ์ฌ๋ถ๋ฅผ ํ์ธ ํ ํด๋น ์ํ์ id๋ฅผ checkedIds ๋ฐฐ์ด์ ์ ์ฅ
+ const onCheck = (event: React.ChangeEvent, id: string) => {
+ const { checked } = event.target;
+ if (checked) {
+ setCheckedIds((prev) => [...prev, id]);
+ } else {
+ setCheckedIds((prev) => prev.filter((item) => item !== id));
+ }
+ };
+ console.log(checkedIds);
+
+ return (
+
+ );
+}
+
+const Ul = styled.ul`
+ gap: 20px;
+ display: flex;
+ list-style: none;
+ flex-direction: column;
+
+ > li {
+ width: 100%;
+ height: 120px;
+ display: flex;
+ padding: 0 2rem;
+ transition: 0.1s;
+ border-radius: 5px;
+ align-items: center;
+ justify-content: space-between;
+ border: 1px solid ${theme.colors.gray[7]};
+ :hover{
+ transform: scale(0.99);
+ background-color: ${theme.colors.gray[2]};
+ }
+
+ input {
+ display: none;
+ }
+
+ label {
+ cursor: pointer;
+ }
+
+ .checkLg {
+ color: ${theme.colors.gray[3]};
+ &:hover {
+ color: white;
+ }
+ }
+
+ input:checked + label {
+ background-color: ${theme.colors.orange.main};
+ border: 1px solid ${(props) => props.theme.colors.orange.main};
+ .checkLg {
+ color: ${theme.colors.white};
+ }
+ }
+ > img {
+ width: 80px;
+ height: 80px;
+ margin-left: 30px;
+ border-radius: 5px;
+ }
+ }
+`;
+
+const CheckCircle = styled.label`
+ width: 20px;
+ display: flex;
+ height: 20px;
+ transition: 0.1s;
+ border-radius: 50%;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid ${(props) => props.theme.colors.gray[3]};
+ &:hover {
+ background-color: ${theme.colors.orange.main};
+ border: 1px solid ${(props) => props.theme.colors.orange.main};
+ }
+ svg {
+ font-size: 15px;
+ margin-right: 1px;
+ }
+`;
+
+const SelectDelete = styled(Button)`
+ width: 5rem;
+ height: 2.5rem;
+ align-self: end;
+ margin-top: 10px;
+ font-weight: 700;
+ &:hover {
+ background-color: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+const Title = styled.div`
+ margin-left: 20px;
+ font-size: 20px;
+ font-weight: 700;
+ width: 275px;
+`;
+
+export default MainCartList;
diff --git a/src/components/main/MainCartListBtn.tsx b/src/components/main/MainCartListBtn.tsx
new file mode 100644
index 00000000..da62d6d8
--- /dev/null
+++ b/src/components/main/MainCartListBtn.tsx
@@ -0,0 +1,236 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import Button from "../common/Button";
+import styled from "styled-components";
+import { useDispatch } from "react-redux";
+import { theme } from "../../styles/theme";
+import { check } from "../../lib/API/userAPI";
+import { setQuantity } from "../../modules/cartItem";
+import { IProductEdit } from "../../lib/API/adminAPI";
+import { productDetail } from "../../lib/API/commonAPI";
+import { formatDollar } from "../../lib/Function/commonFn";
+import { AiFillMinusCircle, AiFillPlusCircle } from "react-icons/ai";
+import { useState, useEffect, Dispatch, SetStateAction } from "react";
+
+interface ICartListBtnProps {
+ id?: string;
+ quantity: number;
+ price: number;
+ title?: string;
+ setIsDeleted: Dispatch>;
+ discountRate?: number;
+}
+
+function MainCartListBtn({
+ id,
+ quantity,
+ price,
+ title,
+ setIsDeleted,
+ discountRate,
+}: ICartListBtnProps) {
+ // dispatch ์ ์ธ
+ const dispatch = useDispatch();
+
+ // props๋ก ๋ฐ์ ์๋์ state์ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ
+ let [itemQty, setItemQty] = useState(quantity);
+
+ // ์ต์ด ๋ ๋๋ง ์, ์ฅ๋ฐ๊ตฌ๋ ๋ด ์ํ๋ค์ Id-์๋์ dispatch
+ useEffect(() => {
+ const fetchItem = async () => {
+ const item = await findProduct();
+
+ if (item && title && price && discountRate && id) {
+ dispatch(
+ setQuantity({
+ productId: id,
+ title: title,
+ quantity: itemQty,
+ price: price,
+ discountRate: discountRate,
+ }),
+ );
+ }
+ };
+ fetchItem();
+ }, [itemQty]);
+
+ // ๋จ์ผ ์ ํ ์์ธ ์กฐํ ํจ์
+ const findProduct = async () => {
+ // ์ ํจํ prdocut์ผ ๊ฒฝ์ฐ
+ if (id) {
+ // ๋จ์ผ ์ ํ ์์ธ ์กฐํ
+ const product: IProductEdit[] = await productDetail(id);
+ return product;
+ }
+ return null;
+ };
+
+ // LocalStorage์ ์ฅ๋ฐ๊ตฌ๋ ์ํ์ post
+ const increaseItem = async (updatedCarts: IProductEdit[]) => {
+ const res = await check();
+
+ // ๊ธฐ์กด์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ product get
+ const existingCart = localStorage.getItem(`cart_${res.email}`);
+
+ // cartItems ๋ฐฐ์ด ์ ์ธ
+ let cartItems: IProductEdit[] = [];
+
+ if (existingCart) {
+ cartItems = JSON.parse(existingCart);
+ }
+
+ // ๊ธฐ์กด์ product ๋ฐฐ์ด์ updatedCarts ๋ฐฐ์ด concat
+ const newCartItems = cartItems.concat(updatedCarts);
+
+ // localStorage์ ์ ์ฅ(set)
+ localStorage.setItem(`cart_${res.email}`, JSON.stringify(newCartItems));
+ setItemQty((prevQuantity) => prevQuantity + 1);
+ };
+
+ // LocalStorage์ ์ฅ๋ฐ๊ตฌ๋ ์ํ์ decrease
+ const decreaseItem = async (id: string) => {
+ const res = await check();
+
+ // ๊ธฐ์กด์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ product get
+ const existingCart = localStorage.getItem(`cart_${res.email}`);
+
+ // cartItems ๋ฐฐ์ด ์ ์ธ
+ let cartItems: IProductEdit[] = [];
+
+ if (existingCart) {
+ cartItems = JSON.parse(existingCart);
+ }
+
+ // ๊ฐ์ํ๊ณ ์ ํ๋ item์ id๊ฐ๊ณผ ์ฅ๋ฐ๊ตฌ๋ ๋ด id๊ฐ์ ๋น๊ตํ์ฌ id๊ฐ ์ถ์ถ
+ const decreasedIdx = cartItems.findIndex((item) => item.id === id);
+
+ if (decreasedIdx !== -1) {
+ // ์๋์ด 1 ์ด์์ผ ๋๋ง ๊ฐ์ ์ฒ๋ฆฌ
+ if (itemQty > 0) {
+ // setItemQty((prevQuantity) => prevQuantity - 1);
+ cartItems.splice(decreasedIdx, 1);
+ setItemQty((prevQuantity) => prevQuantity - 1);
+ } else {
+ // ์๋์ด 1 ์ดํ์ผ ๊ฒฝ์ฐ ํด๋น ์ํ์ ์ฅ๋ฐ๊ตฌ๋์์ ์ ๊ฑฐ
+ setItemQty(0);
+ }
+ }
+
+ // localStorage์ ์ ์ฅ(set)
+ localStorage.setItem(`cart_${res.email}`, JSON.stringify(cartItems));
+ };
+
+ // ์ฅ๋ฐ๊ตฌ๋ ๋ด ํน์ ์ํ ์ผ๊ด ์ญ์
+ const removeItem = async (id: string) => {
+ const res = await check();
+
+ // ๊ธฐ์กด์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ product get
+ const existingCart = localStorage.getItem(`cart_${res.email}`);
+
+ // cartItems ๋ฐฐ์ด ์ ์ธ
+ let cartItems: IProductEdit[] = [];
+
+ if (existingCart) {
+ cartItems = JSON.parse(existingCart);
+ }
+
+ // ๊ฐ์ํ๊ณ ์ ํ๋ item์ id๊ฐ๊ณผ ์ฅ๋ฐ๊ตฌ๋ ๋ด id๊ฐ์ ๋น๊ตํ์ฌ id๊ฐ ์ถ์ถ
+ const removedIdx = cartItems.findIndex((item) => item.id === id);
+
+ if (removedIdx !== -1) {
+ // ์๋์ด 1 ์ด์์ผ ๋๋ง ์ญ์ ์ฒ๋ฆฌ
+ if (itemQty > 0) {
+ cartItems = cartItems.filter((item) => item.id !== id);
+ alert("์ํ์ด ์ญ์ ๋์์ต๋๋ค.");
+ setIsDeleted(true);
+ }
+ }
+ // localStorage์ ์ ์ฅ(set)
+ localStorage.setItem(`cart_${res.email}`, JSON.stringify(cartItems));
+ };
+
+ // ๊ตฌ๋งค ์๋ ์ฆ๊ฐ (increase product)
+ const onIncrease = async () => {
+ const item = await findProduct();
+ if (item && title && price && id) {
+ increaseItem(item);
+ dispatch(
+ setQuantity({
+ productId: id,
+ title: title,
+ quantity: itemQty + 1,
+ price: price,
+ discountRate: discountRate as number,
+ }),
+ );
+ }
+ };
+
+ // ๊ตฌ๋งค ์๋ ๊ฐ์ (decrease product)
+ const onDecrease = async () => {
+ if (id && title && itemQty > 1) {
+ decreaseItem(id);
+ dispatch(
+ setQuantity({
+ productId: id,
+ title: title,
+ quantity: itemQty - 1,
+ price: price,
+ discountRate: discountRate as number,
+ }),
+ );
+ }
+ };
+
+ const onRemove = async () => {
+ if (id) {
+ removeItem(id);
+ }
+ };
+
+ return (
+ <>
+
+ -
+ {itemQty}
+ +
+
+ ํฉ๊ณ ๊ธ์ก :{formatDollar(price * itemQty)}
+ ์ญ์
+ >
+ );
+}
+
+const ButtonWrapper = styled.div`
+ display: flex;
+ gap: 0.5rem;
+ align-items: center;
+ margin-right: 20px;
+ > p {
+ width: 2rem;
+ font-size: 18px;
+ text-align: center;
+ }
+ > svg {
+ cursor: pointer;
+ font-size: 20px;
+ transition: 0.1s;
+ color: ${theme.colors.gray[3]};
+ :hover {
+ color: ${theme.colors.orange.main};
+ }
+ }
+`;
+
+const Price = styled.span`
+ width: 200px;
+ margin-left: 20px;
+ span{
+ font-weight: 700;
+ margin-right: 5px;
+ }
+`;
+
+const Delete = styled(Button)``;
+
+export default MainCartListBtn;
diff --git a/src/components/main/MainCartOrder.tsx b/src/components/main/MainCartOrder.tsx
new file mode 100644
index 00000000..93766835
--- /dev/null
+++ b/src/components/main/MainCartOrder.tsx
@@ -0,0 +1,198 @@
+import { useSelector } from "react-redux";
+import { formatDollar } from "../../lib/Function/commonFn";
+import styled from "styled-components";
+import { TRootState } from "../../modules";
+import Button from "../common/Button";
+import { theme } from "../../styles/theme";
+import { useNavigate } from "react-router-dom";
+
+interface IChecked {
+ isChecked: boolean;
+}
+
+function MainCartOrder({ isChecked }: IChecked) {
+ const cartItem = useSelector((state: TRootState) => state.cartItem);
+ const navigate = useNavigate();
+
+ // ํ ์ธ ์ ๊ฐ๊ฒฉ
+ const orderPrice = cartItem.reduce(
+ (acc, item) => acc + item.price * item.quantity,
+ 0,
+ );
+
+ // ํ ์ธ ๊ฐ๊ฒฉ
+ const discountedPrice = cartItem.reduce(
+ (acc, item) => acc + item.price * (item.discountRate / 100) * item.quantity,
+ 0,
+ );
+
+ // ์ต์ข
๊ฐ๊ฒฉ
+ const totalPrice = orderPrice + 3000 - discountedPrice;
+
+ // ์ฃผ๋ฌธํ๊ธฐ ๋ฒํผ onClick ํจ์
+ const onClick = (event: React.MouseEvent) => {
+ event.preventDefault();
+ navigate("/payment");
+ };
+
+ return (
+
+
+
+ ๊ฒฐ์ ๊ธ์ก
+
+
+
+
+
+ ์ฃผ๋ฌธ ๊ธ์กA
+
+ {formatDollar(orderPrice)}
+
+
+
+ ํ ์ธ ๊ธ์กB
+
+ {formatDollar(discountedPrice)}
+
+
+
+ ๋ก์ผ๋ฐฐ์ก๋นC
+
+ {orderPrice > 0 ?
{formatDollar(3000)} : ""}
+
+
+
+
+
+ ์ด ๊ฒฐ์ ๊ธ์ก
+
+ A
+ -
+ B
+ +
+ C
+
+
+ {orderPrice > 0 ? {formatDollar(totalPrice)} : ""}
+
+
+
+
+
+
+ );
+}
+
+const AbcContainer = styled.div`
+ margin-left: 10px;
+ height: 20px;
+ display: inline-flex;
+ span {
+ margin: 0 4px;
+ font-size: 16px;
+ line-height: 20px;
+ }
+ div {
+ width: 20px;
+ height: 20px;
+ display: flex;
+ color: white;
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 22px;
+ border-radius: 50%;
+ justify-content: center;
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const Line = styled.div`
+ background-color: ${theme.colors.gray[7]};
+ height: 1px;
+`;
+
+const AbcItem = styled.div`
+ width: 16px;
+ height: 16px;
+ display: flex;
+ color: white;
+ font-size: 10px;
+ font-weight: 700;
+ margin-left: 10px;
+ line-height: 16px;
+ border-radius: 50%;
+ justify-content: center;
+ background-color: ${theme.colors.orange.main};
+`;
+
+const Container = styled.div`
+ width: 100%;
+`;
+
+const OrderWrapper = styled.div`
+ padding: 2rem 1rem;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+`;
+
+const PaymentPrice = styled.div`
+ margin-bottom: 1.5rem;
+ > span {
+ font-size: 28px;
+ font-weight: 700;
+ }
+`;
+
+const Calculator = styled.div`
+ gap: 1rem;
+ display: flex;
+ margin: 2rem 0;
+ flex-direction: column;
+
+ > span {
+ font-size: 20px;
+ }
+
+ > div {
+ display: flex;
+ justify-content: space-between;
+ span {
+ display: inline-flex;
+ }
+ span:first-child {
+ font-weight: 700;
+ }
+ }
+`;
+
+const TotalPrice = styled.div`
+ display: flex;
+ font-size: 20px;
+ margin-top: 2rem;
+ font-weight: 700;
+ align-items: center;
+ padding-bottom: 10px;
+ justify-content: space-between;
+ span:last-child {
+ padding-top: 10px;
+ color: ${theme.colors.orange.main};
+ }
+`;
+
+const ButtonWrapper = styled.div`
+ width: 100%;
+ > button {
+ width: 100%;
+ height: 3rem;
+ font-size: 18px;
+ margin-top: 1rem;
+ :hover {
+ background-color: ${theme.colors.orange.hover};
+ }
+ }
+`;
+
+export default MainCartOrder;
diff --git a/src/components/main/MainItem.tsx b/src/components/main/MainItem.tsx
new file mode 100644
index 00000000..33fecc76
--- /dev/null
+++ b/src/components/main/MainItem.tsx
@@ -0,0 +1,167 @@
+import styled, { css } from "styled-components";
+import { theme } from "../../styles/theme";
+import { Link } from "react-router-dom";
+import { formatDollar } from "../../lib/Function/commonFn";
+import { IoMdHeart, IoMdHeartEmpty } from "react-icons/io";
+import { IProductLike } from "../../lib/API/adminAPI";
+
+function MainCommet(props: IProductLike) {
+ const like = props.like;
+
+ const formatUnit = (tags: string[]) => {
+ if (tags) {
+ if (tags.includes("ํ์๊ณ") || tags.includes("์ฌ๊ฑด์ ์งํ์ ")) {
+ return "ํ๋น";
+ } else if (tags.includes("์ฐ์ฃผ๋ณต")) {
+ return "ํ ๋ฒ๋น";
+ } else if (tags.includes("์ฐ์ฃผ์ ")) {
+ return "ํ ๋๋น";
+ } else if (tags.includes("์ฐ์ฃผ ์ ๊ฑฐ์ฅ")) {
+ return "์๊ฐ ๋น";
+ } else {
+ return "๊ฐ๋น";
+ }
+ }
+ };
+
+ // ํ ์ธ๋ ๊ฐ๊ฒฉ (ํ ์ธ์จ ์กด์ฌ)
+ const discountedPrice =
+ props.price * (1 - (props.discountRate as number) / 100);
+
+ // ์ ๊ฐ
+ const fixedPrice = props.price;
+
+ return (
+ <>
+
+
+
+
+ {like ? : }
+
+
+ {props.title}
+ {(props.discountRate as number) > 0 ? (
+ {formatDollar(props.price)}
+ ) : (
+ ""
+ )}
+
+
+ {props.discountRate}%
+
+ {typeof props.tags === "object" ? formatUnit(props.tags) : ""}
+
+
+ {(props.discountRate as number) > 0
+ ? formatDollar(discountedPrice)
+ : formatDollar(fixedPrice)}
+
+
+
+
+
+ >
+ );
+}
+
+const Container = styled.div`
+ width: 275px;
+ transition: 0.1s;
+ &:hover{
+ transform: scale(0.98);
+ }
+`;
+
+const Commet = styled.div<{
+ selected: boolean;
+}>`
+ width: 275px;
+ height: 275px;
+ display: flex;
+ overflow: hidden;
+ position: relative;
+ align-items: center;
+ border-radius: 30px;
+ justify-content: center;
+ background-color: ${theme.colors.black};
+
+ > svg {
+ right: 13px;
+ bottom: 12px;
+ opacity: 0.3;
+ font-size: 24px;
+ position: absolute;
+ color: ${theme.colors.white};
+ }
+
+ > img {
+ width: 288px;
+ }
+
+ ${(props) =>
+ props.selected &&
+ css`
+ > svg {
+ opacity: 1;
+ color: ${theme.colors.pink};
+ }
+ `}
+`;
+
+const Desc = styled.div`
+ display: flex;
+ margin: 0 8px 0 8px;
+ flex-direction: column;
+`;
+
+const Title = styled.div`
+ font-size: 28px;
+ font-weight: 500;
+ margin-top: 10px;
+ font-family: 'GmarketSans';
+`;
+
+const PrevPrice = styled.div`
+ text-decoration: line-through;
+ color: ${theme.colors.gray[0]};
+ text-align: right;
+`;
+
+const Py = styled.div`
+ width: 100%;
+ font-size: 14px;
+ margin-top: 4px;
+ text-align: right;
+ margin-right: 10px;
+`;
+
+const PriceWrapper = styled.div`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+`;
+
+const Discount = styled.div`
+ display: flex;
+ font-size: 2rem;
+ align-items: end;
+ padding-top: 5px;
+ letter-spacing: -3px;
+ color: ${theme.colors.orange.main};
+ div {
+ font-size: 16px;
+ font-weight: 700;
+ padding-left: 4px;
+ padding-bottom: 5px;
+ }
+`;
+
+const Price = styled.div`
+ font-size: 24px;
+ margin-top: 4px;
+ font-weight: 700;
+ letter-spacing: -1px;
+`;
+
+export default MainCommet;
diff --git a/src/components/main/MainPackage.tsx b/src/components/main/MainPackage.tsx
new file mode 100644
index 00000000..b89022c8
--- /dev/null
+++ b/src/components/main/MainPackage.tsx
@@ -0,0 +1,77 @@
+import styled from "styled-components";
+import { useNavigate } from "react-router-dom";
+import { theme } from "../../styles/theme";
+
+function MainPackage() {
+ const navigate = useNavigate();
+
+ const onToMarsPackage = () => {
+ navigate("/product/uSInnvkln98h4oP5yOtj");
+ };
+ const onToRoundTrip = () => {
+ navigate("/product/52Zq0J0MycRKvTkd0C80");
+ };
+ return (
+ <>
+ ํจํค์ง ํน๊ฐ ์ํ
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+const Category = styled.h1`
+ display: flex;
+ font-weight: bold;
+ margin: 6rem 0 2rem;
+ font-size: 2.625rem;
+ letter-spacing: -2px;
+ font-family: 'GmarketSans';
+ div{
+ width: 8px;
+ height: 40px;
+ display: flex;
+ margin-right: 10px;
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+const Container = styled.div`
+ display: flex;
+ width: 1200px;
+ padding-left: 13px;
+ padding-right: 13px;
+ justify-content: space-between;
+`;
+const Wrapper = styled.div`
+ transition: 0.1s;
+ &:hover {
+ transform: scale(0.98);
+ }
+`;
+
+const Package = styled.img`
+ display: flex;
+ cursor: pointer;
+ width: 575px;
+ align-items: center;
+ border-radius: 1.25rem;
+ justify-content: center;
+ color: ${theme.colors.orange.main};
+
+`;
+
+export default MainPackage;
diff --git a/src/components/main/MainPaymentInfo.tsx b/src/components/main/MainPaymentInfo.tsx
new file mode 100644
index 00000000..a4bc685d
--- /dev/null
+++ b/src/components/main/MainPaymentInfo.tsx
@@ -0,0 +1,255 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import { formatDollar } from "../../lib/Function/commonFn";
+import { Dispatch, SetStateAction, useEffect, useState } from "react";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../../components/common/Header";
+import { useNavigate } from "react-router-dom";
+import { myAccount } from "../../lib/API/userAPI";
+import styled from "styled-components";
+import { IBuyItem } from "../../modules/buyItem";
+import { theme } from "../../styles/theme";
+
+interface IBank {
+ id: string; // ๊ณ์ข ID
+ bankName: string; // ์ํ ์ด๋ฆ
+ bankCode: string; // ์ํ ์ฝ๋
+ accountNumber: string; // ๊ณ์ข ๋ฒํธ
+ balance: number; // ๊ณ์ข ์์ก
+}
+
+interface IAccounts {
+ totalBalance: number;
+ accounts: IBank[];
+}
+
+interface IPaymentInfo {
+ username: string;
+ setUsername: Dispatch>;
+ items: IBuyItem[];
+ price: number;
+ quantity: number;
+ accountId: string;
+ onCheck: (accountId: string) => void;
+}
+
+function MainPaymentInfo({
+ username,
+ setUsername,
+ items,
+ price,
+ quantity,
+ accountId,
+ onCheck,
+}: IPaymentInfo) {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ const [isLoggedIn, setIsLoggedIn] = useState(true);
+ const navigate = useNavigate();
+ const [userEmail, setUserEmail] = useState("");
+ const [myAccounts, setMyAccounts] = useState();
+ const title = items.length > 0 ? items[0].title : "";
+
+ // state๊ฐ false์ผ์ alert์ ํจ๊ป loginํ์ด์ง๋ก ๋ฆฌ๋๋ ์
+ useEffect(() => {
+ if (!isLoggedIn) {
+ alert("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
+ navigate("/auth/login");
+ }
+ }, [isLoggedIn, navigate]);
+
+ // ์ ์ ์ธ์ฆํจ์. ์ ํจํ ์ ์ ๊ฐ ์๋๋ฉด state์ false๋ฅผ ๋ฐํ
+ const checkUser = async () => {
+ if (typeof res === "string") {
+ setIsLoggedIn(false);
+ }
+ };
+
+ // ์ฃผ๋ฌธ์ ์ ๋ณด
+ const getUserInfo = () => {
+ if (res) {
+ setUsername(res.displayName);
+ setUserEmail(res.email);
+ }
+ };
+
+ // ๊ฒฐ์ ๊ณ์ข
+ const getUsableAccounts = async () => {
+ const res = await myAccount();
+ if (res) {
+ setMyAccounts(res);
+ }
+ };
+
+ useEffect(() => {
+ checkUser();
+ getUserInfo();
+ getUsableAccounts();
+ }, [accountId]);
+
+ return (
+
+
+
+
+ ์ฃผ๋ฌธ ์ํ
+
+
+
+ ์ํ ์ด๋ฆ
+ {title}
+ {quantity > 1 ? ` ๋ฑ ${new Set(items).size} ๊ฐ` : ""}
+
+
+
+ ์ด ์ํ ๊ฐ๊ฒฉ
+ {formatDollar(price)}
+
+
+
+ ์ํ ๊ฐ์
+ {`์ด ${quantity} ๊ฐ`}
+
+
+
+
+
+ ์ฃผ๋ฌธ์ ์ ๋ณด
+
+
+
+ ์ฃผ๋ฌธ์ ๋ช
+ {username}
+
+
+ ์ด๋ฉ์ผ
+ {userEmail}
+
+
+
+
+ ๊ฒฐ์ ์๋จ ์ ํ
+
+ {myAccounts?.accounts
+ ? myAccounts.accounts.map((account: IBank) => {
+ return (
+
+ {
+ onCheck(account.id);
+ }}
+ />
+
+
+ );
+ })
+ : ""}
+
+
+ );
+}
+
+const Line = styled.div`
+ height: 1px;
+ margin-bottom: 1.5rem;
+ background-color: ${theme.colors.gray[3]};
+`;
+
+const Lines = styled.div`
+ height: 1px;
+ margin-bottom: 1.5rem;
+ background-color: ${theme.colors.gray[7]};
+`;
+
+const PaymentWrapper = styled.div`
+ width: 800px;
+ min-width: 800px;
+`;
+
+const SubTitle = styled.div`
+ font-size: 20px;
+ font-weight: 700;
+ margin-bottom: 10px;
+`;
+
+const DetailWrapper = styled.div`
+ gap: 0.5rem;
+ display: flex;
+ flex-direction: column;
+ padding: 5px 1rem 5px 1rem;
+
+ span {
+ font-weight: 700;
+ }
+
+ > div {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 0.5rem;
+ }
+`;
+
+const PaymentDetail = styled.div`
+ padding: 15px;
+ margin-left: 20px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[7]};
+`;
+const ProductName = styled.div`
+ font-size: 16px;
+`;
+const ProductPrice = styled.div``;
+const ProductQty = styled.div``;
+
+const UserDetail = styled.div`
+ padding: 15px;
+ margin-top: 10px;
+ margin-left: 20px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[7]};
+`;
+const UserName = styled.div``;
+const UserMail = styled.div``;
+
+const AccountDetail = styled.div`
+ padding: 15px;
+ margin-top: 10px;
+ margin-left: 20px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[7]};
+`;
+
+const UsableAccount = styled.li`
+ height: 22px;
+ width: 254.5px;
+ list-style: none;
+ margin-bottom: 0.5rem;
+ input[type="radio"] {
+ width: 14px;
+ height: 14px;
+ appearance: none;
+ margin-left: 16px;
+ margin-right: 8px;
+ border-radius: 100%;
+ background-color: white;
+ border: 1px solid ${theme.colors.gray[3]};
+ }
+ input[type="radio"]:checked {
+ border: none;
+ width: 14px;
+ height: 14px;
+ margin-left: 16px;
+ border-radius: 100%;
+ background-color: white;
+ background-color: ${theme.colors.orange.main};
+ }
+ label:hover {
+ cursor: pointer;
+ }
+`;
+
+export default MainPaymentInfo;
diff --git a/src/components/main/MainPaymentOrder.tsx b/src/components/main/MainPaymentOrder.tsx
new file mode 100644
index 00000000..e1cfe163
--- /dev/null
+++ b/src/components/main/MainPaymentOrder.tsx
@@ -0,0 +1,230 @@
+import { formatDollar } from "../../lib/Function/commonFn";
+import styled from "styled-components";
+import Button from "../common/Button";
+import { theme } from "../../styles/theme";
+import { orderApply } from "../../lib/API/userAPI";
+import { useNavigate } from "react-router-dom";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+interface IPaymentOrder {
+ price: number;
+ productIds: string[];
+ accountId: string;
+ discountedPrice: number;
+}
+
+function MainPaymentOrder({
+ price,
+ productIds,
+ accountId,
+ discountedPrice,
+}: IPaymentOrder) {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ const navigate = useNavigate(); // ๋ด๋น๊ฒ์ดํฐ
+
+ // ๊ฒฐ์ ๋ฒํผ onClick ์ด๋ฒคํธ ํจ์
+ const onPayment = async () => {
+ if (res) {
+ // ๊ฒฐ์ ๊ณ์ข๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ํ๋์์ ๋
+ if (accountId) {
+ if (typeof (await orderApply(productIds[0], accountId)) !== "string") {
+ // ์ ํ ๊ตฌ๋งค ์ ์ฒญ
+ for (let i = 0; i < productIds.length; i++) {
+ orderApply(productIds[i], accountId);
+ }
+
+ const confirm = window.confirm(
+ "๊ฒฐ์ ๊ฐ ์๋ฃ๋์์ต๋๋ค. ์ฃผ๋ฌธ๋ด์ญ์ผ๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?",
+ );
+
+ // ํ์ธ ๋ฒํผ click ์ฌ๋ถ
+ if (confirm) {
+ navigate("/user");
+ } else {
+ }
+
+ // ๊ฒฐ์ ์๋ฃ ์, ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ด ์ฅ๋ฐ๊ตฌ๋ ์ญ์
+ localStorage.removeItem(`cart_${res.email}`);
+
+ // ์ต์ข
์ ์ผ๋ก ๊ฒฐ์ ํ ํ์ด์ง ๋ฆฌ๋ก๋
+ window.location.reload();
+ } else {
+ const confirm = window.confirm(
+ "์์ก์ด ๋ถ์กฑํฉ๋๋ค. ๊ณ์ข ๊ด๋ฆฌ ํ์ด์ง๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?",
+ );
+ if (confirm) navigate("/user/account");
+ }
+ } else {
+ alert("๊ฒฐ์ ๊ณ์ข๋ฅผ ์ ํํ์ธ์.");
+ }
+ }
+ };
+
+ return (
+
+
+
+ ๊ฒฐ์ ๊ธ์ก
+
+
+
+
+
+ ์ฃผ๋ฌธ ๊ธ์กA
+
+ {formatDollar(price)}
+
+
+
+ ํ ์ธ ๊ธ์กB
+
+
{formatDollar(discountedPrice)}
+
+
+
+ ๋ก์ผ๋ฐฐ์ก๋นC
+
+ {price ?
{formatDollar(3000)} : ""}
+
+
+
+
+
+ ์ด ๊ฒฐ์ ๊ธ์ก
+
+ A
+ -
+ B
+ +
+ C
+
+
+
+ {price ? (
+ {formatDollar(price - discountedPrice + 3000)}
+ ) : (
+ ""
+ )}
+
+
+
+
+
+
+ );
+}
+
+const Container = styled.div`
+ margin-left: 16px;
+ width: 100%;
+`;
+
+const AbcContainer = styled.div`
+ margin-left: 10px;
+ height: 20px;
+ display: inline-flex;
+ span {
+ margin: 0 4px;
+ font-size: 16px;
+ line-height: 20px;
+ }
+ div {
+ width: 20px;
+ height: 20px;
+ display: flex;
+ color: white;
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 22px;
+ border-radius: 50%;
+ justify-content: center;
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const Line = styled.div`
+ background-color: ${theme.colors.gray[7]};
+ height: 1px;
+`;
+
+const AbcItem = styled.div`
+ width: 16px;
+ height: 16px;
+ display: flex;
+ color: white;
+ font-size: 10px;
+ font-weight: 700;
+ margin-left: 10px;
+ line-height: 16px;
+ border-radius: 50%;
+ justify-content: center;
+ background-color: ${theme.colors.orange.main};
+`;
+
+const OrderWrapper = styled.div`
+ padding: 2rem 1rem;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+`;
+
+const PaymentPrice = styled.div`
+ margin-bottom: 1.5rem;
+ > span {
+ font-size: 28px;
+ font-weight: 700;
+ }
+`;
+
+const Calculator = styled.div`
+ gap: 1rem;
+ display: flex;
+ margin: 2rem 0;
+ flex-direction: column;
+
+ > span {
+ font-size: 20px;
+ }
+
+ > div {
+ display: flex;
+ justify-content: space-between;
+ span {
+ display: inline-flex;
+ }
+ span:first-child {
+ font-weight: 700;
+ }
+ }
+`;
+
+const TotalPrice = styled.div`
+ display: flex;
+ font-size: 20px;
+ margin-top: 2rem;
+ font-weight: 700;
+ align-items: center;
+ padding-bottom: 10px;
+ justify-content: space-between;
+ span:last-child {
+ padding-top: 10px;
+ color: ${theme.colors.orange.main};
+ }
+`;
+
+const ButtonWrapper = styled.div`
+ width: 100%;
+ > button {
+ width: 100%;
+ height: 3rem;
+ font-size: 18px;
+ margin-top: 1rem;
+ :hover {
+ background-color: ${theme.colors.orange.hover};
+ }
+ }
+`;
+
+export default MainPaymentOrder;
diff --git a/src/components/main/MainProductBtn.tsx b/src/components/main/MainProductBtn.tsx
new file mode 100644
index 00000000..de113854
--- /dev/null
+++ b/src/components/main/MainProductBtn.tsx
@@ -0,0 +1,50 @@
+import { AiFillMinusCircle, AiFillPlusCircle } from "react-icons/ai";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+
+interface IQtyButtonProps {
+ quantity: number;
+ setQuantity: (value: number) => void;
+}
+
+function MainProductBtn({ quantity, setQuantity }: IQtyButtonProps) {
+ // ๊ตฌ๋งค ์๋ ์ฆ๊ฐ
+ const onDecrease = () => {
+ if (quantity > 1) setQuantity(quantity - 1);
+ };
+
+ // ๊ตฌ๋งค ์๋ ๊ฐ์
+ const onIncrease = () => {
+ setQuantity(quantity + 1);
+ };
+
+ return (
+
+ -
+ {quantity}
+ +
+
+ );
+}
+
+const ButtonWrapper = styled.div`
+ display: flex;
+ gap: 0.5rem;
+
+ > svg {
+ cursor: pointer;
+ font-size: 24px;
+ transition: 0.1s;
+ color: ${theme.colors.gray[3]};
+ :hover {
+ color: ${theme.colors.orange.main};
+ }
+ }
+ > p {
+ font-size: 1.5rem;
+ width: 2rem;
+ text-align: center;
+ }
+`;
+
+export default MainProductBtn;
diff --git a/src/components/main/MainProductPurchase.tsx b/src/components/main/MainProductPurchase.tsx
new file mode 100644
index 00000000..52d68a65
--- /dev/null
+++ b/src/components/main/MainProductPurchase.tsx
@@ -0,0 +1,98 @@
+import { useState } from "react";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { formatDollar } from "../../lib/Function/commonFn";
+import { IProductDetail } from "../../lib/API/commonAPI";
+import MainProductBtn from "./MainProductBtn";
+import MainCartBtn from "./MainCartBtn";
+import MainBuyBtn from "./MainBuyBtn";
+
+interface IProductPurchase {
+ product?: IProductDetail;
+ discountedPrice: number;
+}
+
+function MainProductPurchase({ product, discountedPrice }: IProductPurchase) {
+ let [quantity, setQuantity] = useState(1);
+
+ return (
+
+
+ ๊ตฌ๋งค ์๋
+
+
+
+ ์ด ์ํ ๊ธ์ก
+
+ {product?.price ? formatDollar(discountedPrice * quantity) : 0}
+
+
+
+
+
+
+
+ );
+}
+const PurchaseWrapper = styled.div``;
+const Quantity = styled.div`
+ display: flex;
+ margin-top: 2rem;
+ align-items: center;
+ justify-content: space-between;
+
+ > span {
+ font-size: 24px;
+ font-weight: 700;
+ }
+`;
+
+const ButtonWrapper = styled.div`
+ gap: 12px;
+ display: flex;
+ margin-top: 2rem;
+ justify-content: center;
+
+ > Button {
+ width: 210px;
+ height: 50px;
+ display: flex;
+ font-size: 18px;
+ border-radius: 5px;
+ align-items: center;
+ justify-content: center;
+
+ &:first-child {
+ cursor: pointer;
+ color: ${theme.colors.orange.main};
+ background-color: ${theme.colors.white};
+ border: 1px solid ${theme.colors.orange.main};
+ transition: 0.1s;
+ &:hover {
+ transform: scale(1.04);
+ color: ${theme.colors.white};
+ background: ${theme.colors.orange.main};
+ }
+ }
+ }
+`;
+
+const PriceAll = styled.div`
+ display: flex;
+ margin-top: 2rem;
+ align-items: center;
+ justify-content: space-between;
+
+ > span {
+ font-size: 24px;
+ font-weight: 700;
+ }
+`;
+
+const Price = styled.div`
+ font-size: 2rem;
+ font-weight: bold;
+ color: ${theme.colors.orange.main};
+`;
+
+export default MainProductPurchase;
diff --git a/src/components/main/MainProductTitle.tsx b/src/components/main/MainProductTitle.tsx
new file mode 100644
index 00000000..e5f405d3
--- /dev/null
+++ b/src/components/main/MainProductTitle.tsx
@@ -0,0 +1,131 @@
+import React from "react";
+import styled, { css } from "styled-components";
+import { IoMdHeart, IoMdHeartEmpty } from "react-icons/io";
+import { theme } from "../../styles/theme";
+import { IProductDetail, productDetail } from "../../lib/API/commonAPI";
+import { IProductLike } from "../../lib/API/adminAPI";
+import { ICheckData } from "../common/Header";
+
+interface IProductTitle {
+ product?: IProductDetail;
+ isAnimate?: boolean;
+ like?: boolean;
+ id?: string;
+ setLike: (value: boolean) => void;
+ setIsAnimate: (value: boolean) => void;
+ res?: ICheckData;
+}
+
+function MainProductTitle({
+ product,
+ like,
+ setLike,
+ isAnimate,
+ setIsAnimate,
+ id,
+ res,
+}: IProductTitle) {
+ // ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ก ์ฐ ์ฌ๋ถ๊ฐ ํฌํจ๋ ์ํ ์ ๋ณด๋ฅผ Post
+ const onLike = async (event: React.MouseEvent) => {
+ event.preventDefault();
+
+ setLike(!like); // like ํ ๊ธ
+ const item = await findProduct(); // item ์์ธ ์กฐํ
+
+ if (item) postLike(item);
+
+ setIsAnimate(true);
+
+ // 0.4์ด ํ์ resolve ํจ์๋ฅผ ํธ์ถํ์ฌ Promise๋ฅผ ์๋ฃ
+ await new Promise((resolve) => setTimeout(resolve, 400));
+
+ setIsAnimate(false);
+ };
+
+ const findProduct = async () => {
+ // ์ ํจํ prdocut์ผ ๊ฒฝ์ฐ
+ if (id) {
+ // ๋จ์ผ ์ ํ ์์ธ ์กฐํ
+ const product: IProductLike = await productDetail(id);
+ return { ...product, like: true };
+ }
+ return null;
+ };
+
+ // ์ฐ ๋ชฉ๋ก์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ก ๋ณด๋
+ const postLike = async (item: IProductLike) => {
+ // ์ธ์ฆ ํ์ธ
+ if (res) {
+ // ์ผ์นํ๋ ์ํ์ get
+ const getLikeItem = localStorage.getItem(`like_${res.email}`);
+
+ // ๋น ๋ฐฐ์ด ์ ์ธ
+ let likeItems: IProductLike[] = [];
+
+ // ๊ธฐ์กด ์ฐ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ๋ด์
+ if (getLikeItem) {
+ likeItems = JSON.parse(getLikeItem);
+ }
+
+ if (like === true) {
+ // ์ด๋ฏธ ์ฐํ ์ํ์ธ ๊ฒฝ์ฐ, ์ญ์ (filter)
+ const updatedLikes = likeItems.filter((value) => value.id !== item.id);
+ localStorage.setItem(`like_${res.email}`, JSON.stringify(updatedLikes));
+ } else {
+ // ์ฐํ์ง ์์ ์ํ์ธ ๊ฒฝ์ฐ, ์ถ๊ฐ(push)
+ likeItems.push(item);
+ localStorage.setItem(`like_${res.email}`, JSON.stringify(likeItems));
+ }
+ }
+ };
+
+ return (
+
+ {product?.title}
+
+ {like ? : }
+
+
+ );
+}
+
+const TitleWrapper = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+const Title = styled.h1`
+ font-size: 3rem;
+ font-weight: bold;
+ font-family: "GmarketSans";
+ margin-bottom: 6px;
+`;
+
+const LikeButton = styled.button<{
+ isLiked?: boolean;
+ isAnimate?: boolean;
+}>`
+ border: none;
+ cursor: pointer;
+ background: none;
+ color: ${theme.colors.gray[3]};
+
+ ${(props) =>
+ props.isLiked &&
+ css`
+ color: ${theme.colors.pink};
+ `}
+ ${(props) =>
+ props.isAnimate &&
+ css`
+ transform: scale(1.2);
+ transition: 0.4s;
+ `}
+
+ > svg {
+ font-size: 38px;
+ }
+`;
+
+export default MainProductTitle;
diff --git a/src/components/main/MainSearched.tsx b/src/components/main/MainSearched.tsx
new file mode 100644
index 00000000..071578f9
--- /dev/null
+++ b/src/components/main/MainSearched.tsx
@@ -0,0 +1,38 @@
+import { useState, useEffect } from "react";
+import { IProduct, productsList } from "../../lib/API/adminAPI";
+import MainSearchedCard from "./Card/MainSearchedCard";
+
+interface ISearched {
+ inputText: string;
+}
+
+function MainSearched({ inputText }: ISearched) {
+ const [list, setList] = useState([]);
+
+ // ๊ฒ์๊ฐ๊ณผ item์ title์ ๋น๊ต
+ const searchedTitle = list.filter((item) => item.title?.includes(inputText));
+
+ // ๊ฒ์๊ฐ๊ณผ item์ tag๋ฅผ ๋น๊ต
+ const searchedTag = list.filter((item) => item.tags?.includes(inputText));
+
+ // ๋ ๊ฒ์ ์กฐ๊ฑด์ concat
+ const searchedList = searchedTag.concat(searchedTitle);
+
+ useEffect(() => {
+ async function fetchList() {
+ try {
+ const res = await productsList();
+ setList(res);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ ///////////////////
+
+ return ;
+}
+
+export default MainSearched;
diff --git a/src/components/main/MainShipList.tsx b/src/components/main/MainShipList.tsx
new file mode 100644
index 00000000..8ad66d46
--- /dev/null
+++ b/src/components/main/MainShipList.tsx
@@ -0,0 +1,133 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import MainItem from "./MainItem";
+import styled from "styled-components";
+import { useEffect, useState } from "react";
+import { productsList, IProduct } from "../../lib/API/adminAPI";
+import Carousel from "../common/Carousel";
+import { IProductLike } from "../../lib/API/adminAPI";
+import { theme } from "../../styles/theme";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+
+function MainShipList() {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ // ์ํ๋ค์ ๋ด๋ ๋ฐฐ์ด ์ ์ธ
+ const [list, setList] = useState([]);
+ // liked๋ item์ ๋ด์ ๋ฐฐ์ด ์ ์ธ
+ const [likedList, setLikedList] = useState([]);
+
+ useEffect(() => {
+ const fetchList = async () => {
+ try {
+ // ๋ชจ๋ ์ ํ ์กฐํ
+ const response: IProduct[] = await productsList();
+
+ // ํ์๊ณ ์ํ ์กฐํ
+ const solarList = response.filter((item) =>
+ item.tags?.includes("์ฐ์ฃผ์ "),
+ );
+ setList(solarList);
+
+ // ์ฐ ๋ชฉ๋ก ์กฐํ
+ if (res) {
+ let likedList: IProductLike[] = [];
+ const getLikedItem = localStorage.getItem(`like_${res.email}`);
+
+ if (getLikedItem) {
+ likedList = JSON.parse(getLikedItem);
+ }
+ setLikedList(likedList);
+ }
+ } catch (error) {
+ console.error("Failed", error);
+ }
+ };
+ fetchList();
+ }, []);
+
+ return (
+ <>
+ ์ด๋ฌ์ ์ฐ์ฃผ์
+
+
+ {list.map((item) => {
+ const liked = likedList.find((likeItem) => likeItem.id === item.id);
+ const like = liked ? liked.like : false;
+ return (
+
+ );
+ })}
+
+
+ >
+ );
+}
+
+const Category = styled.h1`
+ margin: 6rem 0 2rem;
+ font-size: 2.625rem;
+ font-weight: bold;
+ letter-spacing: -2px;
+ font-family: 'GmarketSans';
+ display: flex;
+ div{
+ background-color: ${theme.colors.orange.main};
+ width: 8px;
+ height: 40px;
+ margin-right: 10px;
+ display: flex;
+ }
+`;
+
+const Container = styled.div`
+ display: flex;
+ padding-left: 13px;
+ margin-bottom: 50px;
+ justify-content: center;
+ .slick-slider {
+ width: 75rem;
+ }
+
+ .slick-list {
+ }
+
+ .slick-arrow {
+ width: 50px;
+ height: 50px;
+ top: 150px;
+ }
+
+ .slick-dots {
+ li{
+ display: none;
+ }
+ }
+
+ .slick-prev {
+ opacity: 0;
+ transition: 0.1s;
+ &:hover {
+ opacity: 0.4;
+ }
+ }
+
+ .slick-next {
+ opacity: 0;
+ transition: 0.1s;
+ &:hover {
+ opacity: 0.4;
+ }
+ }
+`;
+
+export default MainShipList;
diff --git a/src/components/main/MainSolarList.tsx b/src/components/main/MainSolarList.tsx
new file mode 100644
index 00000000..038841c6
--- /dev/null
+++ b/src/components/main/MainSolarList.tsx
@@ -0,0 +1,138 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import MainItem from "./MainItem";
+import styled from "styled-components";
+import { useEffect, useState } from "react";
+import { productsList, IProduct } from "../../lib/API/adminAPI";
+import Carousel from "../common/Carousel";
+import { IProductLike } from "../../lib/API/adminAPI";
+import { theme } from "../../styles/theme";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+
+// ํ์๊ณ ์ํ์ ๋์ดํ๋ ์ปดํฌ๋ํธ
+function MainSolarList() {
+ // ์ฟผ๋ฆฌ ์ ์ธ
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+
+ const [list, setList] = useState([]); // ์ํ๋ค์ ๋ด๋ ๋ฐฐ์ด
+ const [likedList, setLikedList] = useState([]); // liked๋ item์ ๋ด์ ๋ฐฐ์ด
+
+ //
+ const fetchList = async () => {
+ try {
+ // ๋ชจ๋ ์ ํ ์กฐํ
+ const response: IProduct[] = await productsList();
+
+ // ํ์๊ณ ์ํ ์กฐํ (tags ๊ธฐ๋ฐ)
+ const solarList = response.filter((item) =>
+ item.tags?.includes("ํ์๊ณ"),
+ );
+ setList(solarList);
+
+ // ์ฐ ๋ชฉ๋ก ์กฐํ
+ if (res) {
+ let likedList: IProductLike[] = [];
+ const getLikedItem = localStorage.getItem(`like_${res.email}`);
+
+ if (getLikedItem) {
+ likedList = JSON.parse(getLikedItem);
+ }
+ setLikedList(likedList);
+ }
+ } catch (error) {
+ console.error("Failed", error);
+ }
+ };
+
+ useEffect(() => {
+ fetchList();
+ }, [res]);
+
+ return (
+ <>
+
+
+ ์ ์ ํ์๊ณ ํ์ฑ{" "}
+
+
+
+ {list.map((item) => {
+ const liked = likedList.find((likeItem) => likeItem.id === item.id);
+ const like = liked ? liked.like : false;
+ return (
+
+ );
+ })}
+
+
+ >
+ );
+}
+
+const Category = styled.h1`
+ display: flex;
+ font-weight: bold;
+ font-size: 2.625rem;
+ margin-bottom: 2rem;
+ letter-spacing: -2px;
+ font-family: "GmarketSans";
+ div {
+ width: 8px;
+ height: 40px;
+ display: flex;
+ margin-right: 10px;
+ background-color: ${theme.colors.orange.main};
+ }
+`;
+
+const Container = styled.div`
+ display: flex;
+ padding-left: 13px;
+ justify-content: center;
+ .slick-slider {
+ width: 75rem;
+ }
+
+ .slick-list {
+ }
+
+ .slick-arrow {
+ width: 50px;
+ height: 50px;
+ top: 150px;
+ }
+
+ .slick-dots {
+ li {
+ display: none;
+ }
+ }
+
+ .slick-prev {
+ opacity: 0;
+ transition: 0.1s;
+ &:hover {
+ opacity: 0.4;
+ }
+ }
+
+ .slick-next {
+ opacity: 0;
+ transition: 0.1s;
+ &:hover {
+ opacity: 0.4;
+ }
+ }
+`;
+
+export default MainSolarList;
diff --git a/src/components/user/UserAccountList.tsx b/src/components/user/UserAccountList.tsx
new file mode 100644
index 00000000..67e2cf7d
--- /dev/null
+++ b/src/components/user/UserAccountList.tsx
@@ -0,0 +1,144 @@
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import Button from "../../components/common/Button";
+import { accountDisconnect } from "../../lib/API/userAPI";
+import { formatDollar } from "../../lib/Function/commonFn";
+
+interface IAccount {
+ id: string;
+ bankName: string;
+ bankCode: string;
+ accountNumber: string;
+ balance: number;
+}
+
+interface IAcocuntListProps {
+ accounts: IAccount[];
+ getAccounts: () => Promise;
+ setIsModalOpen: React.Dispatch>;
+}
+
+function UserAccountList({
+ accounts,
+ getAccounts,
+ setIsModalOpen,
+}: IAcocuntListProps) {
+ //๊ณ์ข ์ถ๊ฐ ๋ฒํผ
+ const newAccount = (event: React.MouseEvent) => {
+ event.preventDefault();
+ setIsModalOpen(true);
+ };
+
+ //๊ณ์ข ์ญ์ ๋ฒํผ
+ const delAccount = async (
+ event: React.MouseEvent,
+ id: string,
+ bank: string,
+ ) => {
+ const delConfirm = window.confirm(`${bank} ๊ณ์ข๋ฅผ ํด์งํ์๊ฒ ์ต๋๊น?`);
+ event.preventDefault();
+ if (delConfirm) {
+ await accountDisconnect(id, true);
+ getAccounts();
+ alert(`${bank} ๊ณ์ข๊ฐ ํด์ง๋์์ต๋๋ค.`);
+ }
+ };
+
+ return (
+
+ {accounts.length ? (
+ accounts.map((account: IAccount) => {
+ return (
+
+
+
+ {account.bankName} [ {account.bankCode} ]
+
+ {account.accountNumber}
+ {formatDollar(account.balance)}
+
+ {
+ delAccount(event, account.id, account.bankName);
+ }}
+ >
+ ์ญ์
+
+
+ );
+ })
+ ) : (
+ ์ฐ๊ฒฐ๋ ๊ณ์ข๊ฐ ์์ต๋๋ค.
+ )}
+
+ ๊ณ์ข ์ถ๊ฐ
+
+
+ );
+}
+
+const AccountListBox = styled.ul`
+ gap: 5px;
+ display: flex;
+ flex-direction: column;
+`;
+
+const AccountList = styled.li`
+ width: 100%;
+ height: 70px;
+ display: flex;
+ transition: 0.1s;
+ padding: 0 1.25rem;
+ border-radius: 5px;
+ align-items: center;
+ border: 1px solid ${(props) => props.theme.colors.gray[7]};
+ &:hover {
+ transform: scale(0.99);
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+
+const AccountWrapper = styled.div`
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+`;
+const BankName = styled.span`
+ width: 40%;
+ font-weight: 700;
+ font-size: 1.125rem;
+`;
+const AccountNumber = styled.span`
+ flex-grow: 1;
+ font-size: 16px;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+const Balance = styled.span`
+ font-size: 16px;
+`;
+
+const DelAccount = styled(Button)`
+ border: none;
+ cursor: pointer;
+ margin-left: 40px;
+`;
+
+const ErrorMessage = styled.span`
+ font-size: 1.125rem;
+ font-weight: 700;
+ color: ${theme.colors.orange.main};
+`;
+
+const AddAccount = styled(Button)`
+ font-size: 1rem;
+ margin-top: 10px;
+ transition: 0.2s;
+ align-self: flex-end;
+
+ &:hover {
+ background: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+export default UserAccountList;
diff --git a/src/components/user/UserCalendar.tsx b/src/components/user/UserCalendar.tsx
new file mode 100644
index 00000000..9cbc7ab5
--- /dev/null
+++ b/src/components/user/UserCalendar.tsx
@@ -0,0 +1,189 @@
+import { Dispatch, SetStateAction, useState } from "react";
+import styled from "styled-components";
+import Calendar from "react-calendar";
+import { theme } from "../../styles/theme";
+
+import { AiFillCaretLeft, AiFillCaretRight } from "react-icons/ai";
+
+export type TValuePiece = Date | null;
+interface ICalendarProps {
+ value: TValuePiece | [TValuePiece, TValuePiece];
+ onChange: Dispatch>;
+}
+function UserCalendar({ value, onChange }: ICalendarProps) {
+ const [isOpen, setIsOpen] = useState(false);
+
+ // ์บ๋ฆฐํฐ on off ํ ๊ธ
+ const onToggle = () => {
+ setIsOpen((prev) => !prev);
+ };
+
+ // date๋ฅผ string์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ ํจ์
+ const getYMD = (date: TValuePiece) => {
+ return date && date.toLocaleDateString();
+ };
+
+ // ์บ๋ฆฐ๋ ์ ํ์ ๋ฐ๋ผ ๋ ์ง ๋ ๋๋ง
+ const renderDate = () => {
+ if (Array.isArray(value)) {
+ return `${getYMD(value[0])} ~ ${getYMD(value[1])}`;
+ } else {
+ return `${getYMD(value)} ~ ${getYMD(value)}`;
+ }
+ };
+
+ return (
+
+
+ {renderDate()}
+
+ {isOpen ? (
+ }
+ nextLabel={}
+ next2Label={null}
+ prev2Label={null}
+ formatDay={(locale, date) =>
+ date.toLocaleString("en", { day: "numeric" })
+ }
+ />
+ ) : (
+ ""
+ )}
+
+ );
+}
+
+const CalendarBox = styled.div`
+ display: flex;
+ align-items: end;
+ margin-top: 1.25rem;
+ flex-direction: column;
+
+ .react-calendar {
+ width: 300px;
+ padding: 20px;
+ border-radius: 5px;
+ border: 1px solid ${theme.colors.gray[3]};
+ }
+
+ .react-calendar__tile--range {
+ }
+
+ .react-calendar__month-view__days__day {
+ }
+
+ .react-calendar__tile--now {
+ // ์ค๋ ๋ ์ง ํ์ผ
+ background: ${(props) => props.theme.colors.white};
+ color: ${(props) => props.theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ border-radius: 50px;
+ }
+
+ .react-calendar__tile--active:enabled:focus {
+ background-color: ${(props) => props.theme.colors.orange.main};
+ color: ${(props) => props.theme.colors.white};
+ }
+
+ .react-calendar__tile:enabled:hover {
+ background-color: #ff8c53;
+ color: #fff;
+ }
+
+ .react-calendar__tile--now:enabled:hover {
+ background-color: ${(props) => props.theme.colors.orange.main};
+ color: ${(props) => props.theme.colors.white};
+ }
+
+ .react-calendar__tile--now:enabled:focus {
+ // ์ค๋ ๋ ์ง ํ์ผ์ด ์ ํ๋๊ฑฐ๋ ํธ๋ฒ๋์๋
+ color: ${(props) => props.theme.colors.orange.main};
+ color: ${(props) => props.theme.colors.white};
+ }
+
+ .react-calendar__month-view__weekdays {
+ abbr {
+ // MON, THU ์์ผ ํ์ ๋ถ๋ถ
+ color: ${(props) => props.theme.colors.orange.main};
+ text-decoration: none;
+ }
+ }
+
+ .react-calendar__tile {
+ // ์ ์ฒด ํ์ผ ์คํ์ผ๋ง
+ border-radius: 0%;
+ font-size: 12px;
+ button {
+ color: #ff8c53;
+ }
+ }
+
+ .react-calendar__tile--active {
+ // ์ ํ ๋ ํ์ผ
+ /* border-radius: 50%; */
+ background-color: ${theme.colors.gray[3]};
+ box-sizing: border-box;
+ }
+
+ .react-calendar__tile--rangeStart,
+ .react-calendar__tile--rangeEnd {
+ // ๋ฒ์์ ํ ์ ๋ ๋ ์ง
+ background: ${(props) => props.theme.colors.orange.main};
+ color: #fff;
+ }
+
+ .react-calendar--selectRange {
+ color: red;
+ }
+
+ .react-calendar__tile--hover {
+ // ๋ฒ์ ์ ํ ์ค๊ฐ ๋ ์ง๋ค
+ background-color: ${theme.colors.gray[3]};
+ color: ${(props) => props.theme.colors.white};
+ }
+
+ .react-calendar__tile--hoverStart {
+ /* background-color: #3d0000; */
+ }
+
+ .react-calendar__tile--hoverEnd {
+ /* background-color: black; */
+ }
+
+ .react-calendar__tile--rangeEnd {
+ }
+
+ //์์ ์ผ์ด ์ ํ๋๊ณ ๋๊ธฐ์ค์ธ ์ํ
+ .react-calendar__tile--rangeBothEnds {
+ background-color: #ff8871;
+ }
+`;
+
+const ToggleButton = styled.button<{
+ isOpen?: boolean;
+}>`
+ height: 24px;
+ display: flex;
+ cursor: pointer;
+ padding: 0 15px;
+ transition: 0.2s;
+ font-weight: 700;
+ line-height: 12px;
+ font-size: 0.75rem;
+ align-items: center;
+ border-radius: 1rem;
+ margin-bottom: 0.75rem;
+ justify-content: center;
+ color: ${({ isOpen, theme }) =>
+ isOpen ? theme.colors.white : theme.colors.orange.main};
+ background-color: ${({ isOpen, theme }) =>
+ isOpen ? theme.colors.orange.main : theme.colors.white};
+ border: 1px solid ${(props) => props.theme.colors.orange.main};
+`;
+
+export default UserCalendar;
diff --git a/src/components/user/UserCollapsible.tsx b/src/components/user/UserCollapsible.tsx
new file mode 100644
index 00000000..cc5236d2
--- /dev/null
+++ b/src/components/user/UserCollapsible.tsx
@@ -0,0 +1,288 @@
+import Collapsible from "react-collapsible";
+import { adjustDate, formatDollar } from "../../lib/Function/commonFn";
+import styled from "styled-components";
+import Button from "../../components/common/Button";
+import { orderCancel, orderConfirm, orderDetail } from "../../lib/API/userAPI";
+import {
+ IOrdersDetail,
+ IOrdersDetailExtend,
+} from "../../pages/user/OrderListPage";
+import { Dispatch, SetStateAction } from "react";
+import { useQuery } from "react-query";
+
+interface ICollapsibleProps {
+ order: IOrdersDetail;
+ isAccordionOpen: boolean;
+ accordionDetails: IOrdersDetailExtend | undefined;
+ detailsMap: Map;
+ setDetailsMap: Dispatch>>;
+}
+function UserCollapsible({
+ order,
+ isAccordionOpen,
+ accordionDetails,
+ detailsMap,
+ setDetailsMap,
+}: ICollapsibleProps) {
+ // new Map ์ ์ด์ฉํ ์์ฝ์ด๋ ์ ๋ณด ์ฒ๋ฆฌ
+ // id๋ก ๋ key๋ฅผ ํฌํจํ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์ญ์ (์์ฝ๋์ธ ๋ซ๊ธฐ)
+ // ์์ผ๋ฉด key๊ฐ id์ด๊ณ value๊ฐ res ๊ฐ์ฒด์ธ ๊ฐ์ฒด๋ฅผ detailsMap์ผ๋ก ์ ๋ฌ
+ const onAccordion = async () => {
+ if (detailsMap.has(order.detailId)) {
+ detailsMap.delete(order.detailId);
+ } else {
+ if (!isLoading && data) {
+ setDetailsMap(new Map(detailsMap.set(order.detailId, data)));
+ }
+ }
+ };
+
+ const { data, isLoading } = useQuery(["orderDetail", order.detailId], () =>
+ orderDetail(order.detailId),
+ );
+
+ // ๊ตฌ๋งค ํ์ ๋ฒํผ
+ // ํ์ธ ๋ชจ๋ฌ ๋ฑ์ฅ ํ ๊ตฌ๋งค ํ์ ์ฒ๋ฆฌ
+ const onConfirm = async (
+ event: React.MouseEvent,
+ id: string,
+ ) => {
+ event.preventDefault();
+ event.stopPropagation();
+ const confirmModal = window.confirm(
+ "์ฃผ๋ฌธ ํ์ ์ดํ์๋ ์ทจ์ํ ์ ์์ต๋๋ค. ํ์ ํ์๊ฒ ์ต๋๊น?",
+ );
+ if (confirmModal) {
+ await orderConfirm(id);
+ alert("์ฃผ๋ฌธ ํ์ ๋์์ต๋๋ค.");
+ window.location.reload();
+ }
+ };
+
+ // ๊ตฌ๋งค ์ทจ์ ๋ฒํผ
+ // ํ์ธ ๋ชจ๋ฌ ๋ฑ์ฅ ํ ๊ตฌ๋งค ์ทจ์ ์ฒ๋ฆฌ
+ const onCancle = async (
+ event: React.MouseEvent,
+ id: string,
+ ) => {
+ event.preventDefault();
+ event.stopPropagation();
+ const CanclemModal = window.confirm(
+ "์ฃผ๋ฌธ ์ทจ์์ ์ฃผ๋ฌธ ๊ธ์ก์ด ํ๋ถ๋ฉ๋๋ค. ์ทจ์ํ์๊ฒ ์ต๋๊น?",
+ );
+ if (CanclemModal) {
+ await orderCancel(id);
+ alert("์ฃผ๋ฌธ ์ทจ์๋์์ต๋๋ค.");
+ window.location.reload();
+ }
+ };
+
+ return (
+
+ {order.product.title}
+
+
+ ์ด ์ฃผ๋ฌธ ๊ธ์ก
+ {formatDollar(order.product.price)}
+
+
+ {!order.done && !order.isCanceled ? (
+ <>
+ ) => {
+ onConfirm(event, order.detailId);
+ }}
+ reverse
+ >
+ ํ์
+
+ ) => {
+ onCancle(event, order.detailId);
+ }}
+ orange
+ >
+ ์ทจ์
+
+ >
+ ) : order.done ? (
+ ์ฃผ๋ฌธ ํ์
+ ) : (
+ ์ฃผ๋ฌธ ์ทจ์
+ )}
+
+
+ }
+ >
+
+ {isAccordionOpen && accordionDetails && (
+
+
+
+ ์์ธ ์ฃผ๋ฌธ ์ ๋ณด
+
+ ์ฃผ๋ฌธ ๋ฒํธ
+ {accordionDetails.detailId}
+
+
+ ์ ํ๋ช
+ {accordionDetails.product.title}
+
+
+ ๊ฐ๊ฒฉ
+ {formatDollar(accordionDetails.product.price)}
+
+
+ ๊ฑฐ๋๊ณ์ข
+
+ {accordionDetails.account.bankName} :{" "}
+ {accordionDetails.account.accountNumber}
+
+
+
+
+ )}
+
+
+ );
+}
+
+const OrderList = styled.li`
+ width: 100%;
+ height: 70px;
+ display: flex;
+ transition: 0.1s;
+ padding: 0 1.25rem;
+ border-radius: 5px;
+ align-items: center;
+ justify-content: space-between;
+ border: 1px solid ${(props) => props.theme.colors.gray[7]};
+ &:hover {
+ cursor: pointer;
+ transform: scale(0.99);
+ background-color: ${(props) => props.theme.colors.gray[2]};
+ }
+`;
+
+const Title = styled.span`
+ width: 20%;
+ font-weight: 700;
+ font-size: 1.125rem;
+`;
+
+const Time = styled.span`
+ width: 30%;
+`;
+
+const Price = styled.div`
+ width: 200px;
+ display: flex;
+ justify-content: space-between;
+`;
+
+const OrderButton = styled.div`
+ gap: 8px;
+ width: 136px;
+ display: flex;
+ padding-left: 10px;
+ justify-content: center;
+`;
+
+const OrderText = styled.span`
+ font-weight: 700;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+
+const ConfirmButton = styled(Button)`
+ width: 3.75rem;
+ height: 2.5rem;
+ font-size: 16px;
+ transition: 0.2s;
+ &:hover {
+ color: ${(props) => props.theme.colors.white};
+ background: ${(props) => props.theme.colors.orange.main};
+ }
+`;
+
+const CancleButton = styled(Button)`
+ height: 2.5rem;
+ width: 3.75rem;
+ font-size: 1rem;
+ transition: 0.2s;
+ &:hover {
+ background: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+const DetailBox = styled.div`
+ height: 250px;
+ display: flex;
+ margin-top: 5px;
+ justify-content: center;
+`;
+
+const DetailContent = styled.div`
+ gap: 1.5rem;
+ width: 870px;
+ display: flex;
+ padding: 1.7rem;
+ border-radius: 5px;
+ align-items: center;
+ justify-content: center;
+ background-color: #f8f8f8;
+ border: 1px solid ${(props) => props.theme.colors.gray[7]};
+`;
+
+const DetailImg = styled.img`
+ width: 187px;
+ height: 187px;
+ border-radius: 10px;
+`;
+
+const DetailTitle = styled.h2`
+ height: 2.2rem;
+ font-size: 20px;
+ margin-top: 8px;
+ font-weight: 700;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+
+const DetailText = styled.div`
+ height: 100%;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ div {
+ border-bottom: 1px solid ${(props) => props.theme.colors.gray[7]};
+ width: 98%;
+ margin-left: 5px;
+ margin-bottom: 5px;
+ }
+`;
+
+const DetailList = styled.div`
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ h3 {
+ font-weight: 700;
+ padding-left: 5px;
+ }
+ span {
+ font-size: 14px;
+ color: #9d9d9d;
+ padding-right: 8px;
+ }
+`;
+
+export default UserCollapsible;
diff --git a/src/components/user/UserLayout.tsx b/src/components/user/UserLayout.tsx
new file mode 100644
index 00000000..7963b9ca
--- /dev/null
+++ b/src/components/user/UserLayout.tsx
@@ -0,0 +1,17 @@
+import styled from "styled-components";
+
+type TChildren = {
+ children: React.ReactNode;
+};
+
+function UserLayout({ children }: TChildren) {
+ return {children};
+}
+
+const UserMain = styled.main`
+ width: 100%;
+ display: flex;
+ margin: 22px 0 0 1rem;
+`;
+
+export default UserLayout;
diff --git a/src/components/user/UserLikeList.tsx b/src/components/user/UserLikeList.tsx
new file mode 100644
index 00000000..d5d898f1
--- /dev/null
+++ b/src/components/user/UserLikeList.tsx
@@ -0,0 +1,207 @@
+import Button from "../common/Button";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { ICheckData } from "../common/Header";
+import { useNavigate } from "react-router-dom";
+import { Dispatch, SetStateAction } from "react";
+import { formatDollar } from "../../lib/Function/commonFn";
+
+export interface IProduct {
+ id: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ photo: string | null;
+ isSoldOut: boolean;
+ discountRate: number;
+}
+
+interface ILikeListProps {
+ res: ICheckData | undefined;
+ likes: IProduct[];
+ carts: IProduct[];
+ setLikes: Dispatch>;
+ setCarts: Dispatch>;
+}
+
+function UserLikeList({
+ res,
+ likes,
+ carts,
+ setLikes,
+ setCarts,
+}: ILikeListProps) {
+ const navigate = useNavigate();
+
+ // ์ฐ ๋ชฉ๋ก์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ก ๋ณด๋
+ const postLike = async (updatedLikes: IProduct[]) => {
+ if (res) {
+ localStorage.setItem(`like_${res.email}`, JSON.stringify(updatedLikes));
+ }
+ };
+
+ // ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ก ๋ณด๋
+ const postCart = async (updatedCarts: IProduct[]) => {
+ if (res) {
+ localStorage.setItem(`cart_${res.email}`, JSON.stringify(updatedCarts));
+ }
+ };
+
+ // ์ฅ๋ฐ๊ตฌ๋๋ก ์ํ์ ์ ๋ฌํ๋ ํจ์
+ const onCart = (
+ event: React.MouseEvent,
+ like: IProduct,
+ ) => {
+ event.preventDefault();
+ const updatedCarts = [...carts, like];
+ setCarts(updatedCarts);
+ postCart(updatedCarts);
+ const confirm = window.confirm(
+ "์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ๋ด์์ต๋๋ค. ์ฅ๋ฐ๊ตฌ๋๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?",
+ );
+ if (confirm) {
+ navigate("/cart");
+ }
+ };
+
+ // ์ฐํ ์ํ์ ์ญ์ ํ๋ ํจ์
+ // ์ ํํ ์ํ์ ์ ์ธํ ๋ค๋ฅธ ์ฐ ๋ชฉ๋ก ์ํ๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ก ์ ๋ฌ
+ const onDelete = (
+ event: React.MouseEvent,
+ selectedLike: IProduct,
+ ) => {
+ event.preventDefault();
+ const confirm = window.confirm("์ฐ ๋ชฉ๋ก์์ ์ญ์ ํ์๊ฒ ์ต๋๊น?");
+ if (confirm) {
+ const updatedLikes = likes.filter((like) => like.id !== selectedLike.id);
+ setLikes(updatedLikes);
+ postLike(updatedLikes);
+ }
+ };
+ return (
+
+ {likes.length ? (
+ likes.map((like: IProduct, index) => {
+ return (
+
+
+
+
+ {like.title}
+ {formatDollar(like.price)}
+
+
+
+ {
+ onCart(event, like);
+ }}
+ >
+ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ
+
+ {
+ onDelete(event, like);
+ }}
+ >์ญ์
+
+
+
+ );
+ })
+ ) : (
+ ์ฐํ ์ํ์ด ์์ต๋๋ค.
+ )}
+
+ );
+}
+
+const LikeBox = styled.ul`
+ gap: 5px;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+`;
+
+const Likelist = styled.li`
+ flex-grow: 1;
+ height: 120px;
+ display: flex;
+ padding: 0 1rem;
+ transition: 0.1s;
+ border-radius: 5px;
+ align-items: center;
+ justify-content: space-between;
+ border: 1px solid ${(props) => props.theme.colors.gray[7]};
+ &:hover {
+ transform: scale(0.99);
+ background-color: ${theme.colors.gray[2]};
+ }
+`;
+
+const ListInfo = styled.div`
+ gap: 1.2rem;
+ display: flex;
+ padding: 20px 0;
+ height: 130px;
+ img {
+ border-radius: 5px;
+ }
+`;
+
+const ListText = styled.div`
+ gap: 10px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+`;
+
+const LikeName = styled.span`
+ font-size: 24px;
+ font-weight: 700;
+`;
+
+const LikePrice = styled.span`
+ font-size: 1.125rem;
+`;
+
+const Buttons = styled.div`
+ gap: 10px;
+ display: flex;
+`;
+
+const OnCartButton = styled.button`
+ border: none;
+ font-size: 12px;
+ transition: 0.1s;
+ border-radius: 5px;
+ background-color: transparent;
+ color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ &:hover {
+ cursor: pointer;
+ color: ${theme.colors.white};
+ background-color: ${theme.colors.orange.main};
+ border: 1px solid ${theme.colors.orange.main};
+ }
+`;
+
+const DeleteLikeButton = styled(Button)`
+ line-height: 18px;
+ border: none;
+ &:hover {
+ cursor: pointer;
+ }
+`;
+
+const NoLikes = styled.span`
+ font-weight: 700;
+ font-size: 1.125rem;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+export default UserLikeList;
diff --git a/src/components/user/UserModal.tsx b/src/components/user/UserModal.tsx
new file mode 100644
index 00000000..a78403b6
--- /dev/null
+++ b/src/components/user/UserModal.tsx
@@ -0,0 +1,330 @@
+import styled from "styled-components";
+import GrayInput from "../common/GrayInput";
+import Button from "../common/Button";
+import {
+ Dispatch,
+ SetStateAction,
+ MouseEvent,
+ useState,
+ ChangeEvent,
+ FormEvent,
+ useEffect,
+} from "react";
+import { accountConnect } from "../../lib/API/userAPI";
+import { AiOutlineClose } from "react-icons/ai";
+import { theme } from "../../styles/theme";
+import { useQueryClient } from "react-query";
+
+interface IModalProps {
+ setIsModalOpen: Dispatch>;
+ closeModal: () => void;
+}
+
+interface IBank {
+ name: string;
+ code: string;
+ digits: number[];
+ disabled: boolean;
+}
+
+function AccountModal({ setIsModalOpen, closeModal }: IModalProps) {
+ const [accountForm, setAccountForm] = useState({
+ phoneNumber: "",
+ signature: true,
+ });
+ const [checkedCode, setCheckedCode] = useState("");
+ const [accountNumber, setAccountNumber] = useState("");
+ const [accountNumberBar, setAccountNumberBar] = useState("");
+ const [error, setError] = useState("");
+
+ const queryClient = useQueryClient();
+ const accounts = queryClient.getQueryData("accountList");
+
+ useEffect(() => {
+ setTimeout(() => {
+ setError("");
+ }, 1500);
+ }, [error]);
+
+ // ํผ ์ ์ถ ์์ด ๋ชจ๋ฌ ์ข
๋ฃํ๋ ๋ฒํผ
+ const onClose = (event: MouseEvent) => {
+ event.preventDefault();
+ setIsModalOpen(false);
+ };
+
+ // ์ํ ์ฒดํฌ์ ํด๋น ์ํ์ฝ๋ ์ ๋ฌ ๋ฐ ๋๋ค ๊ณ์ข๋ฒํธ ์์ฑ
+ // ์ํ ์ฝ๋์ ๊ฐ ์๋ฅผ ํฉํด ๊ณ์ข์ ์๋ฆฟ์ ์ ์ฅ
+ // ์๋ฆฟ์์ ํ์๋งํผ ๋๋คํ ํ์๋ฆฌ ์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅ ํ ์ด์ด๋ถ์
+ // ํด๋น ์ซ์๋ฅผ ์ํ ์ฝ๋์ ์๋ฆฟ์๋ฅผ ์ด์ฉํด ์๋ผ ๋ฐฐ์ด์ ์ ์ฅ ํ ํ์ดํ์ผ๋ก ์ด์ด๋ถ์
+ const onCheck = (code: string, digits: number[]) => {
+ let randomNumbers = [];
+ let randomNumbersAddBar = [];
+
+ const subDigits = digits.reduce((acc, cur) => {
+ return acc + cur;
+ });
+
+ for (let i = 0; i < subDigits; i++) {
+ randomNumbers.push(Math.floor(Math.random() * 10).toString());
+ }
+
+ const randomAccount = randomNumbers.join("");
+
+ for (let i = 0; i < digits.length - 1; i++) {
+ if (i === 0) {
+ randomNumbersAddBar.push(randomAccount.slice(i, digits[i]));
+ }
+ randomNumbersAddBar.push(
+ randomAccount.slice(digits[i], digits[i] + digits[i + 1]),
+ );
+ }
+
+ setCheckedCode(code);
+ setAccountNumber(randomAccount);
+ setAccountNumberBar(randomNumbersAddBar.join("-"));
+ };
+
+ // input์ ์
๋ ฅ๋๋ ๊ฐ์ state ๊ฐ์ฒด์ ์ ๋ฌ
+ const onChange = (event: ChangeEvent) => {
+ const { name, value } = event.target;
+ setAccountForm((prev) => {
+ return {
+ ...prev,
+ [name]: value,
+ };
+ });
+ };
+
+ // ํผ ์ ์ถ์ ๊ณ์ข ์ฐ๊ฒฐ ๋ฐ ๋ชจ๋ฌ ์ข
๋ฃ
+ const onSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ const props = Object.values(accountForm) as [string, boolean];
+ const data = await accountConnect(checkedCode, accountNumber, ...props);
+ if (typeof data !== "string") {
+ closeModal();
+ } else {
+ setError(data);
+ }
+ };
+
+ return (
+
+
+
+
+
+ ๊ณ์ข ์ถ๊ฐ
+
+ {accounts
+ ? accounts.map((account: IBank) => {
+ return (
+ account.disabled || (
+
+ {
+ onCheck(account.code, account.digits);
+ }}
+ />
+
+
+ )
+ );
+ })
+ : ""}
+
+
+
+ ์ํ์ฝ๋
+
+
+
+ ๊ณ์ข๋ฒํธ
+
+
+
+ ์ ํ๋ฒํธ
+
+
+
+
+ ์ถ๊ฐํ ์ํ์ ์ ํํ๋ฉด ์ํ์ฝ๋์ ๊ณ์ข๋ฒํธ๊ฐ ์
๋ ฅ๋ฉ๋๋ค.
+ ๊ณ์ข๋ฒํธ์ ์ ํ๋ฒํธ์๋ - ๊ตฌ๋ถ์์ด ์
๋ ฅํด์ฃผ์ธ์.
+
+ {error ? {error} : ""}
+
+ ์ถ๊ฐํ๊ธฐ
+
+
+
+ );
+}
+const ModalBackground = styled.div`
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ backdrop-filter: brightness(60%);
+`;
+
+const Modal = styled.form`
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ width: 640px;
+ height: 660px;
+ display: flex;
+ position: fixed;
+ align-items: center;
+ border-radius: 20px;
+ flex-direction: column;
+ justify-content: space-evenly;
+ background-color: ${(props) => props.theme.colors.white};
+`;
+
+const ModalTitle = styled.h2`
+ font-size: 2.25rem;
+ font-weight: 700;
+ font-family: "GmarketSans";
+`;
+
+const ModalClose = styled.button`
+ top: 1.5rem;
+ right: 2rem;
+ width: 2rem;
+ height: 2rem;
+ border: none;
+ position: absolute;
+ background-color: transparent;
+ color: ${(props) => props.theme.colors.gray[5]};
+
+ &:hover {
+ cursor: pointer;
+ }
+`;
+
+const AccountSelect = styled.ul`
+ width: 470px;
+ height: 139px;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+`;
+
+const UsableAccount = styled.li`
+ height: 22px;
+ width: 235px;
+
+ input[type="radio"] {
+ width: 14px;
+ height: 14px;
+ appearance: none;
+ margin-right: 8px;
+ border-radius: 100%;
+ background-color: white;
+ border: 1px solid ${theme.colors.gray[3]};
+ }
+ input[type="radio"]:checked {
+ border: none;
+ width: 14px;
+ height: 14px;
+ border-radius: 100%;
+ background-color: white;
+ background-color: ${theme.colors.orange.main};
+ }
+
+ label:hover {
+ cursor: pointer;
+ }
+`;
+
+const AccountInputs = styled.div`
+ width: 509px;
+ height: 154px;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ justify-content: space-between;
+`;
+
+const InputBox = styled.div`
+ width: 92%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ span {
+ font-weight: 700;
+ font-size: 1.125rem;
+ }
+ input {
+ width: 380px;
+ }
+`;
+
+const Notes = styled.ul`
+ width: 450px;
+ height: 43px;
+ display: flex;
+ padding: 0.5rem;
+ font-size: 0.75rem;
+ align-items: start;
+ flex-direction: column;
+ justify-content: space-between;
+ color: ${(props) => props.theme.colors.gray[5]};
+
+ li {
+ list-style-type: disc;
+ }
+`;
+
+const AddButton = styled(Button)`
+ width: 428px;
+ height: 50px;
+ transition: 0.1s;
+ font-size: 1.125rem;
+ &:hover {
+ background: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+const ErrorMessage = styled.span`
+ bottom: 185px;
+ font-weight: 700;
+ position: absolute;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+
+export default AccountModal;
diff --git a/src/components/user/UserNav.tsx b/src/components/user/UserNav.tsx
new file mode 100644
index 00000000..f11e0796
--- /dev/null
+++ b/src/components/user/UserNav.tsx
@@ -0,0 +1,108 @@
+import { Link, useLocation } from "react-router-dom";
+import styled from "styled-components";
+import { BiChevronRight } from "react-icons/bi";
+
+function UserNav() {
+ const location = useLocation();
+
+ return (
+
+
+
+ ๋ง์ดํ์ด์ง
+
+
+
+
+ ์ฃผ๋ฌธ ๋ด์ญ
+
+
+
+
+
+ ๊ณ์ข ๊ด๋ฆฌ
+
+
+
+
+
+ ์ฐํ ์ํ
+
+
+
+
+
+ ๊ฐ์ธ์ ๋ณด ์์
+
+
+
+
+
+ );
+}
+
+const Navigator = styled.nav`
+ display: flex;
+ flex-direction: column;
+`;
+
+const NavTitle = styled.div`
+ display: flex;
+ margin: 17px 0;
+ align-items: center;
+`;
+
+const TitleBar = styled.div`
+ width: 5px;
+ height: 2.25rem;
+ margin-right: 10px;
+ background-color: ${(props) => props.theme.colors.orange.main};
+`;
+
+const MyPage = styled.h2`
+ font-weight: 700;
+ font-size: 2.25rem;
+ font-family: "GmarketSans";
+`;
+
+const NavContainer = styled.ul`
+ display: grid;
+ overflow: hidden;
+ border-radius: 5px;
+ grid-template-columns: 285px;
+ grid-template-rows: 1fr 1fr 1fr 1fr;
+ border-top: 1px solid ${(props) => props.theme.colors.gray[3]};
+ border-left: 1px solid ${(props) => props.theme.colors.gray[3]};
+ border-right: 1px solid ${(props) => props.theme.colors.gray[3]};
+`;
+
+const NavList = styled.li<{
+ isOpen?: boolean;
+}>`
+ display: flex;
+ transition: 0.1s;
+ padding: 13px 10px 13px 20px;
+ align-items: center;
+ justify-content: space-between;
+ border-bottom: 1px solid ${(props) => props.theme.colors.gray[3]};
+ background-color: ${({ isOpen, theme }) => isOpen && theme.colors.gray[2]};
+
+ .chebronRight {
+ font-size: 1.5rem;
+ }
+
+ &:hover {
+ background-color: ${(props) => props.theme.colors.gray[2]};
+
+ span {
+ font-size: 21px;
+ }
+ }
+`;
+
+const ListName = styled.span`
+ font-weight: 700;
+ font-size: 1.25rem;
+`;
+
+export default UserNav;
diff --git a/src/components/user/UserSettingAuth.tsx b/src/components/user/UserSettingAuth.tsx
new file mode 100644
index 00000000..4668e241
--- /dev/null
+++ b/src/components/user/UserSettingAuth.tsx
@@ -0,0 +1,137 @@
+import {
+ ChangeEvent,
+ Dispatch,
+ FormEvent,
+ SetStateAction,
+ useState,
+} from "react";
+import GrayInput from "../common/GrayInput";
+import UserTitle from "./UserTitle";
+import styled from "styled-components";
+import Button from "../common/Button";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../common/Header";
+import { theme } from "../../styles/theme";
+
+interface ISettingProps {
+ setIsChecked: Dispatch>;
+}
+
+function SettingAuth({ setIsChecked }: ISettingProps) {
+ const [error, setError] = useState("");
+ const [password, setPassword] = useState("");
+
+ // input ๊ฐ์ state์ ์ ์ฅ
+ const onChange = (event: ChangeEvent) => {
+ const { value } = event.target;
+ setPassword(value);
+ };
+
+ // API header
+ const headers = {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+ };
+
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+
+ // login API๋ฅผ ๋ณํํด ๋น๋ฐ๋ฒํธ ์ธ์ฆ์ฉ ํจ์๋ก ๊ตฌํ
+ // ๋ก๊ทธ์ธ ์ธ์ฆ ํจ์์ธ check๋ฅผ ์ฌ์ฉํด ํ์ฌ ๋ก๊ทธ์ธ ๋ ํ ํฐ์์ email ์ ๋ณด๋ฅผ ์ถ์ถ
+ // ๋ก๊ทธ์ธ์ฉ ์๋ํฌ์ธํธ์ ์ถ์ถํ email์ ์ ๋ฌํ๊ณ ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์
๋ ฅ
+ const getAuth = async (password: string) => {
+ if (res) {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login",
+ {
+ method: "POST",
+ headers,
+ body: JSON.stringify({
+ email: res.email,
+ password,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ }
+ };
+
+ // ํผ ์ ์ถ์ ๋น๋ฐ๋ฒํธ ์ธ์ฆ ํจ์ ๋์
+ // ๊ธฐ์กด ๋ก๊ทธ์ธ API ์ธ์ฆ ์คํจ์ ๋ฌธ์์ด์ด ๋ฐํ๋๋ฏ๋ก ์ด๋ฅผ ์ด์ฉํด ์ธ์ฆ ํต๊ณผ ์ฌ๋ถ ๊ฒฐ์
+ // ์ธ์ฆ ํต๊ณผ์ ์์ ์ปดํฌ๋ํธ๋ก true๊ฐ์ ์ ๋ฌํด ๋ ๋๋ง ํ ์ปดํฌ๋ํธ ๋ณ๊ฒฝ
+ const onSubmit = async (event: FormEvent) => {
+ event.preventDefault();
+ const res = await getAuth(password);
+ typeof res === "string"
+ ? setError("์๋ชป๋ ๋น๋ฐ๋ฒํธ์
๋๋ค!")
+ : setIsChecked(true);
+ setPassword("");
+ };
+
+ return (
+ <>
+
+ ๊ฐ์ธ์ ๋ณด ์์ ์ธ์ฆ
+ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌํ์ธ ํฉ๋๋ค
+
+ {error ? error : ""}
+
+ >
+ );
+}
+
+const SettingRoute = styled.div`
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+`;
+
+const SubTitle = styled.span`
+ display: block;
+ font-weight: 700;
+ font-size: 1.125rem;
+ margin-bottom: 1rem;
+ color: ${theme.colors.orange.main};
+`;
+
+const Form = styled.form`
+ display: flex;
+ align-items: center;
+`;
+
+const SettingInput = styled(GrayInput)`
+ width: 717px;
+ height: 2.5rem;
+ margin-right: 1rem;
+`;
+
+const AuthButton = styled(Button)`
+ transition: 0.5s;
+ font-size: 16px;
+ transition: 0.2s;
+ &:hover {
+ background: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+const ErrorMessage = styled.span`
+ color: #f00;
+ display: block;
+ font-weight: 700;
+ margin-top: 1.25rem;
+`;
+
+export default SettingAuth;
diff --git a/src/components/user/UserSettings.tsx b/src/components/user/UserSettings.tsx
new file mode 100644
index 00000000..a11a0d92
--- /dev/null
+++ b/src/components/user/UserSettings.tsx
@@ -0,0 +1,349 @@
+import { ChangeEvent, useEffect, useState } from "react";
+import styled, { css } from "styled-components";
+import { userUpdate } from "../../lib/API/userAPI";
+import UserTitle from "./UserTitle";
+import GrayInput from "../common/GrayInput";
+import Button from "../common/Button";
+import { useNavigate } from "react-router-dom";
+import { ICheckData } from "../common/Header";
+import { useQueryClient } from "react-query";
+
+function Settings() {
+ const [email, setEmail] = useState("");
+ const [user, setUser] = useState({
+ displayName: "",
+ profileImgBase64: "",
+ oldPassword: "",
+ newPassword: "",
+ });
+ const [result, setResult] = useState("");
+ const [isError, setIsError] = useState(false);
+ const [originalImg, setOriginalImg] = useState("");
+ const [profileImg, setProfileImg] = useState("");
+ const [imgName, setImgName] = useState("");
+ const navigate = useNavigate();
+
+ // ์์ ํผ ์ ์ถ์ ๋ง๋ค result์ '์์ '์ด๋ผ๋ string์ด ํฌํจ๋์ด ์์ง ์์ผ๋ฉด
+ // error๋ก ์ทจ๊ธํ๊ณ ์๋๋ฉด ok๋ก ์ทจ๊ธ
+ // result๊ฐ ๋ณํ๊ณ 2.5์ด ๋ค์ result๋ฅผ ์ด๊ธฐํํด ๋ฉ์์ง๊ฐ ์ฌ๋ผ์ง๊ฒ ์ฒ๋ฆฌ
+ useEffect(() => {
+ if (result) {
+ /์์ /.test(result) ? setIsError(false) : setIsError(true);
+ }
+ setTimeout(() => {
+ setResult("");
+ }, 2500);
+ }, [result]);
+
+ // ํค๋์์ ์บ์ฑ๋ ๋ฐ์ดํฐ์์ email๊ณผ ํ๋กํ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ if (res && res.profileImg !== profileImg && res.email !== email) {
+ setEmail(res.email);
+ setOriginalImg(res.profileImg as string);
+ }
+
+ // ํผ์ ์ ์ถํ๋ฉด ์ ์ ์ ๋ณด๋ฅผ ์์ ํ๊ณ error ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
+ // ๋ ๋น๋ฐ๋ฒํธ input์ค ํ๋๋ง ์
๋ ฅํ ๊ฒฝ์ฐ, ์๋ฌ ๋ฉ์์ง ์ ์ฅ
+ // ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ฉด ์ ์ ์์ ๋ฉ์์ง๋ฅผ result์ ์ ์ฅ
+ // ์๋ฌ ๋ฉ์์ง๊ฐ string์ผ๋ก ๋ฐํ๋๋ฏ๋ก string์ด ๋ฐํ๋๋ฉด ํด๋น ๋ฉ์์ง๋ฅผ ์ ์ฅ
+ // isError์ error ์ฌ๋ถ๋ฅผ ํ๋จํ๋ boolean์ ํ ๋นํด ์คํ์ผ ์ง์
+ const onSubmit = async (event: React.MouseEvent) => {
+ event.preventDefault();
+ const message = await userUpdate(user);
+
+ if (
+ (user.oldPassword && !user.newPassword) ||
+ (!user.oldPassword && user.newPassword)
+ ) {
+ setResult("๋ ๊ฐ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชจ๋ ์
๋ ฅํด์ผ ํฉ๋๋ค.");
+ setIsError(true);
+ } else {
+ if (typeof message === "string") {
+ setResult(message);
+ setIsError(true);
+ } else {
+ setResult("์ ๋ณด๊ฐ ์์ ๋์์ต๋๋ค.");
+ setIsError(false);
+ setUser({
+ displayName: "",
+ profileImgBase64: "",
+ oldPassword: "",
+ newPassword: "",
+ });
+ setTimeout(() => {
+ navigate("/");
+ window.location.reload();
+ }, 1200);
+ }
+ }
+ };
+
+ // input์ ์
๋ ฅํ ๋ด์ฉ์ state์ ์ ์ฅ
+ const onChangeForm = (event: ChangeEvent) => {
+ const { name, value } = event.target;
+ setUser((prev) => {
+ return {
+ ...prev,
+ [name]: value,
+ };
+ });
+ };
+
+ // ์ฌ์ง ํ์ผ์ ์ ํํ๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ base64 ํํ๋ก ์ฝ์ด User์ ProfileImg์ ์ ๋ฌ
+ const changeImg = (event: ChangeEvent) => {
+ const { files, name } = event.target;
+ const reader = new FileReader();
+ for (const file of files as FileList) {
+ reader.readAsDataURL(file);
+ reader.onload = () => {
+ setProfileImg(reader.result as string);
+ setImgName(file.name);
+ setUser((prev) => {
+ return {
+ ...prev,
+ [name]: reader.result,
+ };
+ });
+ };
+ }
+ };
+
+ return (
+
+ ๊ฐ์ธ ์ ๋ณด ์์
+
+
+ ํ๋กํ ์ด๋ฏธ์ง
+
+
+
+ {profileImg ? (
+
+ ) : (
+
+ )}
+
+
+
+ ํ์ผ์ ํ
+ {imgName ? imgName : `์ ํ๋ ํ์ผ ์์`}
+
+
+
+ ์ด๋ฉ์ผ
+
+
+ {email}
+
+
+ ๋๋ค์
+
+
+
+
+
+ ๊ธฐ์กด ๋น๋ฐ๋ฒํธ
+ ์ ๋น๋ฐ๋ฒํธ
+
+
+
+
+
+
+
+ {result ? result : ""}
+
+ {Object.keys(user).length ? (
+
+ ์ ์ฅํ๊ธฐ
+
+ ) : (
+ ""
+ )}
+
+ );
+}
+
+const SettingsForm = styled.form`
+ width: 100%;
+ position: relative;
+ flex-direction: column;
+`;
+
+const SettingsBox = styled.div`
+ width: 100%;
+ display: grid;
+ margin-bottom: 1.25rem;
+ grid-template-columns: 1fr 3fr;
+ grid-template-rows: 240px 80px 80px 150px;
+
+ > div {
+ display: flex;
+ padding: 10px 2rem;
+ border-bottom: 1px solid ${(props) => props.theme.colors.gray[3]};
+
+ input {
+ height: 2.5rem;
+ }
+
+ :nth-child(1),
+ :nth-child(2) {
+ border-top: 1px solid ${(props) => props.theme.colors.gray[3]};
+ }
+
+ :nth-child(2n-1) {
+ font-weight: 700;
+ font-size: 1.125rem;
+ background-color: ${(props) => props.theme.colors.gray[2]};
+ }
+ }
+`;
+
+const ImgTitle = styled.div`
+ span {
+ display: block;
+ margin-top: 1.25rem;
+ }
+`;
+const ImgInput = styled.div`
+ gap: 1.6rem;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+`;
+
+const ImgBox = styled.div`
+ width: 8.5rem;
+ display: flex;
+ height: 8.5rem;
+ border-radius: 50%;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid ${(props) => props.theme.colors.gray[2]};
+
+ img {
+ width: 8rem;
+ height: 8rem;
+ object-fit: cover;
+ border-radius: 50%;
+ }
+`;
+
+const InputBox = styled.div`
+ gap: 1rem;
+ display: flex;
+ align-items: center;
+
+ input {
+ display: none;
+ }
+
+ span {
+ color: ${(props) => props.theme.colors.gray[5]};
+ }
+`;
+
+const FileSelect = styled.label`
+ width: 80px;
+ display: flex;
+ height: 1.5rem;
+ transition: 0.2s;
+ font-size: 0.75rem;
+ align-items: center;
+ border-radius: 2rem;
+ justify-content: center;
+ color: ${(props) => props.theme.colors.orange.main};
+ border: 1px solid ${(props) => props.theme.colors.orange.main};
+
+ &:hover {
+ cursor: pointer;
+ color: ${(props) => props.theme.colors.white};
+ background-color: ${(props) => props.theme.colors.orange.main};
+ }
+`;
+
+const EmailTitle = styled.div`
+ align-items: center;
+`;
+const EmailViewer = styled.div`
+ display: flex;
+ font-size: 1.125rem;
+ align-items: center;
+`;
+const NameTitle = styled.div`
+ align-items: center;
+`;
+const NameInput = styled.div`
+ display: flex;
+ align-items: center;
+`;
+const PassWordTitle = styled.div`
+ flex-direction: column;
+ justify-content: space-around;
+`;
+const PassWordInput = styled.div`
+ flex-direction: column;
+ justify-content: space-around;
+`;
+
+const Message = styled.span<{
+ error?: boolean;
+ ok?: boolean;
+}>`
+ ${(props) =>
+ props.error &&
+ css`
+ color: #f00;
+ font-weight: 700;
+ font-size: 1.125rem;
+ `}
+ ${(props) =>
+ props.ok &&
+ css`
+ color: #0ba72d;
+ font-weight: 700;
+ font-size: 1.125rem;
+ `}
+`;
+
+const SaveButton = styled(Button)`
+ right: 0;
+ width: 120px;
+ transition: 0.2s;
+ position: absolute;
+ font-size: 1.125rem;
+
+ &:hover {
+ background: ${(props) => props.theme.colors.orange.hover};
+ }
+`;
+
+export default Settings;
diff --git a/src/components/user/UserTitle.tsx b/src/components/user/UserTitle.tsx
new file mode 100644
index 00000000..77f2dbbe
--- /dev/null
+++ b/src/components/user/UserTitle.tsx
@@ -0,0 +1,21 @@
+import styled from "styled-components";
+
+type TChildren = {
+ children: React.ReactNode;
+};
+
+function UserTitle({ children }: TChildren) {
+ return {children};
+}
+
+const Title = styled.h2`
+ display: block;
+ font-weight: 700;
+ font-size: 1.75rem;
+ margin-bottom: 1rem;
+ padding-bottom: 1.25rem;
+ font-family: "GmarketSans";
+ border-bottom: 1px solid ${(props) => props.theme.colors.gray[3]};
+`;
+
+export default UserTitle;
diff --git a/src/containers/auth/LoginForm.tsx b/src/containers/auth/LoginForm.tsx
new file mode 100644
index 00000000..408188ef
--- /dev/null
+++ b/src/containers/auth/LoginForm.tsx
@@ -0,0 +1,73 @@
+import { FormEvent, useEffect } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import { useNavigate } from "react-router-dom";
+import AuthForm from "../../components/auth/AuthForm";
+import { TRootState } from "../../modules";
+import { changeField, initializeForm, login } from "../../modules/auth";
+import { check } from "../../lib/API/userAPI";
+
+function LoginForm() {
+ const dispatch = useDispatch();
+ const navigate = useNavigate();
+ const { form, auth, authError, user } = useSelector(
+ ({ auth, user }: TRootState) => ({
+ form: auth.login,
+ auth: auth.auth,
+ authError: auth.authError,
+ user: user.user,
+ }),
+ );
+ const onChange = (event: FormEvent) => {
+ const { name, value } = event.target as HTMLInputElement;
+ dispatch(
+ changeField({
+ form: "login",
+ key: name,
+ value,
+ }),
+ );
+ };
+
+ const onSubmit = (event: FormEvent) => {
+ event.preventDefault();
+ const { email, password } = form;
+ dispatch(login({ email, password }));
+ };
+
+ useEffect(() => {
+ dispatch(initializeForm("login"));
+ }, [dispatch]);
+
+ useEffect(() => {
+ if (authError) {
+ console.log("์ค๋ฅ ๋ฐ์!");
+ console.log(authError);
+ return;
+ }
+ if (auth) {
+ console.log("๋ก๊ทธ์ธ ์ฑ๊ณต");
+ // dispatch(check());
+ navigate("/", {
+ state: { name: localStorage.getItem("username") },
+ });
+ }
+ }, [auth, authError, navigate, dispatch]);
+
+ useEffect(() => {
+ if (user) {
+ navigate("/");
+ }
+ }, [navigate, user]);
+
+ return (
+ //
+ null
+ );
+}
+
+export default LoginForm;
diff --git a/src/containers/auth/RegisterForm.tsx b/src/containers/auth/RegisterForm.tsx
new file mode 100644
index 00000000..d331beb0
--- /dev/null
+++ b/src/containers/auth/RegisterForm.tsx
@@ -0,0 +1,71 @@
+import { FormEvent, useEffect } from "react";
+import { useDispatch, useSelector } from "react-redux";
+import AuthForm from "../../components/auth/AuthForm";
+import { changeField, initializeForm, register } from "../../modules/auth";
+import { check } from "../../lib/API/userAPI";
+
+function RegisterForm() {
+ // hooks
+ const dispatch = useDispatch();
+ const { form, auth, authError, user } = useSelector(({ auth, user }) => ({
+ form: auth.register,
+ auth: auth.auth,
+ authError: auth.authError,
+ user: user.user,
+ }));
+
+ // ํจ์
+ const onChange = (event: FormEvent) => {
+ const { name, value } = event.target as HTMLInputElement;
+ dispatch(
+ changeField({
+ form: "register",
+ key: name,
+ value,
+ }),
+ );
+ };
+
+ const onSubmit = (event: FormEvent) => {
+ event.preventDefault();
+ const { email, password, passwordConfirm } = form;
+ if (password !== passwordConfirm) {
+ return;
+ }
+ dispatch(register({ email, password }));
+ };
+
+ useEffect(() => {
+ dispatch(initializeForm("register"));
+ }, [dispatch]);
+
+ useEffect(() => {
+ if (authError) {
+ console.log("์ค๋ฅ ๋ฐ์!", authError);
+ return;
+ }
+ if (auth) {
+ console.log("ํ์๊ฐ์
์ฑ๊ณต!", auth);
+ // dispatch(check());
+ }
+ }, [auth, authError, dispatch]);
+
+ useEffect(() => {
+ if (user) {
+ console.log("check ์ฑ๊ณต");
+ console.log(user);
+ }
+ }, [user]);
+
+ return (
+ //
+ null
+ );
+}
+
+export default RegisterForm;
diff --git a/src/index.tsx b/src/index.tsx
new file mode 100644
index 00000000..b3e24b71
--- /dev/null
+++ b/src/index.tsx
@@ -0,0 +1,33 @@
+import ReactDOM from "react-dom/client";
+import GlobalStyle from "./styles/GlobalStyle";
+import { ThemeProvider } from "styled-components";
+import { theme } from "./styles/theme";
+import App from "./App";
+import { configureStore } from "@reduxjs/toolkit";
+import { ReactQueryDevtools } from "react-query/devtools";
+import { Provider } from "react-redux";
+import rootReducer, { rootSaga } from "./modules";
+import createSagaMiddleware from "@redux-saga/core";
+import { QueryClient, QueryClientProvider } from "react-query";
+
+const queryClient = new QueryClient();
+const sagaMiddleware = createSagaMiddleware();
+const store = configureStore({
+ reducer: rootReducer,
+ middleware: [sagaMiddleware],
+ devTools: true,
+});
+
+sagaMiddleware.run(rootSaga);
+
+ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
+
+
+
+
+
+
+
+
+ ,
+);
diff --git a/src/lib/API/adminAPI.ts b/src/lib/API/adminAPI.ts
new file mode 100644
index 00000000..090fb2dd
--- /dev/null
+++ b/src/lib/API/adminAPI.ts
@@ -0,0 +1,263 @@
+export interface IProduct {
+ id?: string;
+ title?: string;
+ price: number;
+ description?: string;
+ tags?: string[];
+ thumbnail?: string;
+ photo?: string;
+ discountRate?: number;
+ isSoldOut?: boolean;
+}
+
+export interface UserList {
+ email: string;
+ displayName: string;
+ profileImg?: string;
+}
+
+export interface IProductLike extends IProduct {
+ like?: boolean;
+}
+
+export interface IProductEdit extends IProduct {
+ isSoldOut?: boolean;
+}
+
+export interface IProductLike extends IProduct {
+ like?: boolean;
+}
+
+export interface RequestBodyEdit {
+ title: string; // ์ ํ ์ด๋ฆ (ํ์!)
+ price: number; // ์ ํ ๊ฐ๊ฒฉ (ํ์!)
+ description: string; // ์ ํ ์์ธ ์ค๋ช
(ํ์!)
+ tags?: string[]; // ์ ํ ํ๊ทธ
+ thumbnailBase64?: string; // ์ ํ ์ธ๋ค์ผ(๋ํ) ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
+ photoBase64?: string; // ์ ํ ์์ธ ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
+ discountRate?: number; // ์ ํ ํ ์ธ์จ
+}
+
+export interface IEditProduct {
+ tags?: string[];
+ price?: number;
+ title?: string;
+ isSoldOut?: boolean;
+ discountRate?: number;
+ description?: string;
+ photoBase64?: string;
+ thumbnailBase64?: string;
+}
+
+export interface IOrdalDetailAll {
+ detailId: string;
+ user: {
+ email: string;
+ displayName: string;
+ profileImg: string | null;
+ };
+ account: {
+ bankName: string;
+ bankCode: string;
+ accountNumber: string;
+ };
+ product: {
+ productId: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ discountRate: number;
+ };
+ timePaid: string; // ์ ํ์ ๊ฑฐ๋ํ ์๊ฐ
+ isCanceled: boolean; // ๊ฑฐ๋ ์ทจ์ ์ฌ๋ถ
+ done: boolean; // ๊ฑฐ๋ ์๋ฃ ์ฌ๋ถ
+}
+
+interface RequestBodyAdd {
+ title: string; // ์ ํ ์ด๋ฆ (ํ์!)
+ price: number; // ์ ํ ๊ฐ๊ฒฉ (ํ์!)
+ description: string; // ์ ํ ์์ธ ์ค๋ช
(ํ์!)
+ tags?: string[]; // ์ ํ ํ๊ทธ
+ thumbnailBase64?: string; // ์ ํ ์ธ๋ค์ผ(๋ํ) ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
+ photoBase64?: string; // ์ ํ ์์ธ ์ฌ์ง(base64) - jpg, jpeg, webp, png, gif, svg
+ discountRate?: number; // ์ ํ ํ ์ธ์จ
+}
+
+interface ISalesManage {
+ isCanceled?: boolean;
+ done?: boolean;
+}
+
+// fetch headers
+const headers = {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+};
+
+// ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
+const userCheck = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/users",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๋ชจ๋ ์ ํ ์กฐํ
+const productsList = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+//์ ์ฒด ๊ฑฐ๋(ํ๋งค) ๋ด์ญ
+const salesHistory = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/all",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๊ฑฐ๋(ํ๋งค) ๋ด์ญ ์๋ฃ/์ทจ์ ๋ฐ ํด์
+const salesManage = async (detailID: string, saleManage: ISalesManage) => {
+ try {
+ const response = await fetch(
+ `https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/${detailID}`,
+ {
+ method: "PUT",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ body: JSON.stringify(saleManage),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ์ถ๊ฐ
+const productPost = async (
+ product: RequestBodyAdd,
+ thumbnailBase64: string,
+ photoBase64: string,
+) => {
+ const updatedProduct = { ...product, thumbnailBase64, photoBase64 };
+ try {
+ const res = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ body: JSON.stringify(updatedProduct),
+ },
+ );
+ const result = await res.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ์์
+const productEdit = async (
+ id: string,
+ product: IEditProduct,
+ thumbnailBase64: string,
+ photoBase64: string,
+) => {
+ const updatedProduct = { ...product, thumbnailBase64, photoBase64 };
+ //์
๋ ฅ๊ฐ ์์ฃผ์ product๊ณผ Base64๋ก ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ํ๋ฅผ ๋ฐ์์ API๋ก ์์ ์์ฒญ
+ try {
+ const res = await fetch(
+ `https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/${id}`,
+ {
+ method: "PUT",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ body: JSON.stringify(updatedProduct),
+ },
+ );
+ const result = await res.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ์ญ์
+const productDel = async (productID: string) => {
+ try {
+ const response = await fetch(
+ `https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/${productID}`,
+ {
+ method: "DELETE",
+ headers: {
+ ...headers,
+ masterKey: "true",
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+export {
+ userCheck,
+ productPost,
+ productEdit,
+ productDel,
+ productsList,
+ salesHistory,
+ salesManage,
+};
diff --git a/src/lib/API/client.ts b/src/lib/API/client.ts
new file mode 100644
index 00000000..72b7add8
--- /dev/null
+++ b/src/lib/API/client.ts
@@ -0,0 +1,42 @@
+import axios, { AxiosRequestConfig } from "axios";
+
+const BASE_URL = "https://asia-northeast3-heropy-api.cloudfunctions.net";
+
+const axiosConfig: AxiosRequestConfig = {
+ baseURL: BASE_URL,
+ headers: {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+ },
+};
+
+const testConfig: AxiosRequestConfig = {
+ baseURL: BASE_URL,
+ headers: {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+ Authorization: `Bearer ${localStorage.getItem("token")}`,
+ },
+};
+
+const client = axios.create(axiosConfig);
+
+export const testClient = axios.create(testConfig);
+
+// ํค๋ ์ค์
+// client.defaults.headers.common[
+// "Authorization"
+// ] = `Bearer ${localStorage.getItem("token")}`;
+
+// axios.interceptors.response.use(
+// (response) => {
+// return response;
+// },
+// (error) => {
+// return Promise.reject(error);
+// },
+// );
+
+export default client;
diff --git a/src/lib/API/commonAPI.ts b/src/lib/API/commonAPI.ts
new file mode 100644
index 00000000..f901254b
--- /dev/null
+++ b/src/lib/API/commonAPI.ts
@@ -0,0 +1,37 @@
+export interface IProductDetail {
+ id?: string;
+ title?: string;
+ price?: number;
+ description?: string;
+ tags?: string[];
+ thumbnail?: string;
+ photo?: string;
+ discountRate?: number;
+ isSoldOut: boolean;
+}
+
+// fetch headers
+const headers = {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+};
+
+// ๋จ์ผ ์ ํ ์์ธ ์กฐํ
+const productDetail = async (productID: string) => {
+ try {
+ const response = await fetch(
+ `https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/${productID}`,
+ {
+ method: "GET",
+ headers,
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+export { productDetail };
diff --git a/src/lib/API/userAPI.ts b/src/lib/API/userAPI.ts
new file mode 100644
index 00000000..39ff7a78
--- /dev/null
+++ b/src/lib/API/userAPI.ts
@@ -0,0 +1,354 @@
+// import client, { testClient } from "./client";
+
+interface IUserUpdate {
+ displayName?: string;
+ profileImgBase64?: string;
+ oldPassword?: string;
+ newPassword?: string;
+}
+
+// fetch headers
+const headers = {
+ "content-type": "application/json",
+ apikey: "KDT5_nREmPe9B",
+ username: "KDT5_TeamAirPod8",
+};
+
+// ๋ก๊ทธ์ธ
+// ๋ก๊ทธ์ธ
+const login = async (email: string, password?: string) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login",
+ {
+ method: "POST",
+ headers,
+ body: JSON.stringify({
+ email,
+ password,
+ }),
+ },
+ );
+ const result = await response.json();
+ localStorage.setItem("Token", result.accessToken);
+ localStorage.setItem("username", result.user.displayName);
+ return result;
+ } catch (e) {
+ console.error(e, "๋ก๊ทธ์ธ์ ์คํจํ์ต๋๋ค!");
+ }
+};
+
+// ํ์๊ฐ์
+const register = async (
+ email: string,
+ password: string,
+ displayName: string,
+ profileImgBase64: string,
+) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/signup",
+ {
+ method: "POST",
+ headers,
+ body: JSON.stringify({
+ email,
+ password,
+ displayName,
+ profileImgBase64,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e, "ํ์๊ฐ์
์ ์คํจํ์ต๋๋ค!");
+ }
+};
+
+// ์ธ์ฆํ์ธ
+const check = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๋ก๊ทธ์์
+const logout = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/logout",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ฌ์ฉ์ ์ ๋ณด ์์
+const userUpdate = async (user: IUserUpdate) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user",
+ {
+ method: "PUT",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify(user),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ๊ฐ๋ฅํ ์ํ ๋ชฉ๋ก ์กฐํ
+const accountList = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/account/banks",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๊ณ์ข ๋ชฉ๋ก ๋ฐ ์์ก ์กฐํ
+const myAccount = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/account",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๊ณ์ข ์ฐ๊ฒฐ
+const accountConnect = async (
+ bankCode: string,
+ accountNumber: string,
+ phoneNumber: string,
+ signature: boolean,
+) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/account",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ bankCode,
+ accountNumber,
+ phoneNumber,
+ signature,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๊ณ์ข ํด์ง
+const accountDisconnect = async (accountId: string, signature: boolean) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/account",
+ {
+ method: "DELETE",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ accountId,
+ signature,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ๊ตฌ๋งค ์ ์ฒญ
+
+const orderApply = async (productId: string, accountId: string) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/buy",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ productId,
+ accountId,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ์ทจ์
+const orderCancel = async (detailId: string) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/cancel",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ detailId,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ๊ฑฐ๋(๊ตฌ๋งค) ํ์
+const orderConfirm = async (detailId: string) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/ok",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ detailId,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ์ ํ ์ ์ฒด ๊ฑฐ๋(๊ตฌ๋งค) ๋ด์ญ
+const orderDetailsAll = async () => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/details",
+ {
+ method: "GET",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+// ๋จ์ผ ์ ํ ์์ธ ๊ฑฐ๋(๊ตฌ๋งค) ๋ด์ญ
+const orderDetail = async (detailId: string) => {
+ try {
+ const response = await fetch(
+ "https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/detail",
+ {
+ method: "POST",
+ headers: {
+ ...headers,
+ Authorization: `Bearer ${localStorage.getItem("Token")}`,
+ },
+ body: JSON.stringify({
+ detailId,
+ }),
+ },
+ );
+ const result = await response.json();
+ return result;
+ } catch (e) {
+ console.error(e);
+ }
+};
+
+export {
+ login,
+ register,
+ check,
+ logout,
+ userUpdate,
+ accountList,
+ myAccount,
+ accountConnect,
+ accountDisconnect,
+ orderApply,
+ orderCancel,
+ orderConfirm,
+ orderDetailsAll,
+ orderDetail,
+};
diff --git a/src/lib/Function/commonFn.ts b/src/lib/Function/commonFn.ts
new file mode 100644
index 00000000..06ccce65
--- /dev/null
+++ b/src/lib/Function/commonFn.ts
@@ -0,0 +1,33 @@
+interface IDiscount {
+ price: number;
+ discountRate: number;
+}
+
+// API์์ ๋ฐ์์จ ์๊ฐ์ ํ๊ตญ ์๊ฐ์ผ๋ก ์กฐ์ ํ๊ณ ์ํ๋ ํฌ๋งท์ผ๋ก ์์
+// ์) 2023-06-15T00:00:00.000Z -> 2023-06-15 00:00:00
+const adjustDate = (date: string) => {
+ const parsedTime = new Date(date);
+ const adjustedTime = new Date(parsedTime.getTime() + 9 * 60 * 60 * 1000);
+ return adjustedTime
+ .toISOString()
+ .replace("T", " ")
+ .replace(/\.\d+Z$/, "");
+};
+
+// ๋ฌ๋ฌ ํ๊ธฐ ๋ณํ
+// ์) 3000000 -> $3,000,000
+const formatDollar = (dollar: number | undefined) => {
+ if (dollar) {
+ const formattedDollar = "$" + dollar.toLocaleString("en-US");
+ return formattedDollar;
+ }
+};
+
+const formatDiscount = ({ price, discountRate }: IDiscount): number => {
+ if (price && discountRate) {
+ return price * (discountRate / 100);
+ }
+ return 0;
+};
+
+export { adjustDate, formatDollar, formatDiscount };
diff --git a/src/lib/createRequestSaga.ts b/src/lib/createRequestSaga.ts
new file mode 100644
index 00000000..60430992
--- /dev/null
+++ b/src/lib/createRequestSaga.ts
@@ -0,0 +1,33 @@
+import { call, put } from "@redux-saga/core/effects";
+import { ResponseType } from "axios";
+import { finishLoading, startLoading } from "../modules/loading";
+
+export const createRequestActionTypes = (type: string) => {
+ const SUCCESS = `${type}_SUCCESS`;
+ const FAILURE = `${type}_FAILURE`;
+ return [type, SUCCESS, FAILURE];
+};
+
+export default function createRequestSaga(type: string, request: any) {
+ const SUCCESS = `${type}_SUCCESS`;
+ const FAILURE = `${type}_FAILURE`;
+
+ return function* (action: any) {
+ yield put(startLoading(type));
+ try {
+ const response: ResponseType = yield call(request, action.payload);
+ console.log(response);
+ yield put({
+ type: SUCCESS,
+ payload: action.payload,
+ });
+ } catch (e) {
+ yield put({
+ type: FAILURE,
+ payload: e,
+ error: true,
+ });
+ }
+ yield put(finishLoading(type));
+ };
+}
diff --git a/src/modules/auth.ts b/src/modules/auth.ts
new file mode 100644
index 00000000..e9830a51
--- /dev/null
+++ b/src/modules/auth.ts
@@ -0,0 +1,103 @@
+import produce from "immer";
+import { ActionType, createAction, createReducer } from "typesafe-actions";
+import createRequestSaga, {
+ createRequestActionTypes,
+} from "../lib/createRequestSaga";
+import * as userAPI from "../lib/API/userAPI";
+import { takeLatest } from "@redux-saga/core/effects";
+
+// ์ก์
+const CHANGE_FIELD = "auth/CHANGE_FIELD" as const;
+const INITIALIZE_FORM = "auth/INITIALIZE_FORM" as const;
+
+const [REGISTER, REGISTER_SUCCESS, REGISTER_FAILURE] =
+ createRequestActionTypes("auth/REGISTER");
+const [LOGIN, LOGIN_SUCCESS, LOGIN_FAILURE] =
+ createRequestActionTypes("auth/LOGIN");
+
+// ์ก์
์์ฑ ํจ์
+export const changeField = createAction(
+ CHANGE_FIELD,
+ ({ form, key, value }) => ({
+ form,
+ key,
+ value,
+ }),
+)();
+export const initializeForm = createAction(INITIALIZE_FORM, (form) => form)();
+export const register = createAction(
+ REGISTER,
+ ({ email, password, displayName, profileImgBase64 }) => ({
+ email,
+ password,
+ displayName,
+ profileImgBase64,
+ }),
+)();
+export const login = createAction(LOGIN, ({ email, password }) => ({
+ email,
+ password,
+}))();
+
+// ์ฌ๊ฐ ์์ฑ
+const registerSaga = createRequestSaga(REGISTER, userAPI.register);
+const loginSaga = createRequestSaga(LOGIN, userAPI.login);
+
+export function* userSaga() {
+ yield takeLatest(REGISTER, registerSaga);
+ yield takeLatest(LOGIN, loginSaga);
+}
+
+// ์ก์
์์ฑ ํจ์๋ฅผ actions๋ผ๋ ๊ฐ์ฒด์ ํ ๋น
+const actions = { changeField, initializeForm, register, login };
+type TAuthAction = ActionType;
+type TAuthState = {
+ [props: string]: any;
+};
+
+const initialState: TAuthState = {
+ register: {
+ email: "",
+ password: "",
+ displayName: "",
+ profileImgBase64: "",
+ },
+ login: {
+ email: "",
+ password: "",
+ },
+ auth: null,
+ authError: null,
+};
+
+const auth = createReducer(initialState, {
+ [CHANGE_FIELD]: (state, { payload: { form, key, value } }) =>
+ produce(state, (draft) => {
+ draft[form][key] = value;
+ }),
+ [INITIALIZE_FORM]: (state, { payload: form }) => ({
+ ...state,
+ [form]: initialState[form],
+ authError: null,
+ }),
+ [REGISTER_SUCCESS]: (state, { payload: auth }) => ({
+ ...state,
+ authError: null,
+ auth,
+ }),
+ [REGISTER_FAILURE]: (state, { payload: error }) => ({
+ ...state,
+ authError: error,
+ }),
+ [LOGIN_SUCCESS]: (state, { payload: auth }) => ({
+ ...state,
+ authError: null,
+ auth,
+ }),
+ [LOGIN_FAILURE]: (state, { payload: error }) => ({
+ ...state,
+ authError: error,
+ }),
+});
+
+export default auth;
diff --git a/src/modules/buyItem.ts b/src/modules/buyItem.ts
new file mode 100644
index 00000000..9d186ee8
--- /dev/null
+++ b/src/modules/buyItem.ts
@@ -0,0 +1,33 @@
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+
+export interface IBuyItem {
+ productId: string;
+ title: string;
+ quantity: number;
+ price: number;
+ discountRate: number;
+}
+
+type TBuyState = IBuyItem[];
+
+const initialState: TBuyState = [];
+
+const buyItemSlice = createSlice({
+ name: "buyItem",
+ initialState,
+ reducers: {
+ buyItem: (state, action: PayloadAction) => {
+ const { title, quantity, price, discountRate, productId } =
+ action.payload;
+ state.push({
+ productId,
+ title,
+ quantity,
+ price,
+ discountRate,
+ });
+ },
+ },
+});
+export const { buyItem } = buyItemSlice.actions;
+export default buyItemSlice.reducer;
diff --git a/src/modules/cartItem.ts b/src/modules/cartItem.ts
new file mode 100644
index 00000000..c6ec5c33
--- /dev/null
+++ b/src/modules/cartItem.ts
@@ -0,0 +1,46 @@
+import { createSlice, PayloadAction } from "@reduxjs/toolkit";
+
+interface ICartItem {
+ productId: string;
+ title: string;
+ quantity: number;
+ price: number;
+ discountRate: number;
+}
+
+type TCartState = ICartItem[];
+
+const initialState: TCartState = [];
+
+const cartSlice = createSlice({
+ name: "cart",
+
+ initialState,
+
+ reducers: {
+ setQuantity: (state, action: PayloadAction) => {
+ const { title, quantity, price, discountRate, productId } =
+ action.payload;
+ // ๊ธฐ์กด์ ์์ดํ
์ ์ฐพ์ ์ธ๋ฑ์ค๋ฅผ ๊ตฌํจ
+ const itemIdx = state.findIndex((item) => item.title === title);
+
+ // ์กด์ฌํ๋ค๋ฉด,
+ if (itemIdx !== -1) {
+ // ๊ธฐ์กด์ ์์ดํ
์ ์ญ์
+ state.splice(itemIdx, 1);
+ }
+
+ // (์์ ๋ ์๋์ ๊ฐ์ง) ์๋ก์ด ์์ดํ
์ ์ถ๊ฐ
+ state.push({
+ productId,
+ title,
+ quantity,
+ price,
+ discountRate,
+ });
+ },
+ },
+});
+
+export const { setQuantity } = cartSlice.actions;
+export default cartSlice.reducer;
diff --git a/src/modules/index.ts b/src/modules/index.ts
new file mode 100644
index 00000000..8759393b
--- /dev/null
+++ b/src/modules/index.ts
@@ -0,0 +1,23 @@
+import { combineReducers } from "@reduxjs/toolkit";
+import loading from "./loading";
+import auth, { userSaga } from "./auth";
+import cartItem from "./cartItem";
+import buyItem from "./buyItem";
+import user, { userCheckSaga } from "./user";
+import { all } from "redux-saga/effects";
+
+const rootReducer = combineReducers({
+ loading,
+ auth,
+ cartItem,
+ user,
+ buyItem,
+});
+
+export function* rootSaga() {
+ yield all([userSaga(), userCheckSaga()]);
+}
+
+export default rootReducer;
+
+export type TRootState = ReturnType;
diff --git a/src/modules/loading.ts b/src/modules/loading.ts
new file mode 100644
index 00000000..fef7a7bc
--- /dev/null
+++ b/src/modules/loading.ts
@@ -0,0 +1,46 @@
+/*
+ 2023.06.20
+ - ๊ธฐ์กด์ ๋ฆฌ๋์ค ์ก์
์ typesafe-actions๋ก ๋ณ๊ฒฝ
+ - ๋ฆฌ๋์๋ createReducer์ handleReducer๋ก ์์ฑ
+*/
+
+import { ActionType, createAction, createReducer } from "typesafe-actions";
+
+// ์ก์
+const START_LOADING = "loading/START_LOADING" as const;
+const FINISH_LOADING = "loading/FINISH_LOADING" as const;
+
+// ์ก์
์์ฑ ํจ์
+export const startLoading = createAction(
+ START_LOADING,
+ (requestType) => requestType,
+)();
+
+export const finishLoading = createAction(
+ FINISH_LOADING,
+ (requestType) => requestType,
+)();
+
+// ์ก์
๊ฐ์ฒด์ ๋ํ ํ์
+// ์ก์
๊ฐ์ฒด ํ์
์ ์ก์
์์ฑํจ์๋ฅผ ์ฐธ์กฐํด์ ์ ์ถ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ๋๋ฆญ์ ์๋ตํด๋ ๋ฌด๋ฐฉ.
+const actions = { startLoading, finishLoading }; // ๋ชจ๋ ์ก์
์์ฑํจ์๋ค์ actions ๊ฐ์ฒด์ ๋ฃ์
+type TLoadingAction = ActionType; // ActionType์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ก์
๊ฐ์ฒด ํ์
์ค๋น
+
+// ๊ด๋ฆฌํ ์ํ์ ํ์
+type TLoadingState = {};
+
+// ์ด๊ธฐ ์ํ
+const initialState: TLoadingState = {};
+
+// ๋ฆฌ๋์
+const loading = createReducer(initialState)
+ .handleAction(startLoading, (state, action) => ({
+ ...state,
+ [action.payload]: true,
+ }))
+ .handleAction(finishLoading, (state, action) => ({
+ ...state,
+ [action.payload]: false,
+ }));
+
+export default loading;
diff --git a/src/modules/user.ts b/src/modules/user.ts
new file mode 100644
index 00000000..ba511356
--- /dev/null
+++ b/src/modules/user.ts
@@ -0,0 +1,50 @@
+import { ActionType, createAction, createReducer } from "typesafe-actions";
+import createRequestSaga, {
+ createRequestActionTypes,
+} from "../lib/createRequestSaga";
+import * as userAPI from "../lib/API/userAPI";
+import { takeLatest } from "redux-saga/effects";
+
+const TEMP_SET_USER = "user/TEMP_SET_USER" as const;
+
+const [CHECK, CHECK_SUCCESS, CHECK_FAILURE] =
+ createRequestActionTypes("user/CHECK");
+
+export const tempSetUser = createAction(TEMP_SET_USER, (user) => user)();
+export const check = createAction(CHECK, () => null)();
+
+const actions = { tempSetUser, check };
+type TUserAction = ActionType;
+type TUserState = {
+ user: null;
+ checkError: null;
+};
+
+const checkSaga = createRequestSaga(CHECK, userAPI.check);
+export function* userCheckSaga() {
+ yield takeLatest(CHECK, checkSaga);
+}
+
+const initialState: TUserState = {
+ user: null,
+ checkError: null,
+};
+
+const user = createReducer(initialState, {
+ [TEMP_SET_USER]: (state, user) => ({
+ ...state,
+ user,
+ }),
+ [CHECK_SUCCESS]: (state, { payload: user }) => ({
+ ...state,
+ user,
+ checkError: null,
+ }),
+ [CHECK_FAILURE]: (state, { payload: error }) => ({
+ ...state,
+ user: null,
+ checkError: error,
+ }),
+});
+
+export default user;
diff --git a/src/pages/admin/AdminPage.tsx b/src/pages/admin/AdminPage.tsx
new file mode 100644
index 00000000..50c9909e
--- /dev/null
+++ b/src/pages/admin/AdminPage.tsx
@@ -0,0 +1,59 @@
+import AdminTemplate from "../../components/admin/AdminTemplate";
+import AdminNav from "../../components/admin/AdminNav";
+import { Outlet, useLocation, useNavigate } from "react-router-dom";
+import { theme } from "../../styles/theme";
+import ProductsPage from "./ProductsPage";
+import styled from "styled-components";
+import AdminHeader from "../../components/admin/AdminHeader";
+import { check } from "../../lib/API/userAPI";
+import { useEffect } from "react";
+
+function AdminPage() {
+ const location = useLocation();
+ const navigate = useNavigate();
+ const ADMIN_EMAIL = process.env.REACT_APP_EMAIL;
+ const ADMIN_NAME = process.env.REACT_APP_DISPLAY_NAME;
+
+ useEffect(() => {
+ isAdmin();
+ });
+
+ const isAdmin = async () => {
+ const res = await check();
+ if (!(res.email === ADMIN_EMAIL && res.displayName === ADMIN_NAME)) {
+ alert("๊ด๋ฆฌ์๊ฐ ์๋๋๋ค.");
+ navigate("/");
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {location.pathname === "/admin" ? : }
+
+
+ );
+}
+
+const Sidebar = styled.div`
+ display: flex;
+ width: 17.8125rem;
+ background-color: ${theme.colors.orange.main};
+ background: linear-gradient(
+ ${theme.colors.orange.main},
+ ${theme.colors.orange.linear}
+ );
+`;
+
+const AdminMain = styled.div`
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+`;
+
+export default AdminPage;
diff --git a/src/pages/admin/DashboardPage.tsx b/src/pages/admin/DashboardPage.tsx
new file mode 100644
index 00000000..347ee07e
--- /dev/null
+++ b/src/pages/admin/DashboardPage.tsx
@@ -0,0 +1,7 @@
+function DashboardPage () {
+ return (
+ <>๋์๋ณด๋ ํ์ด์ง ์์
์์ >
+ )
+}
+
+export default DashboardPage;
\ No newline at end of file
diff --git a/src/pages/admin/HistroyPage.tsx b/src/pages/admin/HistroyPage.tsx
new file mode 100644
index 00000000..1914b35c
--- /dev/null
+++ b/src/pages/admin/HistroyPage.tsx
@@ -0,0 +1,11 @@
+import AdminHistroyItemList from "../../components/admin/AdminHistroyItemList";
+
+function HistoryPage() {
+ return (
+ <>
+
+ >
+ );
+}
+
+export default HistoryPage;
diff --git a/src/pages/admin/ProductsPage.tsx b/src/pages/admin/ProductsPage.tsx
new file mode 100644
index 00000000..d781d2e8
--- /dev/null
+++ b/src/pages/admin/ProductsPage.tsx
@@ -0,0 +1,11 @@
+import AdminProductItemList from "../../components/admin/AdminProductItemList";
+
+function AdminOrderPage() {
+ return (
+ <>
+
+ >
+ );
+}
+
+export default AdminOrderPage;
diff --git a/src/pages/admin/README.md b/src/pages/admin/README.md
new file mode 100644
index 00000000..986da7d6
--- /dev/null
+++ b/src/pages/admin/README.md
@@ -0,0 +1,100 @@
+## 23.06.08
+- ์คํ์ผ๋ ์ปดํฌ๋ํธ ํ๋ก์ ํธ ์ปฌ๋ฌ ์์
+- theme.ts, styled.d.ts ์ปฌ๋ฌ ์
๋ฐ์ดํธ ์์
+
+## 23.06.09
+- ๊ด๋ฆฌ์ page ๋์์ธ์ฉ ์์ ํ์ด์ง AdminPages.tsx ์์
+- ๊ด๋ฆฌ์ page ํด๋ AdminPages.tsx, HistoryPage.tsx, ProductsPage.tsx, UserListPage.tsx ํ์ผ ์ถ๊ฐ ์์
+- ๊ด๋ฆฌ์ Components ํด๋ AdminTemplate.tsx ํ์ผ ์ถ๊ฐ ์์
+- ๊ด๋ฆฌ์ Components ํด๋ AdminNav.tsx ํ์ผ ์ถ๊ฐ ์์
+- App.tsx์ Route ์ถ๊ฐ -> ๊ด๋ฆฌ์ ๋์์ธ ํ
์คํธ ํ์ด์ง ๋ฉ๋ด
+- ์์ ๊ด๋ฆฌ์ ํ์ด์ง ์ด๋ -> 'http://localhost:3000//admin'
+- ๊ฐ๋ฐ์ค์ธ ๊ด๋ฆฌ์ ํ์ด์ง ์ด๋ -> 'http://localhost:3000//admins'
+
+## 23.06.13
+- ์ธ๋ค์ผ, ์ฌ์ฉ์, ๋ฉ์ธ๋ฐฐ๋, ์์ธ์ด๋ฏธ์ง ๋์ฒด ์ด๋ฏธ์ง ๋ฐ ๋ก๊ณ ์ด๋ฏธ์ง ์
๋ก๋
+- ํค๋ ์์ญ ๋ก๊ณ ์ฝ์
์์
๋ฐ ๊ฒ์ ์ฐฝ ๋์์ธ ๋ถ๋ถ ์์ ์์
+
+## 23.06.14
+- ๋ฉ์ธ header ๋ก๊ทธ์ธ, ํ์๊ฐ์
, ์ฐ, ์นดํธ, ํ๋กํ ์์ญ ์คํ์ผ ์์ ์์
+- components ์์
+ 1. AdminHeader.tsx, AdminNav.tsx ์คํ์ผ ์์
+ 2. AdminHistroyItem.tsx ๊ฑฐ๋๋ด์ญ ๊ฐ๋ณ ์์ดํ
๋์ฒด ๋ฐ์ดํฐ ์ฝ์
ํ ๋ ์ด์์ ์์
+ 3. Button.tsx ๊ด๋ฆฌ์ ํ์ด์ง ์ฌ์ฉ ๋ฒํผ ์คํ์ผ ์ถ๊ฐ
+- page ์์
+ 1. AdminPages.tsx ๋ก๊ณ ์ถ๊ฐ ๋ฐ ์ฌ์ด๋๋ฐ ์คํ์ผ ์์
+ 2. HistroyPage.tsx ๊ฑฐ๋๋ด์ญ ์กฐํ ํ์ด์ง ์ถ๊ฐ
+ 3. UserListPage.tsx ์ฌ์ฉ์ ์กฐํ ํ์ด์ง ์ถ๊ฐ
+
+- public ์์
+ 1. ๊ด๋ฆฌ์ ํ์ด์ง์ฉ ๋ก๊ณ LogoAdmin.png, LogoAdmin.png ์ถ๊ฐ
+
+## 23.06.15
+- components ์์
+ 1. AdminTitle.tsx ๊ด๋ฆฌ์ ํ์ด์ง ์๋จ ํ์ดํ ์ฌ์ฌ์ฉ ์ปดํฌ๋ํธ ์์
+ 2. AdminUserItem.tsx ์ ์ ์์ดํ
์์ ์ฌ์ฉ ๋ฐ์ดํฐ ๋ ์ด์์ ๋ฐ ์คํ์ผ ์์
+- page ์์
+ 1. UserListPage.tsx ์ ์ ๋ฆฌ์คํธ ๋ ์ด์์ ๋ฐ ์คํ์ผ ์์
+- public ์์
+ 1. AdminUser.png ๊ด๋ฆฌ์ ์ ์ ์ด๋ฏธ์ง ์ถ๊ฐ
+
+## 23.06.16
+- adminAPI.ts ์ ์ ๋ชฉ๋ก ํ์
์ถ๊ฐ
+- ํ์ด์ง๋ค์ด์
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ์ค์น `npm i react-js-pagination`
+- components ์์
+ 1. AdminUserPaging.tsx ํ์ด์ง๋ค์ด์
์ค์ ์์
+ 2. AdminUserItem.tsx ์คํ์ผ ์์
+- page ์์
+ 1. UserListPage.tsx ํ์ด์ง๋ค์ด์
์ฌ์ฉ ํ์ด์ง ๋
ธ์ถ ๊ธฐ๋ฅ ๋ฐ ๋ ์ด์์ ์์
+ ๊ธฐ๋ฅ ์ฃผ์
+
+## 23.06.19
+- ๊ด๋ฆฌ์ ํ์ด์ง ์ ์ ๋ฆฌ์คํธ ํ์ด์ง๋ค์ด์
์คํ์ผ ์์
+- ์ ์ ํ์ด์ง ์ฃผ๋ฌธ์กฐํ ๋ฆฌ์คํธ ์คํ์ผ ์์
+- ์ด์
+ 1. ๊ด๋ฆฌ์ ํ์ด์ง ์ ์ ๋ฆฌ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์คํ์ผ๋์ปดํฌ๋ํธ ์ ์ฉ ๋ถ๊ฐ ์ค๋ฅ ๋ฐ๊ฒฌ -> ํ์ด์ง๋ค์ด์
์ 'div'๋ก ๊ฐ์ธ ์คํ์ผ ์ ์ฉ ์ฑ๊ณต
+
+## 23.06.20
+- ๋๋ฏผ๋ ๊ธฐ๋ฅ ๊ฐ๋ฐ ์์ ๊ด๋ฆฌ์ ์ฃผ๋ฌธ์กฐํ ๋ฐ ์ ํ ์ถ๊ฐ, ์์ ํ์ด์ง ์ด๋ฏธ์ง ํ์ผ ์ถ๊ฐ ๋ฐ ํ๊ทธ ์
๋ ฅ์ฐฝ ์์
+- page -> index.tsx ํ์ผ ์ ๋ฆฌ ์์
์งํ
+
+## 23.06.21
+- ์๋ก์ด admins ๊ด๋ฆฌ์ ํ์ด์ง ์ ํ ์กฐํ ํ์ด์ง ์์
+
+### 23.06.23
+- ์ธ๋ค์ผ, ์ฌ์ฉ์, ๋ฉ์ธ๋ฐฐ๋, ์์ธ์ด๋ฏธ์ง ๋์ฒด ์ด๋ฏธ์ง ๋ฐ ๋ก๊ณ ์ด๋ฏธ์ง ์
๋ก๋
+- ํค๋ ์์ญ ๋ก๊ณ ์ฝ์
์์
๋ฐ ๊ฒ์ ์ฐฝ ๋์์ธ ๋ถ๋ถ ์์ ์์
+- ๋ฉ์ธ ํ์ดํ์ฉ ํฐํธ ํ์ผ ์ฒจ๋ถ ๋ฐ ์ ์ญ์คํ์ผ ์์
+- ๊ด๋ฆฌ์ ํ์ด์ง ์ํ ์ถ๊ฐํ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ ์์
+- ํ๊ทธ ์ ๋ฌ ๊ธฐ๋ฅ ๊ตฌํ ์์
+
+### 23.06.25
+- ์์ , ์ญ์ ๋ฒํผ ์คํ ํ ๋๋๋ง๋์ง ์๋ ๋ฌธ์ ํด๊ฒฐ
+- ์ ํ ๋ฆฌ์คํธ ํ์ด์ง -> ์ปดํฌ๋ํธ admin ํด๋๋ก ์ด๋ ๋ฐ ์ฌ์์
+- ํ์ผ ์ ํ ๋ฒํผ label ์คํ์ผ ์์
๋ฐ ํ์ผ๋ช
ํ์ ์์
+- AdminProductItemEdit.tsx -> AdminProductItem.tsx ํฌํจ ์์
์งํ
+
+### 23.06.26
+- ๋ฉ์ธ ํธํฐ ์์
์๋ฃ
+- ๋ฉ์ธ ๋ฐฐ๋์ด๋ฏธ์ง 3์ข
๋์์ธ ์์
์๋ฃ ํ์ผ ์
๋ก๋
+- ์ ์ญ์คํ์ผ ๋๋์คํ์ดํฐํธ ๋ฉ์ธ ๋ณธ๋ฌธ ํฐํธ๋ก ์ ์ฉ
+
+### 23.06.27
+- ์๋ธ๋ฉ๋ด ์ด๋ฏธ์ง ์ฝ์
๋ฐ ์คํ์ผ ์์
+- ํ๋ก์ ํธ ์ ์ฒด ์คํฌ๋กค ์ ๊ฑฐ -> ์คํฌ๋กค ๊ธฐ๋ฅ์ ์๋
+
+### 23.06.28
+- ๋ฉ์ธ ํจํค์ง ๋ฐฐ๋ ์ด๋ฏธ์ง ์
๋ก๋
+- ๋ฉ์ธ ์ํํ์ด์ง ์์ธ์ด๋ฏธ์ง ์ถ๋ ฅ ์ฝ๋ ์ฝ์
+
+### 23.06.29
+- ํค๋ ์๋ธ ํ๊ทธ ์คํ์ผ ์์
+- ๊ด๋ฆฌ์ ํ์ด์ง ๋ก๋ฉ ์ ๋๋ฉ์ด์
์ถ๊ฐ
+- ๊ด๋ฆฌ์ ํ์ด์ง ์คํ์ผ ์์ ์์
+- ์ ์ ๋ฆฌ์คํธ ๋๋ฏธ ์ด๋ฏธ์ง ์์
+-
+### 23.07.02
+- ํค๋ ์คํ์ผ ์์ ์์
+- ๋ง์ดํ์ด์ง ์คํ์ผ ์์ ์์
+- ์ฃผ๋ฌธ์ ์คํ์ผ ์์ ์์
+- ์ฅ๋ฐ๊ตฌ๋ ์คํ์ผ ์์ ์์
+- ๋ก๊ทธ์ธ, ํ์๊ฐ์
์คํ์ผ ์์ ์์
\ No newline at end of file
diff --git a/src/pages/admin/UserListPage.tsx b/src/pages/admin/UserListPage.tsx
new file mode 100644
index 00000000..9f0561dd
--- /dev/null
+++ b/src/pages/admin/UserListPage.tsx
@@ -0,0 +1,126 @@
+import styled from "styled-components";
+import AdminTitle from "../../components/admin/AdminTitle";
+import AdminUserItem from "../../components/admin/AdminUserItem";
+import { theme } from "../../styles/theme";
+import { useEffect, useState } from "react";
+import { userCheck, UserList } from "../../lib/API/adminAPI";
+import AdminUserPaging from "../../components/admin/AdminUserPaging";
+import SubLoading from "../../components/common/SubLoading";
+
+function UserListPage() {
+ const [products, setProducts] = useState([]); //๋ฆฌ์คํธ์ ๋ํ๋ผ ์์ดํ
+ const [count, setCount] = useState(0); //์์ดํ
์ด ๊ฐ์
+ const [currentPage, setCurrentPage] = useState(1); //ํ์ฌ ํ์ด์ง. ๊ธฐ๋ณธ๊ฐ '1'
+ const [postPerPage] = useState(24); //ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์
+ const [indexOfLastPost, setIndexOfLastPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ๋ง์ง๋ง ์์ดํ
์ธ๋ฑ์ค
+ const [indexOfFirstPost, setIndexOfFirstPost] = useState(0); //ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ ์์ดํ
์ธ๋ฑ์ค
+ const [currentPosts, setCurrentPosts] = useState([]); //ํ์ฌ ํ์ด์ง์์ ๋ณด์ฌ์ง๋ ์์ดํ
+ const [isFetching, setIsFetching] = useState(false);
+
+ const setPage = (error: any) => {
+ setCurrentPage(error);
+ };
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await userCheck();
+ setIsFetching(false);
+ setProducts(res);
+ setCount(res.length); //API๋ก ๋ฐ์ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ์์ดํ
์ ์ด ๊ฐ์ ์ํ๋ก setCount์ ์ ๋ฌ
+ } catch (error) {
+ console.error("UserListPage", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ useEffect(() => {
+ setIndexOfLastPost(currentPage * postPerPage); //ํ์ฌ ํ์ด์ง์ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๊ณฑํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ setIndexOfLastPost์ ๋๊ธด๋ค. -> ๋ง์ง๋ง ํฌ์คํธ ์๋ 3
+ setIndexOfFirstPost(indexOfLastPost - postPerPage); //indexOfLastPost์ ๊ฐ๊ณผ ํ ํ์ด์ง์ ๋ณด์ฌ์ง ์์ดํ
์๋ฅผ ๋บ๋ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ setIndexOfFirstPost์ ์ ๋ฌ -> ์ฒซ๋ฒ์งธ ํฌ์คํธ๋ 0
+ setCurrentPosts(products.slice(indexOfFirstPost, indexOfLastPost)); //products์ ๋ฐฐ์ด์ ํ์ฌ ํ์ด์ง์ ์ฒซ๋ฒ์งธ์ ๋ง์ง๋ง์ ์ธ๋ฑ์ค๊น์ง ๊ฐ์ ๋ณต์ฌ, ๋ฐํํ์ฌ setCurrentPosts์ ์ ๋ฌ
+ }, [currentPage, indexOfLastPost, indexOfFirstPost, postPerPage, products]); //์์ ๊ธฐ๋ฅ์ด ๋๋๋ฉด ๋ฐฐ์ด ์์ ๊ฒฐ๊ณผ๋ค์ ํ ๋ฒ ์คํ
+
+ return (
+ <>
+
+ ์ฌ์ฉ์ ์กฐํ
+ {isFetching ? (
+
+ ) : (
+
+ {currentPosts && currentPosts.length > 0 ? (
+ //(์)currentPosts์ products.length๊ฐ 0๋ณด๋ค ํฌ๋ฉด ์คํํ๋ค. *๋ชจ๋ ๋ฐฐ์ด์ ํ์
+ //(์๋)currentPosts๋ฅผ map๋ก ๋ฐํํ์ฌ ์๋ AdminUserItem์ ํ์์ผ๋ก ๋ฐํ
+ currentPosts.map((productData: any) => (
+
+ ))
+ ) : (
+ ์ ์ ๊ฐ ์์ต๋๋ค. // ๋ฐ์ดํฐ๊ฐ ์๋ ์ํ๋ ํด๋น ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ค.
+ )}
+
+ )}
+
+
+
+
+
+ >
+ );
+}
+
+const UserListContainer = styled.div`
+ bottom: 0;
+ height: 90%;
+ display: flex;
+ margin: 0 30px;
+ position: relative;
+ flex-direction: column;
+ -ms-overflow-style: none;
+ ::-webkit-scrollbar {
+ display: none !important;
+ }
+`;
+
+const UserContainer = styled.div`
+ grid-template-columns: repeat(8, 1fr);
+ grid-template-rows: repeat(3, 1fr);
+ margin-top: 15px;
+ flex-wrap: wrap;
+ gap: 20px 20px;
+ display: grid;
+ width: 100%;
+`;
+
+const UserData = styled.div`
+ color: ${theme.colors.gray[3]};
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ margin: 0 auto;
+ display: flex;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ top: 0;
+`;
+
+const PageNation = styled.div`
+ background-color: ${theme.colors.white};
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ display: flex;
+ height: 70px;
+ width: 100%;
+ bottom: 0;
+ right: 0;
+ left: 0;
+`;
+
+export default UserListPage;
diff --git a/src/pages/auth/LoginPage.tsx b/src/pages/auth/LoginPage.tsx
new file mode 100644
index 00000000..e12bcfcf
--- /dev/null
+++ b/src/pages/auth/LoginPage.tsx
@@ -0,0 +1,22 @@
+import { Dispatch, SetStateAction } from "react";
+import AuthTemplate from "../../components/auth/AuthTemplate";
+import AuthForm from "../../components/auth/AuthForm";
+
+// interface
+interface ILoginPageProps {
+ setUsername: Dispatch>;
+}
+
+// component
+function LoginPage({ setUsername }: ILoginPageProps) {
+ // render
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+export default LoginPage;
\ No newline at end of file
diff --git a/src/pages/auth/README.md b/src/pages/auth/README.md
new file mode 100644
index 00000000..4cbeef02
--- /dev/null
+++ b/src/pages/auth/README.md
@@ -0,0 +1,44 @@
+## 2023.06.30
+
+1. ๋ก๊ทธ์ธ / ํ์๊ฐ์
๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ(100%)
+2. auth ๊ธฐ๋ฅ Redux-Saga ์ ์ฉ ์์
+
+## 2023.06.12
+
+1. ๋ก๊ทธ์ธ / ํ์๊ฐ์
disabled ์ ์ฉ ์๋ฃ
+2. ํ์๊ฐ์
์ ํจ์ฑ ๊ฒ์ฌ ์๋ฃ
+3. ํ๋กํ ์ด๋ฏธ์ง ์
๋ก๋ ๊ธฐ๋ฅ ๊ตฌํ ์์
+
+## 2023.06.09
+
+1. ํ์๊ฐ์
: ์ด๋ฉ์ผ, ํจ์ค์๋ ์ ํจ์ฑ ๊ฒ์ฌ ์๋ฃ
+2. ๋ก๊ทธ์ธ: ์ด๋ฉ์ผ, ํจ์ค์๋ ์ ํจ์ฑ ๊ฒ์ฌ ์๋ฃ
+
+## 2023.06.08
+
+1. auth ํ์ด์ง UI ์ ๋ฆฌ ์๋ฃ
+2. ๋ก๊ทธ์ธ / ํ์๊ฐ์
๋ฒํผ ์คํ์ผ๋ง ์ถ๊ฐ
+3. ํญ๋ฒํผ ํ์ฑ ๊ธฐ๋ฅ ์๋ฃ
+4. ๋ก๊ทธ์ธ / ํ์๊ฐ์
ํ์ด์ง ๋ฆฌํฉํ ๋ง ์๋ฃ
+
+## 2023.06.07
+
+1. ์ ์ฒด ์ ํ์์ box-sizing์ body ์ ํ์์์ ์์ ์๋ฃ
+2. ์ปค์คํ
๋ฒํผ์ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ์์ฑ ์ ์ฉ
+3. authํ์ด์ง ๋ฆฌํฉํ ๋ง ์์
+
+## 2023.06.02
+
+1. ์ธํฐํ์ด์ค ์ ์
+2. Styled-Components๋ฅผ ํ์ฉํด์ ์คํ์ผ๋ง ์๋ฃ
+3. useState๋ฅผ ์ด์ฉํ ์ด๊ธฐ ์ํ ์ ์
+4. ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ ํญ ๊ตฌํ
+5. ์ปค์คํ
๋ฒํผ ์ด๊ธฐ๋ฒ์ ์์
์๋ฃ
+
+## 2023.06.01
+
+1. userAPI ์ ์ฉ ์๋ฃ
+
+## 2023.05.31
+
+1. ํ๋ก์ ํธ ๊ตฌ์ฑ ์๋ฃ (CRA)
diff --git a/src/pages/auth/RegisterPage.tsx b/src/pages/auth/RegisterPage.tsx
new file mode 100644
index 00000000..9a549a02
--- /dev/null
+++ b/src/pages/auth/RegisterPage.tsx
@@ -0,0 +1,22 @@
+import { Dispatch, SetStateAction } from "react";
+import AuthForm from "../../components/auth/AuthForm";
+import AuthTemplate from "../../components/auth/AuthTemplate";
+
+// interface
+interface IRegisterPageProps {
+ setUsername: Dispatch>;
+}
+
+// component
+function RegisterPage({ setUsername }: IRegisterPageProps) {
+ // render
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+export default RegisterPage;
\ No newline at end of file
diff --git a/src/pages/main/CartPage.tsx b/src/pages/main/CartPage.tsx
new file mode 100644
index 00000000..8255870b
--- /dev/null
+++ b/src/pages/main/CartPage.tsx
@@ -0,0 +1,84 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { useEffect, useState } from "react";
+import { useQueryClient } from "react-query";
+import { useNavigate } from "react-router-dom";
+import { ICheckData } from "../../components/common/Header";
+import MainCartList from "../../components/main/MainCartList";
+import MainCartOrder from "../../components/main/MainCartOrder";
+
+function CartPage() {
+ const [isChecked, setIsChecked] = useState(false);
+ const [isLoggedIn, setIsLoggedIn] = useState(true);
+ const navigate = useNavigate();
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+
+ // ์ ์ ์ธ์ฆ
+ useEffect(() => {
+ checkUser();
+ }, []);
+
+ // state๊ฐ false์ผ์ alert์ ํจ๊ป loginํ์ด์ง๋ก ๋ฆฌ๋๋ ์
+ useEffect(() => {
+ if (!isLoggedIn) {
+ alert("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
+ navigate("/auth/login");
+ }
+ }, [isLoggedIn, navigate]);
+
+ // ์ ์ ์ธ์ฆํจ์. ์ ํจํ ์ ์ ๊ฐ ์๋๋ฉด state์ false๋ฅผ ๋ฐํ
+ const checkUser = async () => {
+ if (typeof res === "string") {
+ setIsLoggedIn(false);
+ }
+ };
+ return (
+ <>
+ ์ฅ๋ฐ๊ตฌ๋
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
+
+const Line = styled.div`
+ height: 1px;
+ margin-bottom: 1.5rem;
+ background-color: ${theme.colors.gray[3]};
+`
+
+const Title = styled.div`
+ display: flex;
+ height: 66px;
+ font-size: 36px;
+ font-weight: bold;
+ align-items: center;
+ font-family: 'GmarketSans';
+`;
+
+const Container = styled.div`
+ display: flex;
+`;
+
+const CartWrapper = styled.div`
+ width: 800px;
+ min-width: 800px;
+`;
+
+const PurchaseWrapper = styled.div`
+ width: 384px;
+ max-width: 384px;
+ max-height: 384px;
+ margin: 0 0 0 auto;
+`;
+
+export default CartPage;
diff --git a/src/pages/main/MainPage.tsx b/src/pages/main/MainPage.tsx
new file mode 100644
index 00000000..31a66f2b
--- /dev/null
+++ b/src/pages/main/MainPage.tsx
@@ -0,0 +1,33 @@
+import styled from "styled-components";
+import MainSolarList from "../../components/main/MainSolarList";
+import MainPackage from "../../components/main/MainPackage";
+import MainShipList from "../../components/main/MainShipList";
+
+function MainPage() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+const Container = styled.div`
+ padding-top: 2rem;
+`;
+const Main = styled.main`
+ width: 100%;
+`;
+
+const Inner = styled.div`
+ max-width: 75rem;
+ width: 75rem;
+ margin: 0 auto;
+`;
+
+export default MainPage;
diff --git a/src/pages/main/PaymentPage.tsx b/src/pages/main/PaymentPage.tsx
new file mode 100644
index 00000000..8f1e3da3
--- /dev/null
+++ b/src/pages/main/PaymentPage.tsx
@@ -0,0 +1,103 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+// CartPage(์ฅ๋ฐ๊ตฌ๋)์์ ๊ตฌ๋งคํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ ํ(๋ค)๋ง ๋ ๋๋ง
+// ProductPage(์์ธํ์ด์ง)์์ ๊ตฌ๋งคํ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด, ํด๋น ์ํ๋ง ๋ ๋๋ง
+import { Dispatch, SetStateAction, useState } from "react";
+import styled from "styled-components";
+import { theme } from "../../styles/theme";
+import { formatDiscount } from "../../lib/Function/commonFn";
+import MainPaymentOrder from "../../components/main/MainPaymentOrder";
+import MainPaymentInfo from "../../components/main/MainPaymentInfo";
+import { useSelector } from "react-redux";
+import { TRootState } from "../../modules";
+
+interface IPaymentProps {
+ username: string;
+ setUsername: Dispatch>;
+}
+
+function PaymentPage({ username, setUsername }: IPaymentProps) {
+ // redux ์ํ ๊ฐ์ฒด์ buyItem state, cartItem state๋ฅผ ๊ฐ์ ธ์ด
+ const buyItem = useSelector((state: TRootState) => state.buyItem);
+ const cartItem = useSelector((state: TRootState) => state.cartItem);
+ const items = buyItem.concat(cartItem); // ๋ state๋ฅผ concat
+ const [accountId, setAccountId] = useState("");
+ const productIds: string[] = [];
+
+ const quantity = items.reduce(
+ (acc, item) => (acc + item.quantity) as number,
+ 0,
+ );
+
+ const price = items.reduce(
+ (acc, item) => (acc + item.price * item.quantity) as number,
+ 0,
+ );
+
+ const discountedPrice = items.reduce(
+ (acc, item) =>
+ acc +
+ formatDiscount({ price: item.price, discountRate: item.discountRate }) *
+ item.quantity,
+ 0,
+ );
+
+ // ์ํ์ id๊ฐ๋ค์ ๋ฐฐ์ด์ push
+ items.forEach((item) => {
+ const quantity = item.quantity;
+ productIds.push(...Array.from({ length: quantity }, () => item.productId));
+ });
+
+ // ์ ํํ ๊ณ์ข์ id๊ฐ์ state์ updateํ๋ click event function
+ const onCheck = (accountId: string) => {
+ setAccountId(accountId);
+ };
+
+ return (
+ <>
+
+ ์ฃผ๋ฌธ์
+
+
+
+
+
+ >
+ );
+}
+
+const Title = styled.div`
+ height: 66px;
+ display: flex;
+ font-size: 36px;
+ font-weight: bold;
+ align-items: center;
+ font-family: "GmarketSans";
+`;
+
+const Container = styled.div``;
+
+const Wrapper = styled.div`
+ display: flex;
+
+ > hr {
+ height: 1px;
+ border: 0;
+ background: ${theme.colors.gray[4]};
+ margin-bottom: 1.5rem;
+ }
+`;
+
+export default PaymentPage;
diff --git a/src/pages/main/ProductPage.tsx b/src/pages/main/ProductPage.tsx
new file mode 100644
index 00000000..244eec1b
--- /dev/null
+++ b/src/pages/main/ProductPage.tsx
@@ -0,0 +1,185 @@
+import { useState, useEffect } from "react";
+import { useParams } from "react-router-dom";
+import { productDetail, IProductDetail } from "../../lib/API/commonAPI";
+import styled, { css } from "styled-components";
+import { theme } from "../../styles/theme";
+import { formatDollar } from "../../lib/Function/commonFn";
+import { IProductLike } from "../../lib/API/adminAPI";
+import { useQueryClient } from "react-query";
+import { ICheckData } from "../../components/common/Header";
+import MainProductTitle from "../../components/main/MainProductTitle";
+import MainProductPurchase from "../../components/main/MainProductPurchase";
+
+function ProductPage() {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ const { id } = useParams<{ id: string }>();
+ const [product, setProduct] = useState();
+ const [like, setLike] = useState(false);
+ const [isAnimate, setIsAnimate] = useState(false);
+
+ const [scrollY, setScrollY] = useState(0);
+ const [scrollActive, setScrollActive] = useState(false);
+ const [scrollBottom, setScrollBottom] = useState(false);
+
+ useEffect(() => {
+ const scrollListener = () => {
+ window.addEventListener("scroll", scrollFixed);
+ };
+ scrollListener();
+ return () => {
+ window.removeEventListener("scroll", scrollFixed);
+ };
+ });
+
+ const scrollFixed = () => {
+ setScrollY(window.scrollY);
+ if (scrollY <= 165) {
+ setScrollActive(false);
+ } else if (scrollY > 165 && scrollY < 1050) {
+ setScrollActive(true);
+ setScrollBottom(false);
+ } else if (scrollY >= 1050) {
+ // setScrollActive(false);
+ setScrollBottom(true);
+ }
+ };
+
+ // ์ต์ด LocalStorage์ ์ ๊ทผํ์ฌ, ์ฐ ๋ชฉ๋ก์ ์๋ ์ํ์ like ๊ฐ(true) ์ง์
+ // ๋จ์ผ ์ํ ์์ธ ์กฐํ
+ useEffect(() => {
+ async function fetchDetail() {
+ try {
+ const productRes = await productDetail(id as string);
+ setProduct(productRes);
+
+ // ์ธ์ฆ
+ if (res) {
+ // localStorage ์ ๊ทผ
+ const getLikeItem = localStorage.getItem(`like_${res.email}`);
+
+ // parse๋ฅผ ์ํด ๋ฐฐ์ด ์ ์ธ
+ let likeItems: IProductLike[] = [];
+
+ // ํ์ฑ
+ if (getLikeItem) {
+ likeItems = JSON.parse(getLikeItem);
+ }
+
+ // useParams๋ก ์ง์ ํ ์ํ์ id๊ฐ๊ณผ ๋์ผํ item์ ์ฐพ์์ ๋ณ์์ ์ ์ฅ
+ const item = likeItems.find((item) => item.id === id);
+
+ // ์ฐ ๋ชฉ๋ก์ ์๋ค๋ฉด item.like(true), ์๋ค๋ฉด false ์ง์
+ const like = item ? item.like : false;
+
+ // like state ๋ณ๊ฒฝ
+ setLike(like as boolean);
+ }
+ } catch (error) {
+ console.error(`error: ${error}`);
+ }
+ }
+ fetchDetail();
+ }, [id, res]);
+
+ const discountedPrice =
+ (product?.price as number) * (1 - (product?.discountRate as number) / 100);
+
+ return (
+
+
+
+
+
+
+
+ {formatDollar(discountedPrice)}
+ {product?.description}
+
+
+
+
+
+ );
+}
+
+const Line = styled.div`
+ background-color: ${theme.colors.gray[7]};
+ height: 1px;
+`;
+
+const Container = styled.div`
+ display: flex;
+ justify-content: space-between;
+ position: relative;
+`;
+
+const PhotoWrapper = styled.div`
+ width: 687px;
+
+ img {
+ width: 100%;
+ }
+`;
+
+const AbsoluteWrapper = styled.div`
+ width: 480px;
+ right: 0;
+`;
+
+const Price = styled.div`
+ font-size: 2rem;
+ font-weight: bold;
+`;
+
+const Desc = styled.div`
+ line-height: 1.5rem;
+ margin-bottom: 2rem;
+ letter-spacing: 1.5%;
+ color: ${theme.colors.gray[5]};
+ margin-top: 2rem;
+`;
+
+const DetailWrapper = styled.div<{
+ scrollActive: boolean;
+ scrollBottom: boolean;
+}>`
+ width: 480px;
+ padding: 2rem;
+ transition: all 1s ease-in-out;
+ border-radius: 10px;
+ border: 1px solid ${theme.colors.gray[3]};
+ position: relative;
+
+ ${(props) =>
+ props.scrollActive &&
+ css`
+ top: 40px;
+ margin-top: 22vh;
+ position: fixed;
+ `};
+
+ ${(props) =>
+ props.scrollBottom &&
+ css`
+ top: unset;
+ bottom: 0;
+ position: absolute;
+ `};
+`;
+
+export default ProductPage;
diff --git a/src/pages/main/README.md b/src/pages/main/README.md
new file mode 100644
index 00000000..8ea2fc0f
--- /dev/null
+++ b/src/pages/main/README.md
@@ -0,0 +1,142 @@
+### 23.05.31.
+
+ํ๋ก์ ํธ ์ด๊ธฐ ์ธํ
(npm, CRA, react-router-dom, TS, redux...)
+
+### 23.06.02.
+
+Components ํด๋ ๋ด ํ์ 4๊ฐ์ ํด๋ ๋ฐ Common ํด๋ ์์ฑ, pages ํด๋ ๋ด ํ์ ํด๋ ์ธ๋ถํ, Router ์ธํ
+
+### 23.06.04.
+
+Common Button ์ปดํฌ๋ํธ ์์ฑ
+
+### 23.06.05.
+
+Header ์ปดํฌ๋ํธ ์ด์ ์์ฑ, ProductPage ์ธ๋ถํ, Layout, ThemeProvider, Tag ์์ฑ
+
+### 23.06.07.
+
+2์ฐจ ์ฝ๋ ์ปจ๋ฒค์
์์ฑ, ๋ ์ด์์ ์์ , ๋ผ์ฐํฐ ์ปดํฌ๋ํธ ์ญ์ -> App.tsx์ ๋ณํฉํ์ฌ ๊ด๋ฆฌ
+
+### 23.06.08.
+
+๊ธฐ๋ณธ Header์ MainPage์์๋ง ์ฌ์ฉ๋๋ SubHeader ๊ตฌ์ฑ
+MainPage Banner์ Commet์ ๋ํ ์ปดํฌ๋ํธ ๊ตฌ์ฑ
+์ ์ญ์ ์คํ์ผ๋ง Inner ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ์ ์ฉ
+
+### 23.06.09
+
+MainPage ๋ด MainList ์ปดํฌ๋ํธ์ MainCommet, MainPackage ์ปดํฌ๋ํธ ์์ฑ
+MainList์์ ์ ํ ์ ์ฒด ์กฐํ ํ, MainCommet ์ปดํฌ๋ํธ๋ฅผ ํตํด ๋ฆฌ์คํธ ์ถ๋ ฅ ์ฑ๊ณต
+MainBanner ์ปดํฌ๋ํธ ๊ฐ์ ์์ฑ
+
+### 23.06.12.
+
+useEffect ์์กด์ฑ ๋ฐฐ์ด ๊ด๋ จ API ๋ฌดํ ํธ์ถ ์์ ๋ฐ ์ ์ฉ
+๋ผ์ฐํฐ ๊ตฌ์ฑ ์ง์ ๋ถํ์ง ์๊ฒ Page ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ
+
+### 23.06.13.
+
+Router ๋ณํฉ
+MainPage์์๋ง ์ถ๋ ฅํ๋๋ก SubHeader ์์
+์ํ ์์ธ ํ์ด์ง๋ฅผ ๋ด๋นํ ProductPage ์ปดํฌ๋ํธ ์์ฑ
+
+### 23.06.19.
+
+CartPage ๋ด Order ๊ธฐ๋ฅ ์ถ๊ฐ
+์ฅ๋ฐ๊ตฌ๋ ๋ด ์๋ ๋ณ๊ฒฝ ๊ธฐ๋ฅ ์ถ๊ฐ
+๋ฉ์ธํ์ด์ง ๋ด ์ํ Carousel ๊ธฐ๋ฅ ์ถ๊ฐ ( 4๊ฐ์ฉ ์ถ๋ ฅ )
+๋ฆฌ๋์ค ์ค์น ๋ฐ ๊ตฌ์ฑ
+
+### 23.06.20.
+
+์ฅ๋ฐ๊ตฌ๋ ๊ตฌ์ฑ ๋ฐ ์ํ ๋ชฉ๋ก๊ณผ ์ฃผ๋ฌธ์ ์ฌ์ด์ props ๊ด๋ฆฌ
+์ฅ๋ฐ๊ตฌ๋(cartItem) ๋ฆฌ๋์ค state ํ
์คํธ
+
+### 23.06.21.
+
+์ฅ๋ฐ๊ตฌ๋ ๋ด ์๋์ ํฌํจํ ์ปดํฌ๋ํธ - cartItem reducer ์ฐ๊ฒฐ
+reducer ๋ด์์ ์ํ์ ์๋๊ณผ ๊ฐ๊ฒฉ์ ๊ณฑํ ๊ฒฐ๊ณผ๊ฐ์ returnํ๋๋ก ๊ตฌ์ฑ
+-> ์ฝ๋๋ ๊น๋ํด์ง๊ฒ ์ง๋ง, ์ค๋ณต ์์ดํ
๋ฑ์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ ๋ดํฌ
+
+### 23.06.22.
+
+rebase ์ค์. repositoty์ sync๋ฅผ ๋ง์ถ์ง ์๊ณ ๋ฌดํฑ๋๊ณ pushํ์ง ์์์ผ ํจ์ ๊นจ๋ซ๋ค.
+sync๋ฅผ ๋ง์ถ์ง ์๊ณ ์์ commitํ๋ ๋ด์ฉ์ ์ ์ ๋๊ธฐํ๊ณ , sync๋ถํฐ ๋ง์ถ์.
+ํจ๋ถ๋ก discard commit์ ๋๋ฅด์ง ๋ง์.
+
+### 23.06.23.
+
+- Tag Click event๋ก toggle ๊ธฐ๋ฅ ๋ฐ ํด๋น ํ๊ทธ๊ฐ ํฌํจ๋ ์ํ์ ์ถ๋ ฅ
+
+
+- ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ๋ด์์ ๋, ๊ณ์ ์ผํํ ๊ฒ์ธ์ง, ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋ํ ๊ฒ์ธ์ง ์ ํํ ์ ์๋๋กํ๋ ๊ธฐ๋ฅ ์ถ๊ฐ
+
+
+---
+
+### 23.06.24.
+
+- input onChange๋ฅผ ํตํด ์
๋ ฅ ๋ฐ์ ๊ฐ์ ๋ชจ๋ ์ํ์ `title`๊ณผ `tag`์ ๋น๊ตํ์ฌ ํด๋น๋๋ ์ํ์ ์ถ๋ ฅ.
+ 
+ 
+ 
+
+### 23.06.26.
+
+์ฅ๋ฐ๊ตฌ๋ ๋ด์ ์๋ ์ํ๋ค์ cartItem state์ ๋์คํจ์นํ๊ธฐ ์ํด, title, quantity, price๋ฅผ ์
๋ฐ์ดํธ
+์ฆ์๊ตฌ๋งค๋ฅผ ๊ตฌํํ๊ธฐ ์ํด, payment redux ์ธํ
.
+
+- ์ฅ๋ฐ๊ตฌ๋์์ ๊ตฌ๋งค ์ ์ฒญ + ์ํ ์์ธ ํ์ด์ง์์ ์ฆ์ ๊ตฌ๋งค ์ ์ฒญ = ์ต์ข
๊ตฌ๋งค ์ ์ฒญ
+- ๋ ๊ฐ์ง ๊ตฌ๋งค ๋ฐฉ์์ redux state๋ก ๊ด๋ฆฌ
+- ํ์ง๋ง ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ๋ฆฌ๋ ๋๋ง ์์๋ ๋จ๋๋ก localStorage์ ์ ์ฅํ๋ ๊ธฐ์กด์ ๋ฐฉ์์ ์ ์ง.
+
+### 23.06.27.
+
+์์๋ก ์ ํ ๊ตฌ๋งค ์ ์ฒญ API ํ
์คํธ, ์ฑ๊ณต
+๋ค์์ ์ ํ ๊ตฌ๋งค ์, ๋ชจ๋ ๊ณ ์ ํ productId๊ฐ์ ๊ฐ์ ธ์ผ ํจ
+๋ฐ๋ณต๋ฌธ์ ํตํด์ ํ๋์ฉ ๊ฒฐ์ ์ ์ฒญํด์ผ ์ ์ ํ์ด์ง ํํธ๋ ์ธก์์ ๊ด๋ฆฌํ๊ธฐ ์ฉ์ด
+
+### 23.06.28.
+
+๋ชจ๋ ์ํ๋ค์ tags ๋ฐฐ์ด ๋ด์ tag๋ค์ ๊ฐ๋๋ค. -> tag ์ฌ๋ถ์ ๋ฐ๋ฅธ ์กฐ๊ฑด๋ถ ์ํ ๊ฒ์ ๊ฐ๋ฅ
+๊ด๋ฆฌ์ ํ์ด์ง ํํธ๋์ tag ๋ฑ๋ก์ ๋
ผ์, tag ๋ฑ๋ก ๋ฐฉ์ ํจ๊ป ์ธํ
-> ๊ท์น์ ๋ง๊ฒ tag์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
+ํ์ด์ง ๋ด ์ฆ์ ์ ์ ์ธ์ฆ API ํธ์ถ ์ธ์ง, ๋๋ฏผ๋๊ป์ ๊ฑด์ํ ๋ถ๋ถ ๊ณ ๋ คํ์ฌ react-query ๋์
(์ ์ฉ ๋ด๋น: ์ฐจ๋๋ฏผ๋)
+
+- ๋ฉ์ธ ํ์ด์ง ๋ด ๋ฐฐ๋๋ ๋ณด์ฌ์ง๋ ์บ๋ฌ์
์ ์ฌ๋ผ์ด์ค ์๊ฐ 4๊ฐ๊ฐ ์๋ 1๊ฐ.
+ - ๋ฐ๋ผ์ Carousel์ slidesToShow๋ฅผ ๊ณ ์ ๊ฐ์ด ์๋, props๋ก ๋๊ฒจ ๋ฐ๋๋ก ์์
+
+### 23.06.29.
+
+- ๋ฏธ๋ค์๋ discountRate ์ค์ ๋ฐ ๊ตฌํ ์์
+
+ - redux-state์๋ ์ ์ฉํด์ผํ ํ์ ์ธ์ง
+
+- ์ปดํฌ๋ํธ ๋ด props๋ก๋ ์ ๋ฌํด์ผํจ
+ - ์ฝ๋ ๋ฆฌํฉํ ๋ง ๋ถ๊ฐํผ
+
+### 23.06.30.
+
+- ์ฃผ๋ฌธ์ ํ์ด์ง ๋ด์์์ ํธ๋ฌ๋ธ ์ํ
+
+ 1. ๊ฒฐ์ ๊ณ์ข ๋ฏธ์ ํ ๊ฒฐ์ ์๋ ์
+ 2. ๊ฒฐ์ ์๋ฃ ํ navigate ์ํฉ
+ 3. ๊ฒฐ์ ์๋ฃ ํ PaymentPage ๋ฆฌ๋ก๋ `window.location.reload()`
+ 4. ๋น ๋ก๊ทธ์ธ ์ ๋น์ ์์ ์ผ๋ก PaymentPage ์ ๊ทผ ์ LoginPage๋ก ๋ฆฌ๋๋ ์
+
+- ๊ฒฐ์ ์ ์ฃผ๋ฌธ ๋ด์ญ์ ์ฃผ๋ฌธ ๊ฐฏ์ ๋น์ ์ ์ถ๋ ฅ ํธ๋ฌ๋ธ ์ํ
+
+`...Array.from({ length: quantity }, () => item.productId`
+์๋๊ณผ ๋์ผํ ๊ธธ์ด์ ์ ๋ฐฐ์ด์ ์์ฑ, arrow function์ ์ฌ์ฉํ์ฌ productId ๊ฐ์ ์ฑ์.
+
+### 23.07.01.
+
+MainPage ์ฝ๋ ๋ฆฌํฉํ ๋ง ์งํ
+ํ ์ธ๋ ๊ฐ๊ฒฉ์ ๊ณ์ฐํด์ฃผ๋ common function ์์ฑ
+redux ๋ฆฌํฉํ ๋ง (payment -> buyItem)
+๊ฐ๋
์ฑ ๋จ์ด์ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ธ๋ถํ
+
+### 23.07.02.
+
+๊ฒฐ์ ํ ๊ธ์ก๋ณด๋ค ์ ํํ ๊ณ์ข์ ์์ก์ด ๋ถ์กฑํ ๋, ๊ตฌ๋งค ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ ์ค์ง ๋ฐ
+๊ฐ์ธ ๊ณ์ข ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ์กฐ๊ฑด ์ถ๊ฐ
diff --git a/src/pages/main/tagged/AllPage.tsx b/src/pages/main/tagged/AllPage.tsx
new file mode 100644
index 00000000..95e13c74
--- /dev/null
+++ b/src/pages/main/tagged/AllPage.tsx
@@ -0,0 +1,34 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function AllPage() {
+ const title = "๋ฒ์ฐ์ฃผ(All) ์ํ";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const allList = list.filter((value) => value.tags?.includes("All"));
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default AllPage;
diff --git a/src/pages/main/tagged/FoodPage.tsx b/src/pages/main/tagged/FoodPage.tsx
new file mode 100644
index 00000000..6574ed5b
--- /dev/null
+++ b/src/pages/main/tagged/FoodPage.tsx
@@ -0,0 +1,34 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function Foodage() {
+ const title = "์ฐ์ฃผ ์๋";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const foodList = list.filter((value) => value.tags?.includes("์ฐ์ฃผ ์๋"));
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default Foodage;
diff --git a/src/pages/main/tagged/HorizonPage.tsx b/src/pages/main/tagged/HorizonPage.tsx
new file mode 100644
index 00000000..f11e4fb1
--- /dev/null
+++ b/src/pages/main/tagged/HorizonPage.tsx
@@ -0,0 +1,36 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function HorizonPage() {
+ const title = "์ฌ๊ฑด์ ์งํ์ ";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const horizonList = list.filter((value) =>
+ value.tags?.includes("์ฌ๊ฑด์ ์งํ์ "),
+ );
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default HorizonPage;
diff --git a/src/pages/main/tagged/OnSalePage.tsx b/src/pages/main/tagged/OnSalePage.tsx
new file mode 100644
index 00000000..aae3dd5f
--- /dev/null
+++ b/src/pages/main/tagged/OnSalePage.tsx
@@ -0,0 +1,37 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+// ํ ์ธ์จ์ด 30% ์ด์์ธ ์ํ
+function StationPage() {
+ const title = "ํน๊ฐ ์ํ";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const onSaleList = list.filter(
+ (value) => (value.discountRate as number) >= 30,
+ );
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default StationPage;
diff --git a/src/pages/main/tagged/ShipPage.tsx b/src/pages/main/tagged/ShipPage.tsx
new file mode 100644
index 00000000..012c501d
--- /dev/null
+++ b/src/pages/main/tagged/ShipPage.tsx
@@ -0,0 +1,34 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function ShipPage() {
+ const title = "์ฐ์ฃผ์ ";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const shipList = list.filter((value) => value.tags?.includes("์ฐ์ฃผ์ "));
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default ShipPage;
diff --git a/src/pages/main/tagged/SolarPage.tsx b/src/pages/main/tagged/SolarPage.tsx
new file mode 100644
index 00000000..aa5ca0b5
--- /dev/null
+++ b/src/pages/main/tagged/SolarPage.tsx
@@ -0,0 +1,34 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function SolarPage() {
+ const title = "ํ์๊ณ ์ํ";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const solarList = list.filter((value) => value.tags?.includes("ํ์๊ณ"));
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default SolarPage;
diff --git a/src/pages/main/tagged/SuitPage.tsx b/src/pages/main/tagged/SuitPage.tsx
new file mode 100644
index 00000000..8b9d08ca
--- /dev/null
+++ b/src/pages/main/tagged/SuitPage.tsx
@@ -0,0 +1,34 @@
+import { useEffect, useState } from "react";
+import MainTaggedCard from "../../../components/main/Card/MainTaggedCard";
+import { IProduct, productsList } from "../../../lib/API/adminAPI";
+
+function SuitPage() {
+ const title = "์ฐ์ฃผ๋ณต";
+ const [list, setList] = useState([]);
+ const [isFetching, setIsFetching] = useState(false);
+ const suitList = list.filter((value) => value.tags?.includes("์ฐ์ฃผ๋ณต"));
+
+ useEffect(() => {
+ async function fetchList() {
+ setIsFetching(true);
+ try {
+ const res = await productsList();
+ setList(res);
+ setIsFetching(false);
+ } catch (error) {
+ console.log("error", error);
+ }
+ }
+ fetchList();
+ }, []);
+
+ return (
+
+ );
+}
+
+export default SuitPage;
diff --git a/src/pages/user/AccountPage.tsx b/src/pages/user/AccountPage.tsx
new file mode 100644
index 00000000..e4444919
--- /dev/null
+++ b/src/pages/user/AccountPage.tsx
@@ -0,0 +1,63 @@
+import { useEffect, useState } from "react";
+import styled from "styled-components";
+import UserTitle from "../../components/user/UserTitle";
+import UserModal from "../../components/user/UserModal";
+import { accountList, myAccount } from "../../lib/API/userAPI";
+import UserAccountList from "../../components/user/UserAccountList";
+import SubLoading from "../../components/common/SubLoading";
+import { useQuery } from "react-query";
+
+function AccountPage() {
+ // ๊ณ์ข ๋ชฉ๋ก ์ต์ด ๋ ๋๋ง
+ useEffect(() => {
+ getAccounts();
+ }, []);
+
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const [isFetching, setIsFetching] = useState(false);
+ const [accounts, setAccounts] = useState([]);
+
+ useQuery("accountList", accountList);
+
+ // ๊ณ์ ๋ด ์ฐ๊ฒฐ๋ ๊ณ์ข ๋ชฉ๋ก ์กฐํ
+ const getAccounts = async () => {
+ setIsFetching(true);
+ const accountsList = await myAccount();
+ setIsFetching(false);
+ setAccounts(accountsList.accounts);
+ };
+
+ // ๋ชจ๋ฌ ์ข
๋ฃ ํ ๊ณ์ข ๋ชฉ๋ก ์ฌ ๋ ๋๋ง
+ const closeModal = () => {
+ setIsModalOpen(false);
+ getAccounts();
+ };
+
+ return (
+
+ ๊ณ์ข ๊ด๋ฆฌ
+ {isFetching ? (
+
+ ) : (
+
+ )}
+
+ {isModalOpen && (
+
+ )}
+
+ );
+}
+
+const AccountRoute = styled.div`
+ width: 100%;
+ display: flex;
+ position: relative;
+ flex-direction: column;
+`;
+
+export default AccountPage;
diff --git a/src/pages/user/LikePage.tsx b/src/pages/user/LikePage.tsx
new file mode 100644
index 00000000..456e4797
--- /dev/null
+++ b/src/pages/user/LikePage.tsx
@@ -0,0 +1,75 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import { useEffect, useState } from "react";
+import UserTitle from "../../components/user/UserTitle";
+import styled from "styled-components";
+import UserLikeList from "../../components/user/UserLikeList";
+import { ICheckData } from "../../components/common/Header";
+import { useQueryClient } from "react-query";
+
+interface IProduct {
+ id: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | null;
+ photo: string | null;
+ isSoldOut: boolean;
+ discountRate: number;
+}
+
+function LikePage() {
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+ // ์ด๊ธฐ๊ฐ ๋ ๋๋ง
+ useEffect(() => {
+ // getProducts();
+ getLike();
+ getCart();
+ }, []);
+
+ // const [products, setProducts] = useState([]);
+ const [likes, setLikes] = useState([]);
+ const [carts, setCarts] = useState([]);
+
+ // ์ฐ ๋ชฉ๋ก์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ๋ฐ์์ด
+ const getLike = async () => {
+ if (res) {
+ const getLikeItems = localStorage.getItem(`like_${res.email}`);
+ if (getLikeItems) {
+ setLikes(JSON.parse(getLikeItems));
+ }
+ }
+ };
+
+ // ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์์ ๋ฐ์์ด
+ const getCart = async () => {
+ if (res) {
+ const getCartItems = localStorage.getItem(`cart_${res.email}`);
+ if (getCartItems) {
+ setCarts(JSON.parse(getCartItems));
+ }
+ }
+ };
+
+ return (
+
+ ์ฐํ ์ํ
+
+
+ );
+}
+
+const LikeRoute = styled.div`
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+`;
+
+export default LikePage;
diff --git a/src/pages/user/OrderListPage.tsx b/src/pages/user/OrderListPage.tsx
new file mode 100644
index 00000000..4f2a808b
--- /dev/null
+++ b/src/pages/user/OrderListPage.tsx
@@ -0,0 +1,157 @@
+import { useEffect, useState } from "react";
+import { orderDetailsAll } from "../../lib/API/userAPI";
+import styled from "styled-components";
+import "react-calendar/dist/Calendar.css";
+import UserTitle from "../../components/user/UserTitle";
+import UserCalendar, { TValuePiece } from "../../components/user/UserCalendar";
+import UserCollapsible from "../../components/user/UserCollapsible";
+import { useQuery } from "react-query";
+import SubLoading from "../../components/common/SubLoading";
+
+export interface IOrdersDetail {
+ detailId: string;
+ product: {
+ productId: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | undefined;
+ discountRate: number;
+ };
+ timePaid: string;
+ isCanceled: boolean;
+ done: boolean;
+}
+
+export interface IOrdersDetailExtend extends IOrdersDetail {
+ account: {
+ bankName: string;
+ bankCode: string;
+ accountNumber: string;
+ };
+ product: {
+ productId: string;
+ title: string;
+ price: number;
+ description: string;
+ tags: string[];
+ thumbnail: string | undefined;
+ photo: string | null;
+ discountRate: number;
+ };
+}
+
+function OrderListPage() {
+ useEffect(() => {
+ filterOrders();
+ });
+
+ const [error, setError] = useState("");
+ const [detailsMap, setDetailsMap] = useState<
+ Map
+ >(new Map());
+ const [orders, setOrders] = useState([]);
+ const [filter, setFilter] = useState([]);
+ const [value, onChange] = useState(
+ new Date(),
+ );
+
+ // ์ฃผ๋ฌธ ๋ด์ญ ๋ถ๋ฌ์ค๊ธฐ
+ const { isFetching } = useQuery("orderDetailsAll", orderDetailsAll, {
+ onSuccess: (res) => {
+ typeof res === "string" ? setError(res) : setOrders(res);
+ },
+ });
+
+ // ์บ๋ฆฐ๋ ๋ ์ง ๋ฒ์ ๋ด์ ๋ ์ง๋ค์ ์ ์ฅํ๋ ๋ฐฐ์ด ์์ฑ
+ // ์์๋ ์ง์ ๋ ๋ ์ง๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋ณ์์ ์ ์ฅ
+ // ์์๋ ์ง๊ฐ ๋ ๋ ์ง์ ๊ฐ์์ง๋๊น์ง ๋ ์ง์ 1์ ๋ํ๋ฉด์ stringํ ํ ๋ ์ง๋ฅผ ๋น ๋ฐฐ์ด์ push
+ const getDatesArray = (startDate: TValuePiece, endDate: TValuePiece) => {
+ if (startDate && endDate) {
+ const dates = [];
+ const start = new Date(startDate);
+ const end = new Date(endDate);
+ for (let date = start; date <= end; date.setDate(date.getDate() + 1)) {
+ dates.push(date.toLocaleDateString());
+ }
+ return dates;
+ }
+ };
+
+ // getDatesArrayํจ์๋ก ๋ง๋ ๋ ์ง ๋ฒ์ ๋ฐฐ์ด์ ๋ ์ง๊ฐ ํฌํจ๋๋ ์ฃผ๋ฌธ ๋ด์ญ์ ํํฐ๋ง
+ // ์ฃผ๋ฌธ๋ด์ญ ์ ์ฒด๋ฅผ ์ค์บํด ํด๋น ์ฃผ๋ฌธ์ ์ฃผ๋ฌธ ๋ ์ง๊ฐ ์๊ธฐ ๋ฐฐ์ด์ ํฌํจ๋๋ฉด ๋จ๊น
+ // ๋ง์ผ ๋ ์ง๋ฅผ ์ ๋๋ก ์ ํํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์ฒด ์ฃผ๋ฌธ ๋ด์ญ์ด ํ์
+ // ์ต์ข
์ ์ผ๋ก ๋ ์ง์์ผ๋ก ์ ๋ ฌ
+ const filterOrders = () => {
+ const dates = Array.isArray(value)
+ ? getDatesArray(value[0], value[1])
+ : undefined;
+ const filteredOrders = dates
+ ? orders.filter((order: IOrdersDetail) => {
+ return dates.includes(new Date(order.timePaid).toLocaleDateString());
+ })
+ : orders;
+ setFilter(
+ filteredOrders.sort(
+ (a, b) =>
+ new Date(b.timePaid).getTime() - new Date(a.timePaid).getTime(),
+ ),
+ );
+ return filteredOrders.sort(
+ (a, b) => new Date(b.timePaid).getTime() - new Date(a.timePaid).getTime(),
+ );
+ };
+
+ return (
+
+ ์ฃผ๋ฌธ ๋ด์ญ
+ {isFetching ? (
+
+ ) : (
+
+ {error ? (
+ {error}
+ ) : (
+ filter.map((order: IOrdersDetail, index) => {
+ const isAccordionOpen = detailsMap.has(order.detailId);
+ const accordionDetails = detailsMap.get(order.detailId);
+ return (
+
+ );
+ })
+ )}
+
+ )}
+
+
+
+ );
+}
+
+const OrderRoute = styled.div`
+ width: 100%;
+ display: flex;
+ position: relative;
+ flex-direction: column;
+`;
+const OrderListBox = styled.ul`
+ gap: 5px;
+ display: flex;
+ flex-direction: column;
+`;
+
+const ErrorMessage = styled.span`
+ font-weight: 700;
+ font-size: 1.125rem;
+ color: ${(props) => props.theme.colors.orange.main};
+`;
+
+export default OrderListPage;
diff --git a/src/pages/user/README.md b/src/pages/user/README.md
new file mode 100644
index 00000000..6a34948e
--- /dev/null
+++ b/src/pages/user/README.md
@@ -0,0 +1,277 @@
+## 23.05.31
+
+- ์ด๊ธฐ ๊ฐ๋ฐ ์
ํ
์๋ฃ
+
+## 23.06.01
+
+- ์์ ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ธฐ๋ฅ ์ ์
+- ์ฌ์ฉ์ ํ์ด์ง์ ์ฌ์ฉ๋ API๋ฅผ Postman์ผ๋ก ๊ฒ์ฆ
+
+## 23.06.02
+
+- ์ฌ์ฉ์ ํ์ด์ง ๋ค๋น๊ฒ์ด์
์์ฑ
+- ์ฌ์ฉ์ ํ์ด์ง ๋ด ํ์ ํ์ด์ง ์ค์ฒฉ ๋ผ์ฐํ
+
+## 23.06.05
+
+๊ณ์ข ๊ด๋ฆฌ ํ์ด์ง, ์ฃผ๋ฌธ ๋ด์ญ ํ์ด์ง, ๊ฐ์ธ ์ ๋ณด ์์ ํ์ด์ง ์ผ๋ถ ๊ธฐ๋ฅ ๊ตฌํ
+(๊ตฌ๋งค์ทจ์, ๊ตฌ๋งคํ์ ๋ฑ ์ ํ ์กฐ์น๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ๋ฏธ๊ตฌํ)
+
+## 23.06.07
+
+- ๊ฐ์ธ ์ ๋ณด ์์ ํ์ด์ง์์ ๋น๋ฐ๋ฒํธ ์์ ์๋ฌ๋ฉ์์ง ์ถ๋ ฅ
+- ์์ ๊ด๋ฆฌ์ ํ์ด์ง ๊ตฌํ
+ - ์ ์ฒด ์ฌ์ฉ์ ๋ชฉ๋ก ์กฐํ
+ - ์ ์ฒด ์ํ ๋ชฉ๋ก ์กฐํ
+ - ๊ฐ๋ณ ์ํ ์ญ์
+ - ์ํ ์ถ๊ฐ
+ - ์ํ ์์
+
+## 23.06.08
+
+- user ํ์ด์ง ์์ ๊ธฐ๋ณธ ์คํ์ผ๋ง
+- UserTitle, UserLayout ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ์ ์ฉ
+- ๊ณ์ข ์ถ๊ฐ Modal ์์ฑ ๋ฐ ํํ ๊ตฌํ
+- yarn.lock ์ถฉ๋ ๊ด๋ จ ํธ๋ฌ๋ธ ์ํ
+ - ์๋ณธ ์ ์ฅ์ yarn.lock ์ญ์
+ - ์ดํ ๋ชจ๋ ํด๋ก ๋ก์ปฌ ์ ์ฅ์์์ yarn.lock ๊ณผ node_modules ์ญ์ ํ npm ci ๋ก yarn.lock ์ญ์
+ - ๊ธฐ์กด ์ปค๋ฐ ๋ด์ญ์ ๋จ์์๋ yarn.lock์ ์ผ๋จ ์๊ฒฉ ์ ์ฅ์์ push ํ ๊นํ๋ธ์์ ์ง์ ์ญ์
+ - ๋ชจ๋ ์ ์ฅ์์์ yarn.lock ์ญ์ ํ์ธ ํ ์๋ณธ ์ ์ฅ์์ sync
+
+## 23.06.09
+
+- UserNav ์คํ์ผ ์กฐ์
+- GreyInput ๊ณตํต input ์ปดํฌ๋ํธ ์์ฑ
+- ๊ณ์ข ์ถ๊ฐ Modal ์์ ์คํ์ผ๋ง
+- ๊ณ์ข ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
+
+## 23.06.11
+
+- UserModal ์คํ์ผ ๋์์ธ ๊ธฐํ๋๋ก ์์
+- ๊ณ์ข ์ถ๊ฐ์ AccountPage ๋ด ํ์ฌ ๊ณ์ข ๋ชฉ๋ก ์ฌ๋ ๋๋ง
+
+## 23.06.12
+
+- SettingPage ์ปดํฌ๋ํธ ๊ตฌ์กฐ ๋ณ๊ฒฝ
+- ์ฌ์ฉ์ ์ค์ ํ์ด์ง ๋ด์ ๋น๋ฐ๋ฒํธ ์ธ์ฆ ๋ก์ง ์ถ๊ฐ
+ - ๋ก๊ทธ์ธ API์ ์ธ์ฆ API๋ฅผ ์ด์ฉํด ๊ตฌํ
+ - ์ธ์ฆ API๋ก ํ ํฐ์์ email ์ถ์ถ ํ ๋ก๊ทธ์ธ API์ body๋ก ์ ๋ฌ, ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์
๋ ฅํ๋๋ก ๊ตฌ์ฑ
+
+## 23.06.13
+
+- local storage๋ฅผ ์ด์ฉํด ์ฐ ๊ธฐ๋ฅ ๊ตฌํ
+- key : ํ์ฌ ๋ก๊ทธ์ธ ๋ ์ฌ์ฉ์ ์ด๋ฉ์ผ, value : ์ํ ์ ๋ณด ๊ฐ์ฒด
+
+## 23.06.14
+
+- local storage๋ฅผ ์ด์ฉํ ์์ ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ ๊ตฌํ
+ - ์ฐ ๋ชฉ๋ก์ ๊ฐ ์์ดํ
์ '์ฅ๋ฐ๊ตฌ๋์ ๋ฃ๊ธฐ' ๋ฒํผ ํ ๋น
+ - ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ์์ดํ
์ด 'cart\_์ด๋ฉ์ผ' key์ ํ ๋น๋ value๋ก ์ถ๊ฐ
+ - ์ฐ ๋ชฉ๋ก์ key๋ฅผ 'like\_์ด๋ฉ์ผ'๋ก ๋ณ๊ฒฝ
+- ๊ฐ์ธ์ ๋ณด ์์ ํ์ด์ง์ API ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ๊ตฌํ
+ - ์๋ฌ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ง ์์ ์ ์ด๋ก์์ผ๋ก '์ ๋ณด๊ฐ ์์ ๋์์ต๋๋ค.' ๋ฉ์์ง ์ถ๋ ฅ
+ - ์๋ฌ ๋ฉ์์ง ๋ฐ์์ ๋นจ๊ฐ์์ผ๋ก ํด๋น ๋ฉ์์ง ์ถ๋ ฅ
+ - ์๋ฌ๊ฐ ๋ฐ๋ ๋๋ง๋ค ์ค์๊ฐ ๋ฉ์์ง ์ฒ๋ฆฌ
+
+## 23.06.15
+
+- ๊ณต์ฉ ํจ์ ํ์ผ ์์ฑ
+ - ๋ฌ๋ฌํ ๋ณํ ํจ์
+ - ํ๊ตญ ๋ ์ง ํฌ๋งท ๋ณํ ํจ์
+- Header์ ๋ก๊ทธ์ธ ๋ ์ฌ์ฉ์๋ช
ํ์ ๊ธฐ๋ฅ ๊ตฌํ
+ - ๋จ, ์ฌ์ฉ์๋ช
์์ ์งํ์๋ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ๋์ง ์๋ ๋ฌธ์ ๋ฐ๊ฒฌ
+- ๊ณ์ข ์กฐํ ํ์ด์ง, ์ฃผ๋ฌธ ๋ชฉ๋ก ํ์ด์ง ๋์์ธ ๊ธฐํ์ ๋ง๊ฒ ์คํ์ผ๋ง
+- user ํ์ด์ง์ Header ์ฌ์ด์ ์ฌ๋ฐฑ ์ถ๊ฐ
+- ๊ฐ์ธ ์ ๋ณด ์์ ํ์ด์ง ๋ด ๋น๋ฐ๋ฒํธ ํผ ์ ์ถ ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ
+ - ๋น๋ฐ๋ฒํธ input ๋ ์ค ํ๋๋ง ์
๋ ฅ ๋ ๊ฒฝ์ฐ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
+ - ์ ๋ณด ์์ ์ด ์๋ฃ๋๋ฉด input value ์ด๊ธฐํ
+ - ์๋ฌ ๋ฌธ๊ตฌ๋ 2.5์ด ํ ์ฌ๋ผ์ง๊ฒ ์ฒ๋ฆฌ
+- ๊ฐ์ธ ์ ๋ณด ์์ ์ธ์ฆ ํ์ด์ง์์ ๋น๋ฐ๋ฒํธ ์ ์ถ์ input value ์ด๊ธฐํ
+- ๊ฐ์ธ ์ ๋ณด ์์ ์ธ์ฆ ํ์ด์ง ์์ง ์ ๋ ฌ ๋ณด์
+- userNav ์คํ์ผ ์์
+
+## 23.06.16
+
+- ์ฃผ๋ฌธ ๋ด์ญ ํ์ด์ง ์บ๋ฆฐ๋ ๊ธฐ๋ฅ์ ์ํ react-calendar library ์ค์น
+- ์บ๋ฆฐ๋ ๋ ์ง ๋ฒ์ ์ค์ ๊ธฐ๋ฅ์ ์ด์ฉํด ํด๋น ๋ ์ง ๋ฒ์ ๋ฐฐ์ด ์์ฑ ํ, ์ฃผ๋ฌธ ๋ด์ญ์ ๋ ์ง๋ค๊ณผ ๋์กฐ
+- ์บ๋ฆฐ๋ ๋ด ๋ ์ง ๋ฏธ์ ํ์ ์ ์ฒด ์ฃผ๋ฌธ ๋ด์ญ ํ์
+- toISOString ์ฌ์ฉ์ UTC ๊ธฐ์ค ๋ ์ง ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์๋ํ์ง ์์ ๋ ์ง๋ก ์ ํ๋๋ ๋ฌธ์ ํด๊ฒฐ
+ - toISOString๋์ toLocaleDateString ๋ฉ์๋ ์ฌ์ฉ
+ - ์ ๊ทํํ์, replace, slice ๋ฑ์ ์ฌ์ฉํด ํ๋์ฝ๋ฉ ํ๋๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ๋ ์ง ๊ตฌ์ฑ ๊ฐ๋ฅ
+
+## 23.06.19
+
+- ๋ก๊ทธ์ธ ๋ฏธํ์ธ์ ์ ์ ํ์ด์ง ์ ๊ทผ ๋ถ๊ฐ
+ - alert๋ก ๋ธ๋ผ์ฐ์ ๋ชจ๋ฌ ํ์
+ - login ํ์ด์ง๋ก ์ด๋ ์ฒ๋ฆฌ
+
+## 23.06.20
+
+- new Map()๊ณผ react-collapsible library๋ฅผ ์ด์ฉํด ๊ตฌ๋งค ๋ด์ญ๋ณ ์์ธ ๋ด์ฉ ์กฐํ ๊ธฐ๋ฅ ๊ตฌํ
+- ์ฃผ๋ฌธ ๋ด์ญ์ ๊ตฌ๋งค ํ์ , ์ทจ์ ๊ธฐ๋ฅ ์ถ๊ฐ
+- ํ์ํ ๊ตฌ๊ฐ์ confirm ๋ชจ๋ฌ ์ถ๊ฐ
+
+## 23.06.21
+
+- UserNav hover ๋ฐ active ์คํ์ผ ์ถ๊ฐ
+- ๊ฐ ํ์ด์ง๋ณ button hover ์คํ์ผ ์ถ๊ฐ
+- Header ๋ก๊ทธ์์๋ฒํผ ๋์์ alert์ ํจ๊ป ๋ฉ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์
์ฒ๋ฆฌ
+
+## 23.06.22
+
+- FileReader๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง ์์ ๊ธฐ๋ฅ ์ถ๊ฐ
+ - ์
๋ก๋ ๊ฐ๋ฅํ ํ์ฅ์๋ฅผ jpg, jped, png, svg ๋ก ์ ํ
+ - ๊ธฐ์กด ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ ๋ฌ
+ - base64๋ก ์ฝ์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ API๋ก ์ ๋ฌ ๋ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ํ๋ฉด์ ๋ ๋๋ง
+ - ํ์ผ์ ์ ํํ๋ฉด ํด๋น ํ์ผ๋ช
์ด ๋์ค๋๋ก ๊ตฌํ
+- Header์ ํ๋กํ ์ด๋ฏธ์ง ํ์
+ - ๊ธฐ์กด ์ด๋ฏธ์ง๋ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ (ํ๋กํ ์ด๋ฏธ์ง ๋ฏธ์ค์ ๋๋ ๋ฏธ ๋ก๊ทธ์ธ ์ํ)
+ - ๋ก๊ทธ์ธ์ ์ค์ ํ ํ๋กํ ์ด๋ฏธ์ง ํ์
+- ์ฐ ๋ชฉ๋ก ํ์ด์ง ์คํ์ผ๋ง ๋ฐ ์ฐ ์ญ์ ๊ธฐ๋ฅ ๊ตฌํ
+ - ํ
์คํธ์ฉ ์ฝ๋ ์ ๊ฑฐ
+ - '์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ' ๋ฒํผ ๋์์ ํ์ด์ง ์ด๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ confirm ๋ชจ๋ฌ ๋์
+
+## 23.06.23
+
+- ์ธ๋ถ ๋ฌธ์ ํด๊ฒฐ
+ - check ํจ์์ saga ์์
์ผ๋ก ์ธํด ์์ check2 ํจ์ ์์ฑ
+ - ์ฐ ๋ชฉ๋ก์ด ์์ ๋์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ ๋ก์ง ๋ณ๊ฒฝ
+
+## 23.06.26
+
+- ๊ด๋ฆฌ์ ํ์ด์ง ์ ๊ทผ ์ ํ
+ - ํ๊ฒฝ๋ณ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ด๋ฆฌ์ ์ ๋ณด ์ถ๊ฐ
+ - ํด๋น ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ์ฌ์ฉ์๋ ๊ด๋ฆฌ์ํ์ด์ง ์ ๊ทผ์ alert์ ํจ๊ป ๋ฉ์ธํ์ด์ง๋ก ์ด๋
+- ์ ํ ์์ Modal ๋์์ ํด๋น ์ ํ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ placeholder๋ก ํ์
+- Header ๋ด ๊ด๋ฆฌ์ ํ์ด์ง ์ด๋ ๋ฒํผ ์์ฑ (๊ด๋ฆฌ์ ์ ์ฉ)
+- main ํ์ด์ง ๋ด์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ๋ก ๋ฑ์ฅํ๋ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ๋๋กญ๋ค์ด ํํ๋ก ๋ณ๊ฒฝ
+ - inputText ์ ๋ฌด๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋๋ ๋ก์ง ์ญ์
+ - MainSearchedCard ์ปดํฌ๋ํธ ๋ด์ฉ ๋ฐ ๋์์ธ ์์
+ - input์ onFocus์ onBlur ์์ฑ์ ์ด์ฉํด ๋๋กญ๋ค์ด on/off
+ - ๋๋กญ๋ค์ด off์ ์๊ฐ์ setTimeOut์ผ๋ก ์ง์ฐ์์ผ ๋๋กญ๋ค์ด์ ๋งํฌ ํด๋ฆญ ํ ํ์ด์ง ์ด๋๋ณด๋ค ๋จผ์ off๋๋ ์ํฉ ๋ฐฉ์ง
+
+## 23.06.27
+
+- ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง ๋ด ์ ํ์ํ ์ผ๊ด ์ญ์ ๋ก์ง ์ถ๊ฐ
+- checkbox ์ ํ ์ ์ ํ ์ญ์ ๋ฒํผ์ ํ์ฑํ, ์ฃผ๋ฌธํ๊ธฐ ๋ฒํผ์ ๋นํ์ฑํ ์ฒ๋ฆฌ
+ - ์ ํํ ํญ๋ชฉ๋ง ์ฃผ๋ฌธํ ์ ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ฐฉ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ ๋ถ๋ฆฌ
+- ๊ด๋ฆฌ์ ๊ถํ ํด์ ๋ก์ง ์ถ๊ฐ
+ - ๋ก๊ทธ์์์ ์๋ก๊ณ ์นจ ์ ๊น์ง ๊ด๋ฆฌ์ํ์ด์ง ๋ฒํผ์ด ๋จ์์๋ ๋ฌธ์ ์์
+
+## 23.06.28
+
+- AccountPage ๋ด AccountList ์์ญ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
+- OrderListPage ๋ด Calendar ์์ญ๊ณผ Collapsible ์์ญ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
+- likePage ๋ด LikeList ์์ต ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
+- React-Query Library๋ฅผ ์ฌ์ฉํด ํ์ด์ง ๋ด์์ ์ค๋ณต ํธ์ถ๋๋ ํจ์ ๊ด๋ฆฌ
+ - ํ ํ์ด์ง ๋ด์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ check ํจ์๊ฐ ๋์์ ์ฌ๋ฌ๋ฒ ํธ์ถ
+ - Header์ check ํจ์๋ฅผ useQuery๋ก ํธ์ถํด ๋ฐ์ดํฐ๋ฅผ ์บ์ฑ
+ - ๊ฐ ์ปดํฌ๋ํธ์์๋ useQueryClient๋ก ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ์ฌ์ฉ
+ - ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง ์์์ ๋๋ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ง์ ๋ฐ์ ๋ ๋๋ง ํ๋ฏ๋ก ์ปดํฌ๋ํธ ๋ ๋๋ง ์๋๊ฐ ๋น ๋ฆ
+ - ๊ฐ์ API ํธ์ถ์ ์ฌ๋ฌ๋ฒ ํ์ง ์์ ํ์ด์ง ๋ก๋ ์ฑ๋ฅ ํฅ์
+
+## 23.06.29
+
+- Header๋ถํฐ Footer๊น์ง์ ์ต์ ๋์ด ์ง์
+ - App ์ปดํฌ๋ํธ ๋ด์์ min-height์ 100vh ์ ์ฉ ํ ๋ฉ์ธ ์ปจํ
์ธ ์์ญ์ flex-grow ์ ์ฉ
+- slick-slider์ prev, next ๋ฒํผ ์คํ์ผ๋ง
+ - setting props์ nextArrow์ prevArrow์ ์ง์ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ ์ปดํฌ๋ํธ์ color prop์ ์ ๋ฌํ๋ ๊ฒฝ๊ณ ๋ฐ์
+ - color prop์ ์ ๋ฌํ nextArrow, prevArrow๋ฅผ ๋ณ๋ ์ปดํฌ๋ํธํ ์์ผ์ ์ ์ฉํ๋ ์ ์ ์๋
+- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ดํํ๋ค๊ฐ ๋ค์ focus ๋ ๋๋ง๋ค check ํจ์๋ฅผ refetch ํ๋ ๋ฌธ์ ํด๊ฒฐ
+ - useQuery์ ์ต์
์ refetchOnWindowFocus:false ์ถ๊ฐ
+ - ๋ก๊ทธ์ธ ๋ก๊ทธ์์์์ ์ ๋๋ก refetch๋ฅผ ๋ชปํ๋ ๋ฌธ์ ๊ฐ ์๊ฒจ ์๊ธฐ ์ต์
์ญ์
+- LikePage์ useEffect Hook์์ ํจ์๊ฐ ๋ฌดํ ํธ์ถ๋๋ ํ์ ํด๊ฒฐ
+ - ์์กด์ฑ ๋ฐฐ์ด ์ถ๊ฐ
+- CartPage์์ ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ด ์์ผ๋ฉด ์ ํ ์ญ์ ๋ฒํผ์ด ๋ํ๋์ง ์๋๋ก ์์
+- OrderListPage์ ๋ฆฌ์คํธ๋ณ ๊ณ ์ key๊ฐ ์ถ๊ฐ
+
+## 23.06.30
+
+- Header์ check ํจ์ refetch ์กฐ๊ฑด ์ถ๊ฐ
+ - ๋ก๊ทธ์ธ ์ username์ ๋ณํ๋ฅผ ๊ฐ์งํด refetch
+ - ๋ก๊ทธ์์ ์ refetch
+- CartPage ์ ๊ทผ์ ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
+ - ๋น ๋ก๊ทธ์ธ์ ๋ฉ์ธ ํ๋ฉด์ผ๋ก ์ด๋
+- ProductPage์ DetailWrapper๊ฐ ์คํฌ๋กค์ ๋ฐ๋ผ ์์ง์ด๋๋ก ๊ตฌํ
+- API ํจ์์ try catch๋ฌธ ์ ์ฉ ๋ฐ console.log ์ ๊ฑฐ
+- ๊ณ์ข ์ถ๊ฐ์ ์ํ์ ์ ํํ๋ฉด ๋๋ค์ผ๋ก ๊ณ์ข๋ฒํธ๋ฅผ ์์ฑํ๋๋ก ๋ก์ง ๊ตฌํ
+- CONFLICT ์ดํ pull์ ๋ฐ์ง ์์ ๊ตฌ๋ฒ์ ์ด ์๋ณธ repo์ ๋ฎ์ด์์์ง ๋ฌธ์ ํด๊ฒฐ
+ - git reset --hard๋ก CONFLICT ์ด์ ์์ ์ผ๋ก ๋ณต๊ท
+ - git push -f ๋ก ํด๋น ์์ ์ ์ปค๋ฐ์ผ๋ก ์๋ณธ repo์ ๋ฎ์ด์์
+ - ๋ชจ๋ ์กฐ์๋ค์ ๊ธฐ์กด fork repo๋ฅผ ์ญ์ ํ ํ ๋ค์ fork ๋ฐ clone
+ - ๋ค์ CONFLICT ์ฒ๋ฆฌ ํ ์ต์ ๋ฒ์ ์ผ๋ก PR ๋ฐ merge
+
+## 23.07.01
+
+- AdminPage ๋ด ์ ์ฒด ๊ฑฐ๋ ๋ด์ญ ์์ญ ๋ก์ง ๊ตฌํ
+ - ์ ์ฒด ๊ฑฐ๋ ๋ด์ญ ๋ ๋๋ง
+ - ๊ตฌ๋งคํ์ /ํ์ ํด์ , ๊ตฌ๋งค์ทจ์/์ทจ์ํด์ ๋ฒํผ ์ถ๊ฐ
+
+## 23.07.02
+
+- ์ปดํฌ๋ํธ ๋ด์์ ์ฌ์ฉํ ๋ก๋ฉ ์ปดํฌ๋ํธ์ธ SubLoading ์์ฑ
+- AdminPage, UserPage, MainPage(Tag) ๋ด์ SubLoading ์ถ๊ฐ
+- ๊ณ์ข ์ถ๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณ์ข ๋ชฉ๋ก์ด ๋ฐ๋ก ๋์ค๋๋ก ์ฒ๋ฆฌ
+ - ๋ชจ๋ฌ ์์ ์ปดํฌ๋ํธ์์ useQuery๋ก ๊ณ์ข ๋ชฉ๋ก ์กฐํ ๋ฐ ์บ์ฑ
+ - ๋ชจ๋ฌ์์ ์บ์ฑ๋ ๋ฐ์ดํฐ ์ฌ์ฉ
+
+## 23.07.03
+
+- AdminPage ๋ด ProductPage ์ ์์ ๋ชจ๋ฌ ๋ฌธ์ ํด๊ฒฐ
+ - ์๋ฌด๋ฐ ๊ฐ์ ์
๋ ฅํ์ง ์๊ณ ์ ์ถํ๋ฉด ํ๊ทธ์ ํ ์ธ์จ์ด ์ด๊ธฐํ ๋๋ ๋ฌธ์
+ - ๋ชจ๋ ๊ฐ์ด optional์ด์ด์ผ ํ๋๋ฐ ๊ธฐ์กด interface์ ํ์๊ฐ์ด ์กด์ฌ
+ - ๋ชจ๋ ๊ฐ์ด optional์ธ IEditProduct interface ์์ฑ
+ - state์ ์ ๋ค๋ฆญ์ผ๋ก interface ์ ์ฉ
+ - ํ๊ทธ ์์ ์ ๋์ด์ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ ๋ฌธ์
+ - input value๊ฐ updatedform.tags ์ธ๋ฐ ํด๋น value๋ฅผ form์ ์ถ๊ฐํ๋ ๋ก์ง์์ ๋์ด์ฐ๊ธฐ๋ฅผ ์ ๊ฑฐํจ
+ - trim() ๋ฉ์๋ ์ ๊ฑฐ
+- AdminPage์ ์ ์ฒด ๊ฑฐ๋๋ด์ญ์ ์ ๋ ฌ ๋ฌธ์ ํด๊ฒฐ
+ - Pagenation์ ์ํ setList ๋ด์ sort์ ์ฉ
+
+## ํ๋ก์ ํธ ํ๊ณ ๋ก
+
+์ฒ์์ผ๋ก ํ๋ ํ ํ๋ก์ ํธ์ฌ์ ๊ฑฑ์ ์ด ์ ๋ง ๋ง์์ต๋๋ค. ์ ์ค๋ ฅ์ผ๋ก๋ ํ์๋ค์๊ฒ ํ๋ ๋ผ์น๋๊ฒ ์๋๊น ํ๋ ์๊ฐ์ด ์ปธ๊ณ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ ์ต๋ํ ์ฐพ์๋ณด๊ณ ์ง๋ฌธํ์๋ ๋ง์๊ฐ์ง์ผ๋ก ํ๋ก์ ํธ์ ์ํ๊ฒ ๋์์ต๋๋ค. ๋คํํ ํ์๋ถ๋ค์ด ํ๋ํ๋ ์ ํผ๋๋ฐฑ ํด ์ฃผ์๊ณ ์ ์ง๋ฌธ์ ์ ์ฑ์ค๋ฝ๊ฒ ๋ต๋ณํด ์ฃผ์ ๋๋ถ์ ๊ธ๋ฐฉ๊ธ๋ฐฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋๊ฐ ์ ์์๊ณ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์ ๋ง ์ฆ๊ฒ๊ฒ ์ฐธ์ฌํ ์ ์์์ต๋๋ค!
+
+๋ฌผ๋ก ํฐ ์๊ธฐ๋ ๋ช ๋ฒ ์์์ต๋๋ค. yarn.lock ํ์ผ์ ๋ฌธ์ ๋ก ๋งค๋ฒ ์ถฉ๋์ด ๋๋ค๋๊ฐ, ๊ตฌ๋ฒ์ ์ด merge ๋๋ฉด์ ์์
๋ด์ฉ์ด ๋ ์๊ฐ๋ค๋๊ฐ ๋ฑ๋ฑ... ํ์ง๋ง ๋ชจ๋ ํ์๋ถ๋ค์ ํ๋ฐํ ์ฐธ์ฌ๋ก ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ํด๊ฒฐํ๊ณ ํนํ ๋ชจ๋๊ฐ ์ฃผ 1~2ํ๋ ๊ฐ์์ฅ์ ๋ชจ์ฌ ์ง์ ์๋ก์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์๊ฒฌ์ ์ ์ํ๊ณ ์ง๋ฌธํ๊ณ ๋ต๋ณํ๋ ์๊ฐ์ ๊ฐ์ง๋ค๋ณด๋ ํฐ ์๊ธฐ๋ค์ ๋๊ธธ ๋๋ง๋ค ์๋ก์ ๋ํด ๋ ์ ์ดํดํ๊ณ ์์งํ ์ ์์์ต๋๋ค.
+
+ํ๋ฌ์ด ์กฐ๊ธ ๋๋ ์ฒซ ํํ๋ก์ ํธ๋ฅผ ๋ง์น๋ฉฐ ํ๋ จํ๋ฉด์๋ ํํธ์ผ๋ก๋ ํจ๊ป ๋๊ณ ๋๋ฝํ ํ์๋ค๊ณผ ์งํํ ํ๋ก์ ํธ๋ฅผ ๋ค๋กํ๊ณ ๋ชจ๋ ํฉ์ด์ ธ์ผ ํ๋ค๋ ์์ฌ์์ด ๊ฐ๋ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ๋ก ํ๋จ๊ณ ๋ ์ฑ์ฅํ์ ์ ์ ํ์๋ค ๋ชจ๋ ๋ค์ ํ๋ก์ ํธ์์๋ ์ ํด๋ผ๊ฑฐ๋ผ ๋ฏฟ์ต๋๋ค. 8์กฐ ํ์ดํ
!
+
+## ์ญํ ์ ๋ฆฌ
+
+๋งก์ ํํธ : ์ฌ์ฉ์ํ์ด์ง - ๊ฑฐ๋ ๋ด์ญ ์กฐํ, ๊ฑฐ๋๋ณ ์์ธ ๋ด์ญ ์กฐํ, ์ฐ ๋ชฉ๋ก ์กฐํ ํ์ด์ง, ์ฌ์ฉ์ ์ ๋ณด ์์ ํ์ด์ง
+์์ธ ํ๋ :
+
+- Outlet์ ํ์ฉํ ์ค์ฒฉ ๋ผ์ฐํ
์ผ๋ก ๊ฐ ํ์ด์ง ๋ ๋๋ง
+- LocalStorage๋ฅผ ํ์ฉํด ์ฐ, ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ณธ๊ธฐ๋ฅ ๊ตฌํ
+- React-Collapsible ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ๋ณ ์ฃผ๋ฌธ๋ด์ญ์ ์์ธ ์ ๋ณด ํ์
+- ๊ธฐ์กด Login API์ Request Body๋ฅผ ๋ณํํด ์ฌ์ฉ์ ์ ๋ณด ์์ ์ ๋น๋ฐ๋ฒํธ ํ์ธ ๊ธฐ๋ฅ ๊ตฌํ
+ - ํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ์ ํตํด ์ด๋ฉ์ผ์ ๋ฐ์์ ๋ณํ Login API์ Body์ ์
๋ ฅ
+ - ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์
๋ ฅํด ํด๋น ์ด๋ฉ์ผ์ ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋์ง ํ์ธ
+- FileReader์ ์ธ์คํด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ onLoad ๋ฉ์๋๋ก addEventListner๋ฅผ ๋์ฒดํด ์ฌ์ง ์
๋ก๋ ๊ตฌํ
+ - ๋ก๋๊ฐ ์๋ฃ ๋ ์ดํ ์คํํ ์ฝ๋๋ฅผ ์ฝ๋ฐฑํจ์ ํํ๋ก ์ถ๊ฐ
+ - ๊ฐ์ ๋ฐฉ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ด๋ ์กฐ๊ธ ๋ ์ง๊ด์ ์ธ ํํ๋ก ์์ฑ
+- React-Calendar๋ฅผ ํ์ฉํด ์ ํํ ๋ ์ง ๋ฒ์ ๋ด์ ์ฃผ๋ฌธ๋ด์ญ ํ์
+ - ์ ํํ ๋ฒ์ ๋ด์ ๋ ์ง๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅ
+ - ์ฃผ๋ฌธ ๋ด์ญ์ ๋ ์ง๋ค ์ค ์๊ธฐ ๋ฐฐ์ด์ ํฌํจ๋ ๋ด์ญ๋ง filter ๋ฉ์๋๋ก ๊ฑธ๋ฌ๋ด ๋ ๋๋ง
+- ๊ณ์ข ์ฝ๋๋ฅผ ํ์ฉํด ํด๋น ๊ณ์ข ์ฝ๋์ ํด๋นํ๋ ๋ฌด์์ ๊ณ์ข๋ฒํธ ์์ฑ ๋ก์ง ๊ตฌํ
+ - ๊ณ์ข ์ฝ๋๋ฅผ reduce ๋ฉ์๋๋ก ํฉ์ฐํด ์ด ๊ธธ์ด ๊ณ์ฐ
+ - ์ด ๊ธธ์ด๋งํผ์ ๋๋คํ 0~9๊น์ง์ ๋ฌด์์ ์๋ฅผ ์ถ์ถ
+ - ํด๋น ์๋ค์ ์ด์ด๋ถ์ธ ๋ฌด์์ ๊ณ์ข๋ฒํธ ์์ฑ
+ - ๊ณ์ข ์ฝ๋์ slice๋ก ํ์ดํ(-) ์ถ๊ฐ
+
+์ถ๊ฐ ํ๋ :
+
+- React-Query๋ฅผ ํ์ฉํด ๊ฐ ํ์ด์ง์์ ๋ถํ์ํ ๋์ผ ํจ์ ํธ์ถ ๋ฐฉ์ง
+ - ์ฌ์ฉ์ ์ธ์ฆ ํจ์๋ Header ์ปดํฌ๋ํธ์์๋ง ํธ์ถ
+ - ๊ณ์ข ์ถ๊ฐ ๋ฒํผ ๋์์ ๋ํ๋๋ Modal์์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณ์ข ๋ชฉ๋ก์ ์์ ์ปดํฌ๋ํธ์์ ํธ์ถ
+ - useQuery๋ฅผ ์ฌ์ฉํด QueryKey๋ฅผ ํ ๋นํ ํจ์๋ฅผ ํธ์ถํ ํ ๋ฐ์ data๋ฅผ ์บ์ฑ
+ - ๊ฐ ํ์ด์ง์์๋ QueryKey๋ฅผ ์ฌ์ฉํด ์บ์ฑ๋ data๋ฅผ ๋ฐ์ ์ฌ์ฉ
+ - ๋ฐ์ดํฐ ์
๋ฐ์ดํธ์ ๊ฐ์ QueryKey๋ฅผ ๊ฐ์ง data๋ ๋์์ ์
๋ฐ์ดํธ
+ - ์บ์ฑ๋ ๋ฐ์ดํฐ๋ fetched๋ ์๊ฐ์ ์ค๋
์ท์ด๋ฏ๋ก API ํธ์ถ ์์ด ๋ฐ๋ก ๋ก๋๋จ (๋ ๋๋ง ์๊ฐ ๋จ์ถ)
+- styled-component์ keyframe์ ํ์ฉํด ์ ๋๋ฉ์ด์
์ ์ถ๊ฐํ SubLoading ์ปดํฌ๋ํธ ๊ธฐ๋ณธํํ ๊ตฌํ
+- timePaid๋ฅผ ํ๊ตญ์๊ฐ ํฌ๋งท์ผ๋ก ๋ง๋๋ adjustDate ๊ณตํตํจ์ ๋ฐ ๊ธ์ก์ ๋ฌ๋ฌ๋ก ํ๊ธฐํ๋ formatDollar ๊ณตํตํจ์ ์์ฑ
+- AdminPage ์ ๊ทผ ๊ถํ ์ค์
+ - ๋ณด์์ ์ํด ํ๊ฒฝ๋ณ์(env)์ ๊ด๋ฆฌ์ ์ด๋ฉ์ผ๊ณผ ๊ณ์ ๋ช
์ถ๊ฐ
+ - AdminPage ๋ด ๊ด๋ฆฌ์ ์ธ์ฆ ๋ก์ง ์ถ๊ฐ
+- ์ ํ ์์ธํ์ด์ง์ ์ฐ์ธก ๋ธ๋ก์ด ์คํฌ๋กค์ ์ถ์ ํ๋๋ก ๊ธฐ๋ฅ ๊ตฌํ
+- ๊ฐ์ข
๋ฌธ์ ํด๊ฒฐ
diff --git a/src/pages/user/SettingPage.tsx b/src/pages/user/SettingPage.tsx
new file mode 100644
index 00000000..03829c14
--- /dev/null
+++ b/src/pages/user/SettingPage.tsx
@@ -0,0 +1,14 @@
+import { useState } from "react";
+import SettingAuth from "../../components/user/UserSettingAuth";
+import Settings from "../../components/user/UserSettings";
+
+function SettingPage() {
+ const [isChecked, setIsChecked] = useState(false);
+ return (
+ <>
+ {isChecked ? : }
+ >
+ );
+}
+
+export default SettingPage;
diff --git a/src/pages/user/index.tsx b/src/pages/user/index.tsx
new file mode 100644
index 00000000..7bd1015e
--- /dev/null
+++ b/src/pages/user/index.tsx
@@ -0,0 +1,57 @@
+/* eslint-disable react-hooks/exhaustive-deps */
+import { Outlet, useLocation, useNavigate } from "react-router-dom";
+import UserNav from "../../components/user/UserNav";
+import OrderListPage from "./OrderListPage";
+import UserLayout from "../../components/user/UserLayout";
+import styled from "styled-components";
+import { useEffect, useState } from "react";
+import { ICheckData } from "../../components/common/Header";
+import { useQueryClient } from "react-query";
+
+function UserPage() {
+ const location = useLocation();
+ const navigate = useNavigate();
+ const [isChecked, setIsChecked] = useState(true);
+
+ const queryClient = useQueryClient();
+ const res = queryClient.getQueryData("check");
+
+ // ์ ์ ์ธ์ฆ
+ useEffect(() => {
+ checkUser();
+ }, []);
+
+ // state๊ฐ false์ผ์ alert์ ํจ๊ป loginํ์ด์ง๋ก ๋ฆฌ๋๋ ์
+ useEffect(() => {
+ if (!isChecked) {
+ alert("๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.");
+ navigate("/auth/login");
+ }
+ }, [isChecked, navigate]);
+
+ // ์ ์ ์ธ์ฆํจ์. ์ ํจํ ์ ์ ๊ฐ ์๋๋ฉด state์ false๋ฅผ ๋ฐํ
+ const checkUser = async () => {
+ if (typeof res === "string") {
+ setIsChecked(false);
+ }
+ };
+
+ return (
+ <>
+ {isChecked ? (
+
+
+
+ {location.pathname === "/user" ? : }
+
+
+ ) : null}
+ >
+ );
+}
+
+const UserContainer = styled.div`
+ display: flex;
+`;
+
+export default UserPage;
diff --git a/src/styles/GlobalStyle.ts b/src/styles/GlobalStyle.ts
new file mode 100644
index 00000000..13d27d11
--- /dev/null
+++ b/src/styles/GlobalStyle.ts
@@ -0,0 +1,97 @@
+import { createGlobalStyle } from "styled-components";
+
+const GlobalStyle = createGlobalStyle`
+ html, body, div, span, applet, object, iframe,
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+ a, abbr, acronym, address, big, cite, code,
+ del, dfn, em, img, ins, kbd, q, s, samp,
+ small, strike, strong, sub, sup, tt, var,
+ b, u, i, center,
+ dl, dt, dd, ol, ul, li,
+ fieldset, form, label, legend,
+ table, caption, tbody, tfoot, thead, tr, th, td,
+ article, aside, canvas, details, embed,
+ figure, figcaption, footer, header, hgroup,
+ menu, nav, output, ruby, section, summary,
+ time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+ box-sizing: border-box;
+ }
+ /* HTML5 display-role reset for older browsers */
+ article, aside, details, figcaption, figure,
+ footer, header, hgroup, menu, nav, section {
+ display: block;
+ }
+ body {
+ font-family: 'NanumSquare', sans-serif;
+ line-height: 1;
+ -ms-overflow-style: none;
+ ::-webkit-scrollbar {
+ display: none !important;
+ }
+ }
+ ol, ul {
+ list-style: none;
+ }
+ blockquote, q {
+ quotes: none;
+ }
+ blockquote:before, blockquote:after,
+ q:before, q:after {
+ content: '';
+ content: none;
+ }
+ table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+ a {
+ text-decoration: none;
+ color: inherit;
+ display: block;
+ }
+ * {
+ box-sizing: inherit;
+ }
+ @font-face {
+ font-family: 'GmarketSans';
+ font-weight: 300;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.ttf') format("truetype");
+ font-display: swap;
+ }
+ @font-face {
+ font-family: 'GmarketSans';
+ font-weight: 500;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.ttf') format("truetype");
+ font-display: swap;
+ }
+ @font-face {
+ font-family: 'GmarketSans';
+ font-weight: 700;
+ font-style: normal;
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot');
+ src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot?#iefix') format('embedded-opentype'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff2') format('woff2'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff') format('woff'),
+ url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.ttf') format("truetype");
+ font-display: swap;
+ }
+ @import url(https://cdn.jsdelivr.net/gh/moonspam/NanumSquare@2.0/nanumsquare.css);
+`;
+
+export default GlobalStyle;
diff --git a/src/styles/styled.d.ts b/src/styles/styled.d.ts
new file mode 100644
index 00000000..9e75267a
--- /dev/null
+++ b/src/styles/styled.d.ts
@@ -0,0 +1,19 @@
+import "styled-components";
+
+declare module "styled-components" {
+ export interface DefaultTheme {
+ colors: {
+ orange: {
+ main: string;
+ hover: string;
+ pressed: string;
+ linear: string;
+ }
+ purple: string;
+ white: string;
+ black: string;
+ gray: { [key: string] };
+ pink: string;
+ };
+ }
+}
diff --git a/src/styles/theme.ts b/src/styles/theme.ts
new file mode 100644
index 00000000..bdbfabdc
--- /dev/null
+++ b/src/styles/theme.ts
@@ -0,0 +1,27 @@
+import { DefaultTheme } from "styled-components";
+
+//์์ธ ๋์์ธ ์คํ์ผ์ ์ฐ์ฃผ๋ถ๋์ฐ ํผ๊ทธ๋ง์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
+export const theme: DefaultTheme = {
+ colors: {
+ orange: {
+ main: "#FF6214", //ํ๋ก์ ํธ ๋ฉ์ธ ์ปฌ๋ฌ ๋๋ ๋ฒํผ ์ปฌ๋ฌ ๊ทธ๋ฆฌ๊ณ ์์ , ์ฅ๋ฐ๊ตฌ๋, ๋ฌ๋ ฅ, ์๋ก๊ณ ์นจ ๋ฒํผ hover ์ฌ์ฉ ์ปฌ๋ฌ
+ hover: "#E14400", //๊ธฐ๋ณธ ๋ฒํผ ํธ๋ฒ ์ปฌ๋ฌ
+ pressed: "#502612", //header์ ํ๊ทธ ๋ฒํผ์ด ์ ํ๋ ์ํ์ ์ปฌ๋ฌ
+ linear: "#FF9C40", //header ๋ฐฐ๊ฒฝ์์ ๊ทธ๋ผ๋ฐ์ด์
์ ์ฌ์ฉ๋๋ ๋ฐ์ ์ค๋ ๋ ์ปฌ๋ฌ
+ },
+ purple: "#922bff", //์ผ๊ฐ ๋ชจ๋ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์ปฌ๋ฌ ์ถํ ๋ณ๊ฒฝ ์์
+ black: "#000", //๊ธฐ๋ณธ ๋ธ๋
+ white: "#fff", //๊ธฐ๋ณธ ํ์ดํธ
+ gray: [
+ "#858585", //[0] ํ์ฌ ์ฌ์ฉ๋์ง ์์
+ "#454545", //[1] ํ์ฌ ์ฌ์ฉ๋์ง ์์
+ "#f4f4f4", //[2] input ๋นํ์ฑ ํ
์คํธ์ ์ฌ์ฉ
+ "#d0d0d0", //[3] input ๋ฐ์ค ๋ฐฐ๊ฒฝ์ ์ฌ์ฉ
+ "#f0f0f0", //[4] ํ์ฌ ์ฌ์ฉ๋์ง ์์
+ "#818181", //[5] ๋ณธ๋ฌธ ํ
์คํธ์ ์ฌ์ฉ
+ "#bbbbbb", //[6] header input border
+ "#ececec", //[7] ๋ฆฌ์คํธ ์์ดํ
ํ
๋๋ฆฌ ์์
+ ],
+ pink: "#FF2626", //์ข์์ ํํธ ์ปฌ๋ฌ
+ },
+};
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..6fcab893
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "downlevelIteration": true,
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"]
+}