From a943e53ed059db643cc0a8dc2e0365b2654a7db0 Mon Sep 17 00:00:00 2001 From: Alex Erdei Date: Mon, 20 Jan 2025 20:35:44 +0000 Subject: [PATCH] Make app work with Preact with Firebase in dev --- .firebaserc | 5 + firebase.json | 14 + package-lock.json | 5414 +++++++++++------ package.json | 41 +- src/App.css | 21 + src/app copy/store.js | 24 + src/app.jsx | 146 +- src/app/store.js | 24 + src/backend/backend.js | 271 + src/components/CircularImage.jsx | 44 + src/components/Comments.css | 13 + src/components/Comments.jsx | 155 + src/components/Contacts.css | 33 + src/components/Contacts.jsx | 354 ++ src/components/Conversation.jsx | 37 + src/components/CreatePost.css | 28 + src/components/CreatePost.jsx | 97 + src/components/DisplayComment.jsx | 40 + src/components/DisplayConversation.jsx | 17 + src/components/DisplayPost.jsx | 148 + src/components/DisplayUserPost.jsx | 14 + src/components/FriendCard.css | 23 + src/components/FriendCard.jsx | 70 + src/components/FriendList.jsx | 46 + src/components/Friends.jsx | 51 + src/components/FriendsListPage.css | 28 + src/components/FriendsListPage.jsx | 53 + src/components/HomePage.css | 22 + src/components/HomePage.jsx | 47 + src/components/LeftNavbar.css | 8 + src/components/LeftNavbar.jsx | 40 + src/components/LikesModal.jsx | 27 + src/components/Login.jsx | 81 + src/components/Message.jsx | 64 + src/components/MiniFriends.jsx | 89 + src/components/MiniPhotos.jsx | 74 + src/components/NestedRoute.jsx | 38 + src/components/PasswordReminderModal.jsx | 74 + src/components/PhotoViewer.jsx | 79 + src/components/Photos.jsx | 72 + src/components/PostModal.css | 63 + src/components/PostModal.jsx | 223 + src/components/PostView.jsx | 30 + src/components/Posts.css | 9 + src/components/Posts.jsx | 64 + src/components/Profile.css | 68 + src/components/Profile.jsx | 311 + src/components/ProfileLink.jsx | 35 + src/components/RecentLogins.css | 3 + src/components/RecentLogins.jsx | 19 + src/components/RemoveCoverPhotoDlg.jsx | 33 + src/components/ResponsiveImage.jsx | 50 + src/components/SelectBgPhotoModal.jsx | 38 + src/components/Signup.css | 3 + src/components/SignupModal.jsx | 131 + src/components/StorageImage.jsx | 102 + src/components/StyledTextarea.jsx | 66 + src/components/Titlebar.css | 53 + src/components/Titlebar.jsx | 137 + src/components/UpdateProfilePicModal.jsx | 47 + src/components/UploadPhoto.jsx | 34 + src/components/UserAccount.jsx | 121 + src/components/VideoView.jsx | 24 + src/components/helper.js | 57 + src/features/accountPage/accountPageSlice.js | 26 + src/features/currentUser/currentUserSlice.js | 42 + src/features/images/imagesSlice.js | 24 + .../incomingMessages/incomingMessagesSlice.js | 17 + src/features/link/linkSlice.js | 19 + .../outgoingMessages/outgoingMessagesSlice.js | 17 + src/features/posts/postsSlice.js | 17 + src/features/user/userSlice.js | 46 + src/features/users/usersSlice.js | 17 + src/firebaseConfig.js | 11 + src/images/background-server.jpg | Bin 0 -> 128824 bytes src/images/fakebook-avatar.jpeg | Bin 0 -> 12162 bytes src/images/friends.jpg | Bin 0 -> 13542 bytes src/images/placeholder-image.jpg | Bin 0 -> 14618 bytes src/index.css | 73 +- src/main.jsx | 11 +- 80 files changed, 8004 insertions(+), 1963 deletions(-) create mode 100644 .firebaserc create mode 100644 firebase.json create mode 100644 src/App.css create mode 100644 src/app copy/store.js create mode 100644 src/app/store.js create mode 100644 src/backend/backend.js create mode 100644 src/components/CircularImage.jsx create mode 100644 src/components/Comments.css create mode 100644 src/components/Comments.jsx create mode 100644 src/components/Contacts.css create mode 100644 src/components/Contacts.jsx create mode 100644 src/components/Conversation.jsx create mode 100644 src/components/CreatePost.css create mode 100644 src/components/CreatePost.jsx create mode 100644 src/components/DisplayComment.jsx create mode 100644 src/components/DisplayConversation.jsx create mode 100644 src/components/DisplayPost.jsx create mode 100644 src/components/DisplayUserPost.jsx create mode 100644 src/components/FriendCard.css create mode 100644 src/components/FriendCard.jsx create mode 100644 src/components/FriendList.jsx create mode 100644 src/components/Friends.jsx create mode 100644 src/components/FriendsListPage.css create mode 100644 src/components/FriendsListPage.jsx create mode 100644 src/components/HomePage.css create mode 100644 src/components/HomePage.jsx create mode 100644 src/components/LeftNavbar.css create mode 100644 src/components/LeftNavbar.jsx create mode 100644 src/components/LikesModal.jsx create mode 100644 src/components/Login.jsx create mode 100644 src/components/Message.jsx create mode 100644 src/components/MiniFriends.jsx create mode 100644 src/components/MiniPhotos.jsx create mode 100644 src/components/NestedRoute.jsx create mode 100644 src/components/PasswordReminderModal.jsx create mode 100644 src/components/PhotoViewer.jsx create mode 100644 src/components/Photos.jsx create mode 100644 src/components/PostModal.css create mode 100644 src/components/PostModal.jsx create mode 100644 src/components/PostView.jsx create mode 100644 src/components/Posts.css create mode 100644 src/components/Posts.jsx create mode 100644 src/components/Profile.css create mode 100644 src/components/Profile.jsx create mode 100644 src/components/ProfileLink.jsx create mode 100644 src/components/RecentLogins.css create mode 100644 src/components/RecentLogins.jsx create mode 100644 src/components/RemoveCoverPhotoDlg.jsx create mode 100644 src/components/ResponsiveImage.jsx create mode 100644 src/components/SelectBgPhotoModal.jsx create mode 100644 src/components/Signup.css create mode 100644 src/components/SignupModal.jsx create mode 100644 src/components/StorageImage.jsx create mode 100644 src/components/StyledTextarea.jsx create mode 100644 src/components/Titlebar.css create mode 100644 src/components/Titlebar.jsx create mode 100644 src/components/UpdateProfilePicModal.jsx create mode 100644 src/components/UploadPhoto.jsx create mode 100644 src/components/UserAccount.jsx create mode 100644 src/components/VideoView.jsx create mode 100644 src/components/helper.js create mode 100644 src/features/accountPage/accountPageSlice.js create mode 100644 src/features/currentUser/currentUserSlice.js create mode 100644 src/features/images/imagesSlice.js create mode 100644 src/features/incomingMessages/incomingMessagesSlice.js create mode 100644 src/features/link/linkSlice.js create mode 100644 src/features/outgoingMessages/outgoingMessagesSlice.js create mode 100644 src/features/posts/postsSlice.js create mode 100644 src/features/user/userSlice.js create mode 100644 src/features/users/usersSlice.js create mode 100644 src/firebaseConfig.js create mode 100644 src/images/background-server.jpg create mode 100644 src/images/fakebook-avatar.jpeg create mode 100644 src/images/friends.jpg create mode 100644 src/images/placeholder-image.jpg diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..c1ecae2 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "fakebook-2df7b" + } +} diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..1bee05e --- /dev/null +++ b/firebase.json @@ -0,0 +1,14 @@ +{ + "functions": [ + { + "source": "functions", + "codebase": "default", + "ignore": [ + "node_modules", + ".git", + "firebase-debug.log", + "firebase-debug.*.log" + ] + } + ] +} diff --git a/package-lock.json b/package-lock.json index 71d9a76..b3755b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1846 +1,3572 @@ { - "name": "fakebook-ainiro", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "fakebook-ainiro", - "version": "0.0.0", - "dependencies": { - "preact": "^10.25.3" - }, - "devDependencies": { - "@preact/preset-vite": "^2.9.3", - "vite": "^6.0.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", - "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", - "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.5", - "@babel/types": "^7.26.5", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", - "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", - "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.5", - "@babel/parser": "^7.26.5", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.5", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", - "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@preact/preset-vite": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.4.tgz", - "integrity": "sha512-PpPnUlKUsbWZ2oBuAkAMnezhIYGsR7xi2EZcPjeTAjF1DhGl00IcPD1ZeXRFKp38i7Hk4kEdFlwpJ1525cAzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@prefresh/vite": "^2.4.1", - "@rollup/pluginutils": "^4.1.1", - "babel-plugin-transform-hook-names": "^1.0.2", - "debug": "^4.3.4", - "kolorist": "^1.8.0", - "magic-string": "0.30.5", - "node-html-parser": "^6.1.10", - "source-map": "^0.7.4", - "stack-trace": "^1.0.0-pre2" - }, - "peerDependencies": { - "@babel/core": "7.x", - "vite": "2.x || 3.x || 4.x || 5.x || 6.x" - } - }, - "node_modules/@prefresh/babel-plugin": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", - "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@prefresh/core": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.3.tgz", - "integrity": "sha512-nDzxj0tA1/M6APNAWqaxkZ+3sTdPHESa+gol4+Bw7rMc2btWdkLoNH7j9rGhUb8SThC0Vz0VoXtq+U+9azGLHg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "preact": "^10.0.0" - } - }, - "node_modules/@prefresh/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@prefresh/vite": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", - "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.22.1", - "@prefresh/babel-plugin": "0.5.1", - "@prefresh/core": "^1.5.1", - "@prefresh/utils": "^1.2.0", - "@rollup/pluginutils": "^4.2.1" - }, - "peerDependencies": { - "preact": "^10.4.0", - "vite": ">=2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", - "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", - "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", - "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", - "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", - "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", - "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", - "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", - "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", - "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", - "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", - "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", - "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", - "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", - "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", - "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", - "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", - "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", - "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", - "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-plugin-transform-hook-names": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", - "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@babel/core": "^7.12.10" - } - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "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" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001692", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", - "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", - "dev": true, - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.80", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz", - "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==", - "dev": true, - "license": "ISC" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.25.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", - "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/rollup": { - "version": "4.30.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", - "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.30.1", - "@rollup/rollup-android-arm64": "4.30.1", - "@rollup/rollup-darwin-arm64": "4.30.1", - "@rollup/rollup-darwin-x64": "4.30.1", - "@rollup/rollup-freebsd-arm64": "4.30.1", - "@rollup/rollup-freebsd-x64": "4.30.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", - "@rollup/rollup-linux-arm-musleabihf": "4.30.1", - "@rollup/rollup-linux-arm64-gnu": "4.30.1", - "@rollup/rollup-linux-arm64-musl": "4.30.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", - "@rollup/rollup-linux-riscv64-gnu": "4.30.1", - "@rollup/rollup-linux-s390x-gnu": "4.30.1", - "@rollup/rollup-linux-x64-gnu": "4.30.1", - "@rollup/rollup-linux-x64-musl": "4.30.1", - "@rollup/rollup-win32-arm64-msvc": "4.30.1", - "@rollup/rollup-win32-ia32-msvc": "4.30.1", - "@rollup/rollup-win32-x64-msvc": "4.30.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-trace": { - "version": "1.0.0-pre2", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", - "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "dev": true, - "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" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/vite": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", - "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - } - } + "name": "fakebook-ainiro", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fakebook-ainiro", + "version": "0.0.0", + "dependencies": { + "@reduxjs/toolkit": "^1.8.3", + "bootstrap": "^4.6.0", + "firebase": "^9.9.4", + "preact": "^10.25.3", + "react-bootstrap": "^1.5.2", + "react-dom": "^17.0.2", + "react-icons": "^4.2.0", + "react-player": "^2.12.0", + "react-redux": "^8.0.2", + "react-router-dom": "^5.2.0" + }, + "devDependencies": { + "@preact/preset-vite": "^2.9.3", + "vite": "^6.0.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.13.tgz", + "integrity": "sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", + "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", + "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check": "0.8.0", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.13.tgz", + "integrity": "sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app": "0.9.13", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.23.2.tgz", + "integrity": "sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.2.tgz", + "integrity": "sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth": "0.23.2", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", + "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", + "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "0.14.4", + "@firebase/database-types": "0.10.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", + "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.13.0.tgz", + "integrity": "sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.1", + "@grpc/grpc-js": "~1.7.0", + "@grpc/proto-loader": "^0.6.13", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.12.tgz", + "integrity": "sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-types": "2.5.1", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", + "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", + "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", + "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/functions": "0.10.0", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/installations": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", + "license": "ISC" + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", + "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", + "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/messaging/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==", + "license": "ISC" + }, + "node_modules/@firebase/performance": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.4", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==", + "license": "Apache-2.0" + }, + "node_modules/@firebase/storage": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", + "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", + "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "license": "Apache-2.0", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz", + "integrity": "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==", + "license": "Apache-2.0" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js/node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", + "license": "Apache-2.0" + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "license": "Apache-2.0", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@preact/preset-vite": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.4.tgz", + "integrity": "sha512-PpPnUlKUsbWZ2oBuAkAMnezhIYGsR7xi2EZcPjeTAjF1DhGl00IcPD1ZeXRFKp38i7Hk4kEdFlwpJ1525cAzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "0.30.5", + "node-html-parser": "^6.1.10", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x || 6.x" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.3.tgz", + "integrity": "sha512-nDzxj0tA1/M6APNAWqaxkZ+3sTdPHESa+gol4+Bw7rMc2btWdkLoNH7j9rGhUb8SThC0Vz0VoXtq+U+9azGLHg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "preact": "^10.0.0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@prefresh/vite": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.1", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0", + "vite": ">=2.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "license": "MIT", + "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/@restart/context": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.3.2" + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", + "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.30.1.tgz", + "integrity": "sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.30.1.tgz", + "integrity": "sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.30.1.tgz", + "integrity": "sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.30.1.tgz", + "integrity": "sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.30.1.tgz", + "integrity": "sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.30.1.tgz", + "integrity": "sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.30.1.tgz", + "integrity": "sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.30.1.tgz", + "integrity": "sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.30.1.tgz", + "integrity": "sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.30.1.tgz", + "integrity": "sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.30.1.tgz", + "integrity": "sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.30.1.tgz", + "integrity": "sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.30.1.tgz", + "integrity": "sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.30.1.tgz", + "integrity": "sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.30.1.tgz", + "integrity": "sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.30.1.tgz", + "integrity": "sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.30.1.tgz", + "integrity": "sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.30.1.tgz", + "integrity": "sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.30.1.tgz", + "integrity": "sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/invariant": { + "version": "2.2.37", + "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.37.tgz", + "integrity": "sha512-IwpIMieE55oGWiXkQPSBY1nw1nFs6bsKXTFskNY8sdS17K24vyEBRQZEwlRS7ZmXCWnJcQtbxWzly+cODWGs2A==", + "license": "MIT" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.10.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", + "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/warning": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", + "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-plugin-transform-hook-names": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.12.10" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/bootstrap": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", + "dev": true, + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "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==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.80", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz", + "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/firebase": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", + "integrity": "sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.13", + "@firebase/app-check": "0.8.0", + "@firebase/app-check-compat": "0.3.7", + "@firebase/app-compat": "0.2.13", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "0.23.2", + "@firebase/auth-compat": "0.4.2", + "@firebase/database": "0.14.4", + "@firebase/database-compat": "0.3.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-compat": "0.3.12", + "@firebase/functions": "0.10.0", + "@firebase/functions-compat": "0.3.5", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.4", + "@firebase/messaging-compat": "0.2.4", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-compat": "0.3.2", + "@firebase/util": "1.9.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "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==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "license": "MIT" + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT", + "peer": true + }, + "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==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "license": "Apache-2.0" + }, + "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==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.25.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.25.4.tgz", + "integrity": "sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "license": "MIT", + "dependencies": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + }, + "peerDependencies": { + "react": ">=0.14.0" + } + }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-bootstrap": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.6.8.tgz", + "integrity": "sha512-yD6uN78XlFOkETQp6GRuVe0s5509x3XYx8PfPbirwFTYCj5/RfmSs9YZGCwkUrhZNFzj7tZPdpb+3k50mK1E4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.14.0", + "@restart/context": "^2.1.4", + "@restart/hooks": "^0.4.7", + "@types/invariant": "^2.2.33", + "@types/prop-types": "^15.7.3", + "@types/react": ">=16.14.8", + "@types/react-transition-group": "^4.4.1", + "@types/warning": "^3.0.0", + "classnames": "^2.3.1", + "dom-helpers": "^5.2.1", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "prop-types-extra": "^1.1.0", + "react-overlays": "^5.1.2", + "react-transition-group": "^4.4.1", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" + }, + "node_modules/react-overlays": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", + "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.8", + "@popperjs/core": "^2.11.6", + "@restart/hooks": "^0.4.7", + "@types/warning": "^3.0.0", + "dom-helpers": "^5.2.0", + "prop-types": "^15.7.2", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-player": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.16.0.tgz", + "integrity": "sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.0.0", + "load-script": "^1.0.0", + "memoize-one": "^5.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.0.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/react-redux": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "license": "MIT", + "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": { + "@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": { + "@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.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "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==", + "license": "MIT", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.30.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.30.1.tgz", + "integrity": "sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.30.1", + "@rollup/rollup-android-arm64": "4.30.1", + "@rollup/rollup-darwin-arm64": "4.30.1", + "@rollup/rollup-darwin-x64": "4.30.1", + "@rollup/rollup-freebsd-arm64": "4.30.1", + "@rollup/rollup-freebsd-x64": "4.30.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.30.1", + "@rollup/rollup-linux-arm-musleabihf": "4.30.1", + "@rollup/rollup-linux-arm64-gnu": "4.30.1", + "@rollup/rollup-linux-arm64-musl": "4.30.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.30.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.30.1", + "@rollup/rollup-linux-riscv64-gnu": "4.30.1", + "@rollup/rollup-linux-s390x-gnu": "4.30.1", + "@rollup/rollup-linux-x64-gnu": "4.30.1", + "@rollup/rollup-linux-x64-musl": "4.30.1", + "@rollup/rollup-win32-arm64-msvc": "4.30.1", + "@rollup/rollup-win32-ia32-msvc": "4.30.1", + "@rollup/rollup-win32-x64-msvc": "4.30.1", + "fsevents": "~2.3.2" + } + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/uncontrollable": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", + "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.6.3", + "@types/react": ">=16.9.11", + "invariant": "^2.2.4", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.7.tgz", + "integrity": "sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "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==", + "license": "Apache-2.0", + "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==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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==", + "license": "MIT", + "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/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "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==", + "license": "ISC", + "engines": { + "node": ">=10" + } + } + } } diff --git a/package.json b/package.json index fe1355a..6814eea 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,27 @@ { - "name": "fakebook-ainiro", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview" - }, - "dependencies": { - "preact": "^10.25.3" - }, - "devDependencies": { - "@preact/preset-vite": "^2.9.3", - "vite": "^6.0.5" - } + "name": "fakebook-ainiro", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "preact": "^10.25.3", + "@reduxjs/toolkit": "^1.8.3", + "bootstrap": "^4.6.0", + "firebase": "^9.9.4", + "react-bootstrap": "^1.5.2", + "react-dom": "^17.0.2", + "react-icons": "^4.2.0", + "react-player": "^2.12.0", + "react-redux": "^8.0.2", + "react-router-dom": "^5.2.0" + }, + "devDependencies": { + "@preact/preset-vite": "^2.9.3", + "vite": "^6.0.5" + } } diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..5b0de0d --- /dev/null +++ b/src/App.css @@ -0,0 +1,21 @@ +.login { + width: 390px; + border: 1px solid lightgray; + border-radius: 5px; + box-shadow: 0px 9px 18px 2px lightgrey; + margin: auto; +} + +.bg-200 { + background-color: #e9ecef; +} + +.main-container { + max-width: 100em; + margin: auto; +} + +.title-footer { + font-size: small; + font-weight: lighter; +} diff --git a/src/app copy/store.js b/src/app copy/store.js new file mode 100644 index 0000000..72f4154 --- /dev/null +++ b/src/app copy/store.js @@ -0,0 +1,24 @@ +import { configureStore } from "@reduxjs/toolkit"; +import userReducer from "../features/user/userSlice"; +import currentUserReducer from "../features/currentUser/currentUserSlice"; +import usersReducer from "../features/users/usersSlice"; +import postsReducer from "../features/posts/postsSlice"; +import incomingMessagesReducer from "../features/incomingMessages/incomingMessagesSlice"; +import outgoingMessagesReducer from "../features/outgoingMessages/outgoingMessagesSlice"; +import imagesReducer from "../features/images/imagesSlice"; +import linkReducer from "../features/link/linkSlice"; +import accountPageReducer from "../features/accountPage/accountPageSlice"; + +export default configureStore({ + reducer: { + user: userReducer, + currentUser: currentUserReducer, + users: usersReducer, + posts: postsReducer, + incomingMessages: incomingMessagesReducer, + outgoingMessages: outgoingMessagesReducer, + images: imagesReducer, + link: linkReducer, + accountPage: accountPageReducer, + }, +}); diff --git a/src/app.jsx b/src/app.jsx index a2e3363..09a3bdf 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -1,43 +1,109 @@ -import { useState } from 'preact/hooks' -import preactLogo from './assets/preact.svg' -import viteLogo from '/vite.svg' -import './app.css' +import React, { useState, useCallback, useEffect } from "react"; +import "./App.css"; +import SignupModal from "./components/SignupModal.jsx"; +import Login from "./components/Login.jsx"; +import "bootstrap/dist/css/bootstrap.min.css"; +import Col from "react-bootstrap/Col"; +import Row from "react-bootstrap/Row"; +import RecentLogins from "./components/RecentLogins.jsx"; +import Button from "react-bootstrap/Button"; +import UserAccount from "./components/UserAccount"; +import PasswordReminderModal from "./components/PasswordReminderModal"; +import { useDispatch, useSelector } from "react-redux"; +import { subscribeAuth } from "./backend/backend"; +import { profileLinkSet } from "./features/accountPage/accountPageSlice"; -export function App() { - const [count, setCount] = useState(0) +function App() { + const user = useSelector((state) => state.user); + const dispatch = useDispatch(); - return ( - <> -
- - - - - - -
-

Vite + Preact

-
- -

- Edit src/app.jsx and save to test HMR -

-
-

- Check out{' '} - - create-preact - - , the official Preact + Vite starter -

-

- Click on the Vite and Preact logos to learn more -

- - ) + useEffect(() => { + const unsubscribe = subscribeAuth(); + return unsubscribe; + }, []); + + //Handle the modal + const [show, setShow] = useState(false); + + function handleClose() { + setShow(false); + } + + function handleShow() { + setShow(true); + } + + const handleCloseCallback = useCallback(handleClose, []); + + //get the first and lastName for the route of the profile + const name = + (user && user.displayName && user.displayName.trim().split(" ")) || []; + + const lastName = name.pop(); + + const firstName = name.join(" "); + + const profileLink = `/fakebook/${lastName}.${firstName}`; + + + useEffect(() => dispatch(profileLinkSet(profileLink)), [profileLink, dispatch]); + + //handling the password reminder button + const [isModalSignup, setModalSignup] = useState(true); + + function handleClickPasswordReminderBtn() { + setModalSignup(false); + handleShow(); + } + + if (user.isLoading) { + return
...Loading
; + } + + if (user.isSignedIn && !user.error) { + if (user.isEmailVerified) return ; + else return <>; + } else { + return ( + + + + + + +
+ + +
+ + +
+ + + setModalSignup(true)}> + + setModalSignup(true)} + /> +
+ + ); + } } + +export default App; diff --git a/src/app/store.js b/src/app/store.js new file mode 100644 index 0000000..d57bf82 --- /dev/null +++ b/src/app/store.js @@ -0,0 +1,24 @@ +import { configureStore } from '@reduxjs/toolkit' +import userReducer from '../features/user/userSlice' +import currentUserReducer from '../features/currentUser/currentUserSlice' +import usersReducer from '../features/users/usersSlice' +import postsReducer from '../features/posts/postsSlice' +import incomingMessagesReducer from '../features/incomingMessages/incomingMessagesSlice' +import outgoingMessagesReducer from '../features/outgoingMessages/outgoingMessagesSlice' +import imagesReducer from '../features/images/imagesSlice' +import linkReducer from '../features/link/linkSlice' +import accountPageReducer from '../features/accountPage/accountPageSlice' + +export default configureStore({ + reducer: { + user: userReducer, + currentUser: currentUserReducer, + users: usersReducer, + posts: postsReducer, + incomingMessages: incomingMessagesReducer, + outgoingMessages: outgoingMessagesReducer, + images: imagesReducer, + link: linkReducer, + accountPage: accountPageReducer, + }, +}); diff --git a/src/backend/backend.js b/src/backend/backend.js new file mode 100644 index 0000000..04f9c04 --- /dev/null +++ b/src/backend/backend.js @@ -0,0 +1,271 @@ +import firebase from "firebase/compat/app"; +import "firebase/compat/storage"; +import "firebase/compat/auth"; +import "firebase/compat/firestore"; +import "firebase/compat/app-check"; +import firebaseConfig from "../firebaseConfig"; +import store from "../app/store"; +import { + signIn, + signOut, + errorOccured, + loadingFinished, + loadingStarted, +} from "../features/user/userSlice"; +import { currentUserUpdated } from "../features/currentUser/currentUserSlice"; +import { usersUpdated } from "../features/users/usersSlice"; +import { postsUpdated } from "../features/posts/postsSlice"; +import { incomingMessagesUpdated } from "../features/incomingMessages/incomingMessagesSlice"; +import { outgoingMessagesUpdated } from "../features/outgoingMessages/outgoingMessagesSlice"; + +// URL of my website. +const FAKEBOOK_URL = { url: "https://alexerdei73.github.io/fakebook/" }; + +firebase.initializeApp(firebaseConfig); + +const appCheck = firebase.appCheck(); +// Pass your reCAPTCHA v3 site key (public key) to activate(). Make sure this +// key is the counterpart to the secret key you set in the Firebase console. +appCheck.activate( + "6LfCG9UhAAAAAL8vSI4Hbustx8baJEDMA0Sz1zD2", + + // Optional argument. If true, the SDK automatically refreshes App Check + // tokens as needed. + true +); + +const storage = firebase.storage(); + +export async function getImageURL(imagePath) { + const imageRef = storage.ref(imagePath); + const url = await imageRef.getDownloadURL(); + return url; +} + +const auth = firebase.auth(); + +export function subscribeAuth() { + return auth.onAuthStateChanged((user) => { + if (user) { + const id = user.uid; + const isEmailVerified = user.emailVerified; + const displayName = user.displayName; + store.dispatch(signIn({ id, displayName, isEmailVerified })); + } else { + store.dispatch(signOut()); + } + store.dispatch(loadingFinished()); + }); +} + +const firestore = firebase.firestore(); + +const usersCollection = firestore.collection("users"); + +//The following global variables get values, when the UserAccount component renders and runs +//subscribeCurrentUser. After that we use them globally in the following functions. +let userID; +let userDocRef; + +export function subscribeCurrentUser() { + userID = store.getState().user.id; //These are the + userDocRef = usersCollection.doc(userID); //global values + return userDocRef.onSnapshot((doc) => { + store.dispatch(currentUserUpdated(doc.data())); + }); +} + +export function currentUserOnline() { + userDocRef.update({ isOnline: true }); +} + +export function currentUserOffline() { + return userDocRef.update({ isOnline: false }); +} + +export function subscribeUsers() { + return usersCollection.onSnapshot((snapshot) => { + const users = []; + snapshot.forEach((user) => { + const userData = user.data(); + userData.userID = user.id; + users.push(userData); + }); + store.dispatch(usersUpdated(users)); + }); +} + +export async function signUserOut() { + store.dispatch(loadingStarted()); + await currentUserOffline(); + await auth.signOut(); + store.dispatch(loadingFinished()); +} + +export function subscribePosts() { + const postsCollection = firestore.collection("posts"); + return postsCollection.orderBy("timestamp", "desc").onSnapshot((snapshot) => { + const posts = []; + snapshot.forEach((post) => { + const postData = post.data(); + const timestamp = postData.timestamp; + let dateString = ""; + if (timestamp) dateString = timestamp.toDate().toLocaleString(); + postData.timestamp = dateString; + postData.postID = post.id; + posts.push(postData); + }); + store.dispatch(postsUpdated(posts)); + }); +} + +export function subscribeMessages(typeOfMessages) { + let typeOfUser; + let actionCreator; + if (typeOfMessages === "incoming") { + typeOfUser = "recipient"; + actionCreator = incomingMessagesUpdated; + } else { + typeOfUser = "sender"; + actionCreator = outgoingMessagesUpdated; + } + const messagesCollection = firestore + .collection("messages") + .where(typeOfUser, "==", userID); + return messagesCollection.onSnapshot((snapshot) => { + const messages = []; + snapshot.forEach((message) => { + const messageData = message.data(); + const timestamp = message.data().timestamp; + let dateString; + if (timestamp) dateString = timestamp.toDate().toISOString(); + else dateString = ""; + messageData.timestamp = dateString; + messageData.id = message.id; + if (dateString !== "") messages.push(messageData); + }); + store.dispatch(actionCreator(messages)); + }); +} + +export async function createUserAccount(user) { + try { + const result = await auth.createUserWithEmailAndPassword( + user.email, + user.password + ); + // Update the nickname + await result.user.updateProfile({ + displayName: `${user.firstname} ${user.lastname}`, + }); + // get the index of the new user with the same username + const querySnapshot = await firestore + .collection("users") + .where("firstname", "==", user.firstname) + .where("lastname", "==", user.lastname) + .get(); + const index = querySnapshot.size; + // Create firestore document + await firestore.collection("users").doc(result.user.uid).set({ + firstname: user.firstname, + lastname: user.lastname, + profilePictureURL: "fakebook-avatar.jpeg", + backgroundPictureURL: "background-server.jpg", + photos: [], + posts: [], + isOnline: false, + index: index, + }); + // Sign out the user + await firebase.auth().signOut(); + // Send Email Verification and redirect to my website. + await result.user.sendEmailVerification(FAKEBOOK_URL); + console.log("Verification email has been sent."); + } catch (error) { + // Update the error + store.dispatch(errorOccured(error.message)); + console.log(error.message); + } +} + +export async function signInUser(user) { + const EMAIL_VERIFICATION_ERROR = + "Please verify your email before to continue"; + const NO_ERROR = ""; + try { + const result = await auth.signInWithEmailAndPassword( + user.email, + user.password + ); + // email has been verified? + if (!result.user.emailVerified) { + auth.signOut(); + store.dispatch(errorOccured(EMAIL_VERIFICATION_ERROR)); + } else { + store.dispatch(errorOccured(NO_ERROR)); + } + } catch (error) { + // Update the error + store.dispatch(errorOccured(error.message)); + } finally { + store.dispatch(loadingFinished()); + } +} + +export function sendPasswordReminder(email) { + return auth.sendPasswordResetEmail(email); +} + +export async function upload(post) { + const refPosts = firestore.collection("posts"); + const docRef = await refPosts.add({ + ...post, + timestamp: firebase.firestore.FieldValue.serverTimestamp(), + }); + const postID = docRef.id; + updateUserPosts(postID); + return docRef; +} + +function updateUserPosts(postID) { + const user = store.getState().currentUser; + let newPosts; + if (user.posts) newPosts = [...user.posts]; + else newPosts = []; + newPosts.unshift(postID); + userDocRef.update({ + posts: newPosts, + }); +} + +export function updatePost(post, postID) { + const postRef = firestore.collection("posts").doc(postID); + //We need to remove the timestamp, because it is stored in serializable format in the redux-store + //so we can't write it back to firestore + const { timestamp, ...restPost } = post; + postRef.update(restPost); +} + +export function addFileToStorage(file) { + const ref = storage.ref(userID).child(file.name); + return ref.put(file); +} + +export function updateProfile(profile) { + console.log(userDocRef); + console.log(profile); + return userDocRef.update(profile); +} + +const refMessages = firestore.collection("messages"); + +export function uploadMessage(msg) { + return refMessages.add({ + ...msg, + timestamp: firebase.firestore.FieldValue.serverTimestamp(), + }); +} + +export function updateToBeRead(messageID) { + return refMessages.doc(messageID).update({ isRead: true }); +} diff --git a/src/components/CircularImage.jsx b/src/components/CircularImage.jsx new file mode 100644 index 0000000..ce3040f --- /dev/null +++ b/src/components/CircularImage.jsx @@ -0,0 +1,44 @@ +import React from "react"; +import StorageImage from "./StorageImage"; + +const CircularImage = (props) => { + const { size, url, isOnline, ...rest } = props; + + const radius = Math.floor(size / 6); + + const shift = Math.floor(0.8536 * size - radius / 2); + + return ( + <> + + {isOnline && ( +
+ )} + + ); +}; + +export default CircularImage; diff --git a/src/components/Comments.css b/src/components/Comments.css new file mode 100644 index 0000000..5623ed6 --- /dev/null +++ b/src/components/Comments.css @@ -0,0 +1,13 @@ +.comment-img-container { + position: relative; + width: 100%; + padding: 20px; +} + +.img-to-comment { + width: 30%; +} + +.comment-btn { + border-radius: 18px; +} diff --git a/src/components/Comments.jsx b/src/components/Comments.jsx new file mode 100644 index 0000000..d87c807 --- /dev/null +++ b/src/components/Comments.jsx @@ -0,0 +1,155 @@ +import React, { useState } from "react"; +import { Col, Row, CloseButton, Button } from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import CircularImage from "./CircularImage"; +import UploadPhoto from "./UploadPhoto"; +import DisplayComment from "./DisplayComment"; +import StyledTextarea from "./StyledTextarea"; +import { MdPhotoCamera } from "react-icons/md"; +import { MdSend } from "react-icons/md"; +import { + addPhoto, + handleTextareaChange, + delPhoto, + handleKeyPress, +} from "./helper"; +import "./Comments.css"; +import { useSelector } from "react-redux"; +import { updatePost } from "../backend/backend"; + +const Comments = (props) => { + const { post } = props; + + const user = useSelector((state) => state.currentUser); + const userID = useSelector((state) => state.user.id); + + const WELCOME_TEXT = "Write a comment ..."; + const INIT_COMMENT = { + userID: userID, + text: "", + isPhoto: false, + photoURL: "", + }; + const [comment, setComment] = useState(INIT_COMMENT); + + const [show, setShow] = useState(false); + + function handleChange(e) { + handleTextareaChange({ + e: e, + state: comment, + setState: setComment, + }); + } + + function addPhotoToComment(file) { + addPhoto({ + state: comment, + setState: setComment, + file: file, + userID: userID, + }); + } + + function deletePhoto() { + delPhoto({ + state: comment, + setState: setComment, + user: user, + userID: userID, + }); + } + + function saveComment() { + if (comment.text === "" && !comment.isPhoto) return; + const newPost = { + ...post, + comments: [], + }; + const postID = post.postID; + if (post.comments) newPost.comments = [...post.comments]; + newPost.comments.push(comment); + updatePost(newPost, postID); + setComment(INIT_COMMENT); + } + + return ( + +
+ {post.comments && + post.comments.map((comment, index) => ( + + ))} + + + + + + + + handleKeyPress(e, saveComment)} + welcomeText={WELCOME_TEXT} + value={comment.text} + className="w-100 mt-2" + /> + + + + + + + + + {comment.isPhoto && ( +
+ +
+ +
+
+ )} + +
+ + + + ); +}; + +export default Comments; diff --git a/src/components/Contacts.css b/src/components/Contacts.css new file mode 100644 index 0000000..49aa94c --- /dev/null +++ b/src/components/Contacts.css @@ -0,0 +1,33 @@ +.container-choose-to:hover { + background-color: lightgray; +} + +.nav-btn { + border: none; + text-align: left; +} + +.nav-btn:focus { + background-color: lightgray; +} + +.white { + background-color: white; +} + +.msg-btn { + position: fixed; + background: white; + padding: 12px; + border-radius: 50%; + bottom: 20px; + right: calc((100vw - 100em) / 2 + 20px); + box-shadow: 0px 5px 5px 0px lightgray; + border: none; +} + +@media (max-width: 100em) { + .msg-btn { + right: 20px; + } +} diff --git a/src/components/Contacts.jsx b/src/components/Contacts.jsx new file mode 100644 index 0000000..34a3126 --- /dev/null +++ b/src/components/Contacts.jsx @@ -0,0 +1,354 @@ +import React, { useState, useRef, useEffect, useCallback } from "react"; +import { + Card, + CloseButton, + Nav, + OverlayTrigger, + Button, + Col, + Row, +} from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import ProfileLink from "./ProfileLink"; +import { FiEdit } from "react-icons/fi"; +import { HiOutlinePhotograph } from "react-icons/hi"; +import { MdSend } from "react-icons/md"; +import StyledTextarea from "./StyledTextarea"; +import UploadPhoto from "./UploadPhoto"; +import Conversation from "./Conversation"; +import { + addPhoto, + handleTextareaChange, + delPhoto, + handleKeyPress, +} from "./helper"; +import "./Contacts.css"; +import { useSelector } from "react-redux"; +import { + subscribeMessages, + updateToBeRead, + uploadMessage, +} from "../backend/backend"; + +const Contacts = () => { + const [showOverlay, setShowOverlay] = useState(false); + const [recipient, setRecipient] = useState(null); + const [showPhotoDlg, setShowPhotoDlg] = useState(null); + + const user = useSelector((state) => state.currentUser); + const userID = useSelector((state) => state.user.id); + const users = useSelector((state) => state.users); + + const WELCOME_TEXT = "Aa"; + const INIT_MESSAGE = { + sender: `${userID}`, + recipient: "", + text: "", + isPhoto: false, + photoURL: "", + isRead: false, + }; + const [message, setMessage] = useState(INIT_MESSAGE); + + function handleClick(user) { + if (!user && recipient) return; + if (recipient && user.userID !== recipient.userID) return; + setShowOverlay(true); + let id; + if (user) id = user.userID; + else id = ""; + const newMessage = { ...message }; + newMessage.recipient = id; + setMessage(newMessage); + setRecipient(user); + } + + const handleClickCallback = useCallback(handleClick, [user]); + + async function handleClose() { + await updateReadStatusOfMessages(recipient); + removeSender(); + setShowOverlay(false); + setRecipient(null); + } + + function handleChange(e) { + handleTextareaChange({ + e: e, + state: message, + setState: setMessage, + }); + } + + function addPhotoToMessage(file) { + addPhoto({ + state: message, + setState: setMessage, + file: file, + userID: userID, + }); + } + + function deletePhoto() { + delPhoto({ + state: message, + setState: setMessage, + user: user, + userID: userID, + }); + } + + const convRowRef = useRef(null); + const [scrollHeight, setScrollHeight] = useState(""); + + function saveMessage() { + uploadMessage(message).then(() => { + setMessage(INIT_MESSAGE); + setScrollHeight(convRowRef.current.scrollHeight); + }); + } + + useEffect(() => { + if (convRowRef.current) convRowRef.current.scrollTop = scrollHeight; + }, [scrollHeight]); + + useEffect(() => { + const unsubscribeIncomingMsg = subscribeMessages("incoming"); + const unsubscribeOutgoingMsg = subscribeMessages("outgoing"); + return () => { + unsubscribeIncomingMsg(); + unsubscribeOutgoingMsg(); + }; + }, []); + + const [senders, setSenders] = useState([]); + + const incomingMessages = useSelector((state) => state.incomingMessages); + const unread = incomingMessages.filter((message) => !message.isRead); + + useEffect(() => { + const sendersWithUnreadMsg = []; + unread.forEach((msg) => { + const sender = msg.sender; + if (sendersWithUnreadMsg.indexOf(sender) === -1) + sendersWithUnreadMsg.push(sender); + }); + if (senders.length !== sendersWithUnreadMsg.length) + setSenders(sendersWithUnreadMsg); + }, [senders, unread]); + + useEffect(() => { + if (senders.length === 0) return; + const last = senders.length - 1; + const sender = senders[last]; + handleClickCallback(users.find((usr) => usr.userID === sender)); + }, [senders, users, handleClickCallback]); + + function updateReadStatusOfMessages(sender) { + const messagesToUpdate = unread.filter( + (msg) => msg.sender === sender.userID + ); + const updates = []; + messagesToUpdate.forEach((msg) => { + const messageID = msg.id; + updates.push(updateToBeRead(messageID)); + }); + return Promise.all(updates); + } + + function removeSender() { + const newSenders = [...senders]; + newSenders.pop(); + setSenders(newSenders); + } + + //We open the overlay card programmatically again, otherwise the user is unable to send + //more than one message. + if (recipient) + if (showOverlay && message.recipient === "") + //We only do this if we set back the INIT_MESSAGE after previous message had sent. + handleClick(recipient); + return ( + <> + + + + + + {!recipient && ( + <> +
New Message
+
To:
+ + )} + {recipient && ( + + )} +
+ +
+
+
+ {recipient && ( + + + + )} + {!recipient && ( + + {users.map((user, index) => + user.userID === userID ? ( +
+ ) : ( + + ) + )} + + )} +
+ {recipient && ( + + + {message.text === "" && ( + + + + )} + + {message.isPhoto && ( +
+ +
+ +
+
+ )} + handleKeyPress(e, saveMessage)} + welcomeText={WELCOME_TEXT} + value={message.text} + className="w-100 mt-2" + /> + + + + +
+
+ )} + + + + } + > + +
+ + ); +}; + +export default Contacts; diff --git a/src/components/Conversation.jsx b/src/components/Conversation.jsx new file mode 100644 index 0000000..b4aefa0 --- /dev/null +++ b/src/components/Conversation.jsx @@ -0,0 +1,37 @@ +import React, { useEffect, useState } from "react"; +import DisplayConversation from "./DisplayConversation"; +import { useSelector } from "react-redux"; + +const Conversation = (props) => { + const { recipient } = props; + + const [conversation, setConversation] = useState([]); + + const incomingMessages = useSelector((state) => state.incomingMessages); + const outgoingMessages = useSelector((state) => state.outgoingMessages); + + const incoming = incomingMessages.filter( + (message) => message.sender === recipient + ); + const outgoing = outgoingMessages.filter( + (message) => message.recipient === recipient + ); + + function getConversation(incoming, outgoing) { + const conversation = [...incoming, ...outgoing]; + const sorted = conversation.sort( + (msgA, msgB) => new Date(msgA.timestamp) - new Date(msgB.timestamp) + ); + return sorted; + } + + useEffect(() => { + const newConversation = getConversation(incoming, outgoing); + if (newConversation.length !== conversation.length) + setConversation(newConversation); + }, [incoming, outgoing, conversation]); + + return ; +}; + +export default Conversation; diff --git a/src/components/CreatePost.css b/src/components/CreatePost.css new file mode 100644 index 0000000..66fe0b8 --- /dev/null +++ b/src/components/CreatePost.css @@ -0,0 +1,28 @@ +.text-btn { + background: #e9ecef; + border-radius: 20px; + position: absolute; + top: 20px; + left: 80px; + color: gray; + border: none; + text-align: left; + width: calc(100% - 100px); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.text-div:hover { + background: lightgray; +} + +.add-btn { + display: block; + flex: 1; + max-width: 150px; +} + +.card .d-flex { + justify-content: space-between; +} diff --git a/src/components/CreatePost.jsx b/src/components/CreatePost.jsx new file mode 100644 index 0000000..13fd179 --- /dev/null +++ b/src/components/CreatePost.jsx @@ -0,0 +1,97 @@ +import React, { useState } from "react"; +import { Card, Button } from "react-bootstrap"; +import CircularImage from "./CircularImage"; +import PostModal from "./PostModal"; +import "./CreatePost.css"; +import { HiOutlinePhotograph } from "react-icons/hi"; +import { AiFillYoutube } from "react-icons/ai"; +import { useSelector } from "react-redux"; + +const CreatePost = (props) => { + const { firstname, isCurrentUser, ...rest } = props; + + const user = useSelector((state) => state.currentUser); + + const PLACEHOLDER_FOR_CURRENT_USER = `What's on your mind ${user.firstname}?`; + const PLACEHOLDER_FOR_ANOTHER_USER = `Write something to ${firstname}`; + + const [showPostModal, setShowPostModal] = useState(false); + const [isYoutubeBtnPressed, setYoutubeBtnPressed] = useState(false); + + const [text, setText] = useState(""); + + const handleClose = () => { + setShowPostModal(false); + setYoutubeBtnPressed(false); + }; + + const handleClick = () => setShowPostModal(true); + + const handleYoutubeBtnClick = () => { + setYoutubeBtnPressed(true); + setShowPostModal(true); + }; + + function getPlaceholder() { + if (isCurrentUser) return PLACEHOLDER_FOR_CURRENT_USER; + else return PLACEHOLDER_FOR_ANOTHER_USER; + } + + function getText() { + const MAX_LENGTH = 55; + const length = text.length; + if (length === 0) return getPlaceholder(); + else { + let newText = text.slice(0, MAX_LENGTH); + if (length > MAX_LENGTH) newText += "..."; + return newText; + } + } + + return ( + <> + + + + + + +
+
+ + +
+
+
+ + + + ); +}; + +export default CreatePost; diff --git a/src/components/DisplayComment.jsx b/src/components/DisplayComment.jsx new file mode 100644 index 0000000..c6dd86b --- /dev/null +++ b/src/components/DisplayComment.jsx @@ -0,0 +1,40 @@ +import React from "react"; +import { Row, Col } from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import CircularImage from "./CircularImage"; +import { useSelector } from "react-redux"; + +const DisplayComment = (props) => { + const { comment, ...rest } = props; + + const userID = comment.userID; + + const users = useSelector((state) => state.users); + + const user = users.find((user) => user.userID === userID); + + return ( + + + + + +

+ {`${user.firstname} ${user.lastname} `} + {comment.text} +

+ {comment.isPhoto && ( + + )} + +
+ ); +}; + +export default DisplayComment; diff --git a/src/components/DisplayConversation.jsx b/src/components/DisplayConversation.jsx new file mode 100644 index 0000000..83079e7 --- /dev/null +++ b/src/components/DisplayConversation.jsx @@ -0,0 +1,17 @@ +import React from "react"; +import { Col } from "react-bootstrap"; +import Message from "./Message"; + +const DisplayConversation = (props) => { + const { conversation } = props; + + return ( + + {conversation.map((msg, index) => ( + + ))} + + ); +}; + +export default DisplayConversation; diff --git a/src/components/DisplayPost.jsx b/src/components/DisplayPost.jsx new file mode 100644 index 0000000..cd0d69b --- /dev/null +++ b/src/components/DisplayPost.jsx @@ -0,0 +1,148 @@ +import React, { useState } from "react"; +import { Card, Button } from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import ProfileLink from "./ProfileLink"; +import LikesModal from "./LikesModal"; +import Comments from "./Comments"; +import { AiOutlineLike, AiFillLike } from "react-icons/ai"; +import { GoComment } from "react-icons/go"; +import { useSelector } from "react-redux"; +import { updatePost } from "../backend/backend"; +import ReactPlayer from "react-player/lazy"; + +const DisplayPost = (props) => { + const { post, ...rest } = props; + + const userID = useSelector((state) => state.user.id); + const users = useSelector((state) => state.users); + + const [show, setShow] = useState(false); + + const [showComments, setShowComments] = useState(false); + + function handleHide() { + setShow(false); + } + + //We avoid error if post is undefind + if (!post) return <>; + + const postID = post.postID; + + const user = users.find((user) => user.userID === post.userID); + + //We avoid error if user is undefined + if (!user) return <>; + + function index() { + return post.likes.indexOf(userID); + } + + function isLiked() { + return !(index() === -1); + } + + function handleClick() { + const likes = [...post.likes]; + const index = likes.indexOf(userID); + if (index === -1) likes.push(userID); + else likes.splice(index, 1); + updatePost({ likes: likes }, postID); + } + + function handleCommentClick() { + setShowComments(true); + } + + function getYouTubeURL(url) { + const index = url.lastIndexOf("/"); + const videoID = url.slice(index + 1); + const newURL = `https://www.youtube.com/watch?v=${videoID}`; + return newURL; + } + + return ( + + + + + {post.timestamp} + + + + {post.text} + {post.isPhoto && ( + + )} + {post.isYoutube && ( +
+ +
+ )} +
+ + + +
+ + + {showComments && } +
+ + +
+ ); +}; + +export default DisplayPost; diff --git a/src/components/DisplayUserPost.jsx b/src/components/DisplayUserPost.jsx new file mode 100644 index 0000000..9ab0cff --- /dev/null +++ b/src/components/DisplayUserPost.jsx @@ -0,0 +1,14 @@ +import React from "react"; +import DisplayPost from "./DisplayPost"; +import { useSelector } from "react-redux"; + +const DisplayUserPost = (props) => { + const { postID } = props; + + const posts = useSelector((state) => state.posts); + const post = posts.find((post) => post.postID === postID); + + return ; +}; + +export default DisplayUserPost; diff --git a/src/components/FriendCard.css b/src/components/FriendCard.css new file mode 100644 index 0000000..95dd195 --- /dev/null +++ b/src/components/FriendCard.css @@ -0,0 +1,23 @@ +.popup-card { + position: relative; + width: 400px; + height: 200px; + background: white; + border: 2px solid lightgray; + border-radius: 10px; +} + +.name-tag { + position: absolute; + top: 20px; + left: 160px; +} + +.profile-picture { + object-fit: cover; +} + +.friend-btn { + border: none; + background: white; +} diff --git a/src/components/FriendCard.jsx b/src/components/FriendCard.jsx new file mode 100644 index 0000000..49a30d1 --- /dev/null +++ b/src/components/FriendCard.jsx @@ -0,0 +1,70 @@ +import React, { useState } from "react"; +import { Col, OverlayTrigger } from "react-bootstrap"; +import { useHistory } from "react-router-dom"; +import CircularImage from "./CircularImage"; +import StorageImage from "./StorageImage"; +import "./FriendCard.css"; + +const FriendCard = (props) => { + const { user } = props; + + const userName = `${user.firstname} ${user.lastname}`; + + const [showOverlay, setShowOverlay] = useState(false); + + const history = useHistory(); + + function handleClick() { + history.push( + user.index && user.index > 0 + ? `/fakebook/${user.lastname}.${user.firstname}.${user.index}` + : `/fakebook/${user.lastname}.${user.firstname}` + ); + } + + return ( + + setShowOverlay(true)} + onMouseLeave={() => setShowOverlay(false)} + onClick={handleClick} + > +
+ +
+

+ {userName} +

+
+ } + > + + + + + ); +}; + +export default FriendCard; diff --git a/src/components/FriendList.jsx b/src/components/FriendList.jsx new file mode 100644 index 0000000..07dc10b --- /dev/null +++ b/src/components/FriendList.jsx @@ -0,0 +1,46 @@ +import React from "react"; +import ProfileLink from "./ProfileLink"; +import { Col } from "react-bootstrap"; +import { Link } from "react-router-dom"; +import { useSelector } from "react-redux"; + +const FriendList = (props) => { + const { users, variant } = props; + + const allUsers = useSelector((state) => state.users); + + //Component is used with users prop in LikesModal, but without users prop in FriendsListPage + let usersToUse = allUsers; + if (users) usersToUse = users; + + const isModal = variant === "modal"; + + return ( + +
+ {usersToUse.map((user, index) => { + let profileLink = `/fakebook/${user.lastname}.${user.firstname}`; + if (user.index && user.index > 0) + profileLink = profileLink + `.${user.index}`; + return ( + + + + ); + })} +
+ + ); +}; + +export default FriendList; diff --git a/src/components/Friends.jsx b/src/components/Friends.jsx new file mode 100644 index 0000000..088ab66 --- /dev/null +++ b/src/components/Friends.jsx @@ -0,0 +1,51 @@ +import React, { useEffect } from "react"; +import { Card, Row } from "react-bootstrap"; +import { Link, useRouteMatch } from "react-router-dom"; +import FriendCard from "./FriendCard"; +import { handleClickLink } from "./helper"; +import { useSelector } from "react-redux"; + +const Friends = (props) => { + const { url } = useRouteMatch(); + + const { linkHandling } = props; + const { linkRefs, linkState } = linkHandling; + const [activeLink, setActiveLink] = linkState; + const friendsLinkRef = linkRefs.friends; + + + const users = useSelector((state) => state.users); + + useEffect(() => { + handleClickLink( + { currentTarget: friendsLinkRef.current }, + activeLink, + setActiveLink + ); + }, [activeLink, friendsLinkRef, setActiveLink]); + + //copyUsers never undefined to avoid error + let copyUsers; + if (!users) copyUsers = []; + else copyUsers = users; + + return ( + + + + + Friends + + + + + {copyUsers.map((user, index) => ( + + ))} + + + + ); +}; + +export default Friends; diff --git a/src/components/FriendsListPage.css b/src/components/FriendsListPage.css new file mode 100644 index 0000000..eea77ec --- /dev/null +++ b/src/components/FriendsListPage.css @@ -0,0 +1,28 @@ +.friends-list { + margin-top: 50px; + height: 92.5vh; +} + +.col-two { + overflow-x: hidden; +} + +.profile-container { + width: 98%; + min-width: 600px; + margin-top: -3.5%; + padding-right: 25px; +} + +.nav-link:hover { + background-color: lightgray; +} + +@media (max-width: 600) { + .profile-container { + width: auto; + min-width: none; + margin-top: 0; + padding-right: 0; + } +} diff --git a/src/components/FriendsListPage.jsx b/src/components/FriendsListPage.jsx new file mode 100644 index 0000000..dbe2b35 --- /dev/null +++ b/src/components/FriendsListPage.jsx @@ -0,0 +1,53 @@ +import React, { useEffect } from "react"; +import Profile from "./Profile"; +import FriendList from "./FriendList"; +import { Row, Col } from "react-bootstrap"; +import { useLocation } from "react-router-dom"; +import "./FriendsListPage.css"; +import imgFriends from "../images/friends.jpg"; +import { useDispatch } from "react-redux"; +import { linkUpdated } from "../features/link/linkSlice"; + +const FriendsListPage = (props) => { + + const FRIENDS_LIST_PAGE_PATH = "/fakebook/friends/list"; + + const location = useLocation(); + const dispatch = useDispatch(); + + const isNoUser = FRIENDS_LIST_PAGE_PATH === location.pathname; + + //we set the active link to the friends link when it renders + useEffect(() => { + dispatch(linkUpdated("friends")); + }, [dispatch]); + + return window.innerWidth > 600 || isNoUser ? ( + + + + {isNoUser ? ( +
+ cartoon of fakebook friends +
+ Select people's names to preview their profile. +
+
+ ) : ( +
+ +
+ )} + +
+ ) : ( + + ); +}; + +export default FriendsListPage; diff --git a/src/components/HomePage.css b/src/components/HomePage.css new file mode 100644 index 0000000..4183f7e --- /dev/null +++ b/src/components/HomePage.css @@ -0,0 +1,22 @@ +/* Hide scrollbar for Chrome, Safari and Opera */ +.hide-scrollbar::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.hide-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +@media (max-width: 640px) { + .contacts-col { + display: none; + } +} + +@media (max-width: 992px) { + .left-navbar-col { + display: none; + } +} diff --git a/src/components/HomePage.jsx b/src/components/HomePage.jsx new file mode 100644 index 0000000..53f11f3 --- /dev/null +++ b/src/components/HomePage.jsx @@ -0,0 +1,47 @@ +import React, { useEffect } from "react"; +import { Row, Col } from "react-bootstrap"; +import PostView from "./PostView"; +import LeftNavbar from "./LeftNavbar"; +import VideoView from "./VideoView"; +import Contacts from "./Contacts"; +import "./HomePage.css"; +import { useSelector, useDispatch } from "react-redux"; +import { linkUpdated } from "../features/link/linkSlice"; + +const HomePage = (props) => { + const { className } = props; + + const accountPage = useSelector((state) => state.accountPage); + const { profileLink, isWatch } = accountPage; + const dispatch = useDispatch(); + + //we set the active link to the home link when it renders + useEffect(() => { + dispatch(linkUpdated(isWatch ? "watch" : "home")); + }, [isWatch, dispatch]); + + return ( + + + + + + {!isWatch && } + {isWatch && } + + {!isWatch && ( + + + + )} + + ); +}; + +export default HomePage; diff --git a/src/components/LeftNavbar.css b/src/components/LeftNavbar.css new file mode 100644 index 0000000..7aeb598 --- /dev/null +++ b/src/components/LeftNavbar.css @@ -0,0 +1,8 @@ +.navitem { + margin-left: 10px; + border-radius: 5px; +} + +.navitem:hover { + background-color: lightgray; +} diff --git a/src/components/LeftNavbar.jsx b/src/components/LeftNavbar.jsx new file mode 100644 index 0000000..3deb4e8 --- /dev/null +++ b/src/components/LeftNavbar.jsx @@ -0,0 +1,40 @@ +import React from "react"; +import { Nav } from "react-bootstrap"; +import { Link } from "react-router-dom"; +import ProfileLink from "./ProfileLink"; +import { FaUserFriends } from "react-icons/fa"; +import { MdOndemandVideo } from "react-icons/md"; +import "./LeftNavbar.css"; +import { useSelector } from "react-redux"; + +const LeftNavbar = (props) => { + const user = useSelector((state) => state.currentUser); + + return ( + + ); +}; + +export default LeftNavbar; diff --git a/src/components/LikesModal.jsx b/src/components/LikesModal.jsx new file mode 100644 index 0000000..3f7823d --- /dev/null +++ b/src/components/LikesModal.jsx @@ -0,0 +1,27 @@ +import React from "react"; +import { Modal } from "react-bootstrap"; +import FriendList from "./FriendList"; +import { useSelector } from "react-redux"; + +const LikesModal = (props) => { + const { show, onHide, likes } = props; + + const users = useSelector((state) => state.users); + + const usersWhoLike = likes.map((userID) => + users.find((user) => user.userID === userID) + ); + + return ( + + + All + + + + + + ); +}; + +export default LikesModal; diff --git a/src/components/Login.jsx b/src/components/Login.jsx new file mode 100644 index 0000000..87676bc --- /dev/null +++ b/src/components/Login.jsx @@ -0,0 +1,81 @@ +import React, { useState } from "react"; +import Form from "react-bootstrap/Form"; +import Button from "react-bootstrap/Button"; +import { useSelector, useDispatch } from "react-redux"; +import { errorOccured, loadingStarted } from "../features/user/userSlice"; +import { signInUser } from "../backend/backend"; + +const Login = (props) => { + const { onClickForgottenPswd } = props; + + const [state, setState] = useState({ email: "", password: "" }); + + // onChange function + const handleChange = (e) => { + const newState = { ...state }; + newState[e.target.name] = e.target.value; + setState(newState); + dispatch(errorOccured("")); + }; + + const errorMsg = useSelector((state) => state.user.error); + const dispatch = useDispatch(); + + // Submit function (Create account) + const handleSubmit = (e) => { + e.preventDefault(); + e.stopPropagation(); + if (state.email === "") { + dispatch(errorOccured("Email is required.")); + return; + } else if (state.password === "") { + dispatch(errorOccured("Password is required.")); + return; + } + dispatch(loadingStarted()); + signInUser(state); + }; + + return ( + <> +
+ + + {errorMsg} + + + + + ); +}; + +export default Login; diff --git a/src/components/Message.jsx b/src/components/Message.jsx new file mode 100644 index 0000000..353d0f7 --- /dev/null +++ b/src/components/Message.jsx @@ -0,0 +1,64 @@ +import React from "react"; +import { Row } from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import { useSelector } from "react-redux"; + +const Message = (props) => { + const { message, ...rest } = props; + + const userID = useSelector((state) => state.user.id); + + const senderStyle = { + width: "75%", + backgroundColor: "dodgerblue", + color: "white", + padding: "16px", + borderRadius: "16px", + }; + + const receiverStyle = { + width: "75%", + backgroundColor: "lightgray", + color: "black", + padding: "16px", + borderRadius: "16px", + }; + + return ( + +
+ {new Date(message.timestamp).toLocaleString()} +
+ {message.isPhoto && ( +
+ +
+ )} +

+ {message.text} +

+
+ ); +}; + +export default Message; diff --git a/src/components/MiniFriends.jsx b/src/components/MiniFriends.jsx new file mode 100644 index 0000000..4f18df0 --- /dev/null +++ b/src/components/MiniFriends.jsx @@ -0,0 +1,89 @@ +import React from "react"; +import { Card, Row, Col } from "react-bootstrap"; +import { Link } from "react-router-dom"; +import { handleClickLink } from "./helper"; +import ResponsiveImage from "./ResponsiveImage"; +import { useSelector } from "react-redux"; + +const MiniFriends = (props) => { + const { user, linkHandling, ...rest } = props; + + const { linkRefs, linkState } = linkHandling; + const [activeLink, setActiveLink] = linkState; + const { friends: friendsLinkRef } = linkRefs; + + const NUMBER_OF_FRIENDS = 9; + + const friendsLink = + user.index && user.index > 0 + ? `/fakebook/${user.lastname}.${user.firstname}.${user.index}/Friends` + : `/fakebook/${user.lastname}.${user.firstname}/Friends`; + + function handleClick() { + handleClickLink( + { currentTarget: friendsLinkRef.current }, + activeLink, + setActiveLink + ); + } + + const users = useSelector((state) => state.users); + + return ( + + + + + Friends + + + + {users.length} friends + + + {users.map((user, index) => { + const userProfileURL = + user.index && user.index > 0 + ? `/fakebook/${user.lastname}.${user.firstname}.${user.index}` + : `/fakebook/${user.lastname}.${user.firstname}`; + const userName = `${user.firstname} ${user.lastname}`; + return ( + //we render maximum 9 friends + index < NUMBER_OF_FRIENDS && ( + + + +
+

+ {userName} +

+
+ + + ) + ); + })} +
+
+
+ ); +}; + +export default MiniFriends; diff --git a/src/components/MiniPhotos.jsx b/src/components/MiniPhotos.jsx new file mode 100644 index 0000000..8c3e63a --- /dev/null +++ b/src/components/MiniPhotos.jsx @@ -0,0 +1,74 @@ +import React from "react"; +import { Card, Row, Col } from "react-bootstrap"; +import { Link } from "react-router-dom"; +import ResponsiveImage from "./ResponsiveImage"; +import { handleClickLink } from "./helper"; + +const MiniPhotos = (props) => { + const { user, userID, linkHandling, ...rest } = props; + + const { linkRefs, linkState } = linkHandling; + const [activeLink, setActiveLink] = linkState; + const { photos: photosLinkRef } = linkRefs; + + const photos = user.photos; + + const NUMBER_OF_PHOTOS = 9; + + const photosLink = `/fakebook/${user.lastname}.${user.firstname}/Photos`; + + function handleClick() { + handleClickLink( + { currentTarget: photosLinkRef.current }, + activeLink, + setActiveLink + ); + } + + return ( + + + + + Photos + + + + {photos.map((photo, index) => { + return ( + //we only render maximum 9 photos + index < NUMBER_OF_PHOTOS && ( + + + + + + ) + ); + })} + + + + ); +}; + +export default MiniPhotos; diff --git a/src/components/NestedRoute.jsx b/src/components/NestedRoute.jsx new file mode 100644 index 0000000..819c3fb --- /dev/null +++ b/src/components/NestedRoute.jsx @@ -0,0 +1,38 @@ +import React from "react"; +import { useParams } from "react-router-dom"; +import Photos from "./Photos"; +import Friends from "./Friends"; +import Posts from "./Posts"; + +const NestedRoute = (props) => { + const { itemId } = useParams(); + + const { userID, openFileInput, linkHandling } = props; + + if (itemId === "Photos") + return ( + + ); + if (itemId === "Friends") + return ( + + ); + else + return ( + + ); +}; + +export default NestedRoute; diff --git a/src/components/PasswordReminderModal.jsx b/src/components/PasswordReminderModal.jsx new file mode 100644 index 0000000..89193aa --- /dev/null +++ b/src/components/PasswordReminderModal.jsx @@ -0,0 +1,74 @@ +import React, { useState } from "react"; +import { Form, Button, Modal, Alert } from "react-bootstrap"; +import { useSelector, useDispatch } from "react-redux"; +import { sendPasswordReminder } from "../backend/backend"; +import { errorOccured } from "../features/user/userSlice"; + +const PasswordReminderModal = (props) => { + const { show, onHide, onExit } = props; + + const errorMsg = useSelector((state) => state.user.error); + const dispatch = useDispatch(); + + const [email, setEmail] = useState(""); + + function handleChange(e) { + e.preventDefault(); + const input = e.target; + setEmail(input.value); + } + + function handleClickSend() { + sendPasswordReminder(email) + .then(() => { + onHide(); + }) + .catch((error) => dispatch(errorOccured(error.message))); + } + + return ( + + + + Password Reset Email + + + + + {errorMsg !== "" && {errorMsg}} + + + Please enter the email address associated to your account to receive + a password reset email. + + + + + + +
+ + +
+
+ ); +}; + +export default PasswordReminderModal; diff --git a/src/components/PhotoViewer.jsx b/src/components/PhotoViewer.jsx new file mode 100644 index 0000000..3ca52f1 --- /dev/null +++ b/src/components/PhotoViewer.jsx @@ -0,0 +1,79 @@ +import React, { useState, useEffect } from "react"; +import StorageImage from "./StorageImage"; +import { Row, Col, Carousel } from "react-bootstrap"; +import { useHistory, useParams, useLocation } from "react-router-dom"; +import { useSelector } from "react-redux"; + +const PhotoViewer = () => { + const { userID, n } = useParams(); + + const users = useSelector((state) => state.users); + const photos = users.find((user) => user.userID === userID).photos; + + const [activeIndex, setActiveIndex] = useState(Number(n)); + + const history = useHistory(); + + const location = useLocation(); + + useEffect(() => { + const locArr = location.pathname.split("/"); + const index = Number(locArr.pop()); + setActiveIndex(index); + }, [location]); + + const handleSelect = (selectedIndex, e) => { + history.push(`/fakebook/photo/${userID}/${selectedIndex}`); + }; + + return ( + + + + {photos.map((photo, index) => { + return ( + + + + ); + })} + + + + + ); +}; + +export default PhotoViewer; diff --git a/src/components/Photos.jsx b/src/components/Photos.jsx new file mode 100644 index 0000000..b769a93 --- /dev/null +++ b/src/components/Photos.jsx @@ -0,0 +1,72 @@ +import React, { useEffect } from "react"; +import { Row, Col, Card, Button } from "react-bootstrap"; +import { Link, useRouteMatch } from "react-router-dom"; +import ResponsiveImage from "./ResponsiveImage"; +import { handleClickLink } from "./helper"; +import { useSelector } from "react-redux"; + +const Photos = (props) => { + const { url } = useRouteMatch(); + const { userID, openFileInput, linkHandling } = props; + const { linkRefs, linkState } = linkHandling; + const photosLinkRef = linkRefs.photos; + const [activeLink, setActiveLink] = linkState; + + const users = useSelector((state) => state.users); + const currentUserID = useSelector((state) => state.user.id); + + const isCurrentUser = userID === currentUserID; + const user = users.find((user) => user.userID === userID); + const photos = user.photos; + + useEffect(() => { + handleClickLink( + { currentTarget: photosLinkRef.current }, + activeLink, + setActiveLink + ); + }, [activeLink, photosLinkRef, setActiveLink]); + + return ( + + + + + Photos + + {isCurrentUser && ( + + )} + + + {photos.map((photo, index) => { + return ( + + + + + + ); + })} + + + + ); +}; + +export default Photos; diff --git a/src/components/PostModal.css b/src/components/PostModal.css new file mode 100644 index 0000000..a920ca0 --- /dev/null +++ b/src/components/PostModal.css @@ -0,0 +1,63 @@ +.scrolling-container { + width: 102.5%; + max-height: 250px; + overflow-y: scroll; +} + +.textarea { + outline: none; + border: none; + resize: none; + overflow-y: hidden; +} + +.img-container { + width: 100%; + border: 2px solid lightgray; + border-radius: 10px; + padding: 10px; + position: relative; +} + +.img-to-post { + border-radius: 10px; +} + +.close-btn-container { + display: flex; + justify-content: center; + align-items: center; + background: white; + width: 26px; + height: 26px; + border-radius: 50%; + position: absolute; + top: 20px; + right: 20px; +} + +.add-to-post { + border: 2px solid lightgray; + border-radius: 10px; + padding: 16px; + font-size: 14px; +} + +.comment-btn { + background-color: #e9ecef; +} + +.video-container { + width: 100%; + border: 2px solid lightgray; + border-radius: 10px; + padding: 10px; + position: relative; + padding-bottom: 56.25%; /* 16:9, for an aspect ratio of 1:1 change to this value to 100% */ +} + +.react-player { + position: absolute; + top: 0; + left: 0; +} diff --git a/src/components/PostModal.jsx b/src/components/PostModal.jsx new file mode 100644 index 0000000..f0d0272 --- /dev/null +++ b/src/components/PostModal.jsx @@ -0,0 +1,223 @@ +import React, { useState } from "react"; +import { Modal, Button, CloseButton } from "react-bootstrap"; +import StorageImage from "./StorageImage"; +import ProfileLink from "./ProfileLink"; +import UploadPhoto from "./UploadPhoto"; +import { HiOutlinePhotograph } from "react-icons/hi"; +import { AiFillYoutube } from "react-icons/ai"; +import "./PostModal.css"; +import { handleTextareaChange, addPhoto, delPhoto } from "./helper"; +import { useSelector } from "react-redux"; +import { upload } from "../backend/backend"; + +const PostModal = (props) => { + const { show, onClose, setText, isYoutubeBtnPressed, placeholder } = props; + + const user = useSelector((state) => state.currentUser); + const userID = useSelector((state) => state.user.id); + + const WELCOME_TEXT = `For adding YouTube video do the following: + 1. copy link of the video from the addresse bar of your browser + 2. press YouTube button again to upload the YouTube video to your post + 3. add your text for the post + 4. push the post button`; + const INIT_POST = { + userID: `${userID}`, + text: "", + isPhoto: false, + photoURL: "", + isYoutube: false, + youtubeURL: "", + likes: [], + }; + const [post, setPost] = useState(INIT_POST); + + function handleChange(e) { + const value = handleTextareaChange({ + e: e, + state: post, + setState: setPost, + }); + setPostBtnEnabled(value); + } + + function setPostBtnEnabled(value) { + if (value === "") setBtnEnabled(false); + else setBtnEnabled(true); + setText(value); + } + + const [isBtnEnabled, setBtnEnabled] = useState(false); + let variant, disabled; + if (isBtnEnabled) { + variant = "primary"; + disabled = false; + } else { + variant = "secondary"; + disabled = true; + } + + const [showUploadPhotoDlg, setShowUploadPhotoDlg] = useState(false); + + function addPhotoToPost(file) { + addPhoto({ + state: post, + setState: setPost, + file: file, + userID: userID, + }); + setBtnEnabled(true); + } + + function deletePhoto() { + delPhoto({ + state: post, + setState: setPost, + user: user, + userID: userID, + sideEffect: setPostBtnAsSideEffect, + }); + } + + function setPostBtnAsSideEffect() { + if (post.text === "" && !post.isYoutube) setBtnEnabled(false); + } + + function uploadPost() { + upload(post).then(() => { + setPost(INIT_POST); + setText(""); + onClose(); + }); + } + + function addYoutubeVideo() { + const url = post.text; + const URL_PATTERN = "https://www.youtube.com/watch?v="; + const MOBILE_URL_PATTERN = "https://m.youtube.com/watch?v="; + if (!url.startsWith(URL_PATTERN) && !url.startsWith(MOBILE_URL_PATTERN)) + return; + let patternLength; + if (url.startsWith(URL_PATTERN)) patternLength = URL_PATTERN.length; + else patternLength = MOBILE_URL_PATTERN.length; + const videoID = url.slice(patternLength); + const youtubeURL = `https://www.youtube.com/embed/${videoID}`; + const newPost = { ...post }; + newPost.isYoutube = true; + newPost.youtubeURL = youtubeURL; + newPost.text = ""; + setPost(newPost); + setText(""); + setBtnEnabled(true); + } + + function deleteYoutubeVideo() { + const newPost = { ...post }; + newPost.isYoutube = false; + newPost.youtubeURL = ""; + setPost(newPost); + if (post.text === "" && !post.isPhoto) setBtnEnabled(false); + } + + function getPlaceholder() { + if (isYoutubeBtnPressed && !post.isYoutube) return WELCOME_TEXT; + else return placeholder; + } + + function getRows() { + if (getPlaceholder() === WELCOME_TEXT && post.text === "") return 7; + else return 3; + } + + return ( + <> + + +
+ + Create Post + +
+
+ + +
+ + {post.isPhoto && ( +
+ +
+ +
+
+ )} + {post.isYoutube && ( +
+ +
+ +
+
+ )} +
+
+ Add to your post + + +
+ +
+
+ + + ); +}; + +export default PostModal; diff --git a/src/components/PostView.jsx b/src/components/PostView.jsx new file mode 100644 index 0000000..cb7bb28 --- /dev/null +++ b/src/components/PostView.jsx @@ -0,0 +1,30 @@ +import React from "react"; +import CreatePost from "./CreatePost"; +import DisplayPost from "./DisplayPost"; +import { useSelector } from "react-redux"; + +const PostView = () => { + const posts = useSelector((state) => state.posts); + + return ( + <> + + {posts.map((post, index) => { + return ( + + ); + })} + + ); +}; + +export default PostView; diff --git a/src/components/Posts.css b/src/components/Posts.css new file mode 100644 index 0000000..4cd9b5f --- /dev/null +++ b/src/components/Posts.css @@ -0,0 +1,9 @@ +.posts { + height: 1000px; +} + +@media (max-width: 600px) { + .posts { + height: auto; + } +} \ No newline at end of file diff --git a/src/components/Posts.jsx b/src/components/Posts.jsx new file mode 100644 index 0000000..e91e42f --- /dev/null +++ b/src/components/Posts.jsx @@ -0,0 +1,64 @@ +import React, { useEffect } from "react"; +import { Row, Col } from "react-bootstrap"; +import CreatePost from "./CreatePost"; +import MiniPhotos from "./MiniPhotos"; +import MiniFriends from "./MiniFriends"; +import DisplayUserPost from "./DisplayUserPost"; +import { handleClickLink } from "./helper"; +import { useSelector } from "react-redux"; +import "./Posts.css"; + +const Posts = (props) => { + const { userID, linkHandling } = props; + + const { linkRefs, linkState } = linkHandling; + const [activeLink, setActiveLink] = linkState; + const { posts: postsLinkRef } = linkRefs; + + const users = useSelector((state) => state.users); + const currentUserID = useSelector((state) => state.user.id); + + const isCurrentUser = userID === currentUserID; + + const user = users.find((user) => user.userID === userID); + + useEffect(() => { + handleClickLink( + { currentTarget: postsLinkRef.current }, + activeLink, + setActiveLink + ); + }, [activeLink, postsLinkRef, setActiveLink]); + + return ( + + + + + + + + {user.posts.map((postID, index) => { + return ( + + ); + })} + + + ); +}; + +export default Posts; diff --git a/src/components/Profile.css b/src/components/Profile.css new file mode 100644 index 0000000..1ed7957 --- /dev/null +++ b/src/components/Profile.css @@ -0,0 +1,68 @@ +.grad { + background-image: linear-gradient(rgb(48, 48, 48), white, white); +} + +.profile-col { + max-width: 960px; +} + +.background-pic-container { + position: relative; + height: 380px; + min-height: 250px; +} + +.background-pic { + display: block; + width: 100%; + height: 105%; + min-height: 250px; + max-height: 750px; + object-fit: cover; + margin: auto; + margin-top: 3.5%; + border-radius: 13px; + pointer-events: none; + z-index: -1; +} + +.background-pic-button { + position: absolute; + bottom: 15px; + right: 30px; +} + +.profile-pic-container { + border: 5px solid white; + border-radius: 95px; + position: absolute; + bottom: -12%; + left: 50%; + margin-left: -95px; +} + +.profile-pic-button { + border-radius: 22px; + height: 44px; + width: 44px; + position: absolute; + bottom: 8%; + left: 75%; +} + +/*centers posts in profile component in vertical mobile view*/ +.posts > div, +.profile-col { + padding-right: 0; +} + +/*removes caret from background-pic-button*/ +.background-pic-button::after { + content: none; +} + +@media (max-width: 640px) { + .background-pic-button span { + display: none; + } +} diff --git a/src/components/Profile.jsx b/src/components/Profile.jsx new file mode 100644 index 0000000..a862604 --- /dev/null +++ b/src/components/Profile.jsx @@ -0,0 +1,311 @@ +import React, { useState, useEffect, useRef } from "react"; +import { + Row, + Col, + DropdownButton, + Dropdown, + Button, + Nav, + Navbar, +} from "react-bootstrap"; +import { + Link, + Switch, + Route, + useRouteMatch, + useParams, +} from "react-router-dom"; +import { MdPhotoCamera } from "react-icons/md"; +import { IoTrashOutline } from "react-icons/io5"; +import { ImUpload2 } from "react-icons/im"; +import { HiOutlinePhotograph } from "react-icons/hi"; +import CircularImage from "./CircularImage"; +import NestedRoute from "./NestedRoute"; +import RemoveCoverPhotoDlg from "./RemoveCoverPhotoDlg"; +import SelectBgPhotoModal from "./SelectBgPhotoModal"; +import UpdateProfilePicModal from "./UpdateProfilePicModal"; +import UploadPhoto from "./UploadPhoto"; +import Posts from "./Posts"; +import StorageImage from "./StorageImage"; +import "./Profile.css"; +import { useDispatch, useSelector } from "react-redux"; +import { updateProfile } from "../backend/backend"; +import { linkUpdated } from "../features/link/linkSlice"; + +const Profile = (props) => { + const { userName } = useParams(); + + const userID = useSelector((state) => state.user.id); + const users = useSelector((state) => state.users); + const link = useSelector((state) => state.link); + + const user = () => { + const userNames = users.map((user) => { + if (!user.index || user.index === 0) + return `${user.lastname}.${user.firstname}`; + else return `${user.lastname}.${user.firstname}.${user.index}`; + }); + const index = userNames.indexOf(userName); + const user = users[index]; + return user; + }; + + const userId = () => user().userID; + + const isCurrentUser = userID === userId(); + + let { firstname, lastname, profilePictureURL, backgroundPictureURL, photos } = + user(); + + const [showRemoveCoverPhotoDlg, setShowRemoveCoverPhotoDlg] = useState(false); + + const [showSelectPhoto, setShowSelectPhoto] = useState(false); + + const [showUpdateProfilePic, setShowUpdateProfilePic] = useState(false); + + const [showUploadPhotoDlg, setShowUploadPhotoDlg] = useState(false); + + const [nameOfURL, setNameOfURL] = useState("backgroundPictureURL"); + + const [activeLink, setActiveLink] = useState(null); + + //we need the refs to handle the activeLink changes + const photosLinkRef = useRef(null); + const friendsLinkRef = useRef(null); + const postsLinkRef = useRef(null); + + const linkHandlingProps = { + linkRefs: { + photos: photosLinkRef, + friends: friendsLinkRef, + posts: postsLinkRef + }, + linkState: [activeLink, setActiveLink] + } + + const { url, path } = useRouteMatch(); + + function openFileInput(nameOfURL) { + setNameOfURL(nameOfURL); + setShowUploadPhotoDlg(true); + } + + function handleSelect(key) { + switch (key) { + case "3": + setShowRemoveCoverPhotoDlg(true); + break; + case "2": + openFileInput("backgroundPictureURL"); + break; + case "1": + setShowSelectPhoto(true); + break; + default: + return; + } + } + + function closeDlg() { + setShowRemoveCoverPhotoDlg(false); + } + + function removeCoverPhoto() { + closeDlg(); + return updateProfile({ backgroundPictureURL: "background-server.jpg" }); + } + + function hideBgPhotoModal() { + setShowSelectPhoto(false); + } + + function handleBgPhotoClick(event) { + hideBgPhotoModal(); + handlePhotoClick(event, "backgroundPictureURL"); + } + + function hideProfilePicModal() { + setShowUpdateProfilePic(false); + } + + function handleUploadProfilePicClick() { + hideProfilePicModal(); + openFileInput("profilePictureURL"); + } + + function handleProfilePicClick(event) { + hideProfilePicModal(); + handlePhotoClick(event, "profilePictureURL"); + } + + function updatePhotos(file) { + const newPhoto = { fileName: file.name }; + const filenames = photos.map((photo) => photo.fileName); + const newPhotos = [...photos]; + if (filenames.indexOf(file.name) === -1) { + newPhotos.push(newPhoto); + } + const newProfile = { photos: newPhotos }; + if (nameOfURL !== "") newProfile[nameOfURL] = `${userID}/${file.name}`; + return updateProfile(newProfile); + } + + function handlePhotoClick(e, name) { + const index = Number(e.target.id); + const photo = photos[index]; + const storagePath = `${userID}/${photo.fileName}`; + return updateProfile({ [name]: storagePath }); + } + + const dispatch = useDispatch(); + + useEffect(() => { + //we set the active link to the profile link when it renders + //unless we are on the friends page and the window is wide + //enough to see the profile on that page + if (link.active !== "friends" || window.innerWidth < 600) + dispatch(linkUpdated("profile")); + }, [dispatch, link]); + + return ( + <> + + +
+ + {isCurrentUser && ( + + + Edit Cover Photo + + } + size="sm"> + + + Select Photo + + + + Upload Photo + + + + Remove + + + )} +
+ + {isCurrentUser && ( + + )} +
+
+

+ + {firstname} {lastname} + +

+
+ + + + +
+ + + + + openFileInput("")} + //we only need the rest to handle the changes of the activeLink + linkHandling = {linkHandlingProps} + /> + + + + + + + + + + + + + + + + + ); +}; + +export default Profile; diff --git a/src/components/ProfileLink.jsx b/src/components/ProfileLink.jsx new file mode 100644 index 0000000..6c44ed7 --- /dev/null +++ b/src/components/ProfileLink.jsx @@ -0,0 +1,35 @@ +import React from "react"; +import CircularImage from "./CircularImage"; +import { Row, Col } from "react-bootstrap"; + +const ProfileLink = (props) => { + const { size, fullname, bold, user } = props; + + const { firstname, lastname, profilePictureURL, isOnline } = user; + + let name; + if (fullname === "true") name = `${firstname} ${lastname}`; + else name = `${firstname}`; + + return ( + + + + + + {bold === "true" ? {name} : name} + + + ); +}; + +export default ProfileLink; diff --git a/src/components/RecentLogins.css b/src/components/RecentLogins.css new file mode 100644 index 0000000..8d6eee1 --- /dev/null +++ b/src/components/RecentLogins.css @@ -0,0 +1,3 @@ +.recent-logins { + width: 500px; +} diff --git a/src/components/RecentLogins.jsx b/src/components/RecentLogins.jsx new file mode 100644 index 0000000..5f0824d --- /dev/null +++ b/src/components/RecentLogins.jsx @@ -0,0 +1,19 @@ +import React from "react"; +import "./RecentLogins.css"; + +const RecentLogins = () => { + return ( +
+

+ fakebook +

+

+

+ Fakebook helps you connect and share with the people in your life. +

+

+
+ ); +}; + +export default RecentLogins; diff --git a/src/components/RemoveCoverPhotoDlg.jsx b/src/components/RemoveCoverPhotoDlg.jsx new file mode 100644 index 0000000..f7d7590 --- /dev/null +++ b/src/components/RemoveCoverPhotoDlg.jsx @@ -0,0 +1,33 @@ +import React from "react"; +import { Modal, Button } from "react-bootstrap"; + +const RemoveCoverPhotoDlg = (props) => { + const { show, removeCoverPhoto, closeDlg } = props; + + return ( + + + + Remove Cover Photo + + + +
Do you really want to remove the cover photo?
+
+ + + + +
+ ); +}; + +export default RemoveCoverPhotoDlg; diff --git a/src/components/ResponsiveImage.jsx b/src/components/ResponsiveImage.jsx new file mode 100644 index 0000000..7541397 --- /dev/null +++ b/src/components/ResponsiveImage.jsx @@ -0,0 +1,50 @@ +import React from "react"; +import StorageImage from "./StorageImage"; + +const ResponsiveImage = (props) => { + const { + width, + height, + index, + userID, + photo, + onClick, + className, + useStoragePath, + } = props; + + let storagePath; + if (useStoragePath === "true") storagePath = photo; + else storagePath = `/${userID}/${photo.fileName}`; + + return ( +
+ +
+ ); +}; + +export default ResponsiveImage; diff --git a/src/components/SelectBgPhotoModal.jsx b/src/components/SelectBgPhotoModal.jsx new file mode 100644 index 0000000..1a6e1bb --- /dev/null +++ b/src/components/SelectBgPhotoModal.jsx @@ -0,0 +1,38 @@ +import React from "react"; +import { Modal } from "react-bootstrap"; +import StorageImage from "./StorageImage"; + +const SelectBgPhotoModal = (props) => { + const { show, onHide, onPhotoClick, userID, photos } = props; + + return ( + + + + Select Photo + + + + {photos.map((photo, index) => { + return ( + + ); + })} + + + ); +}; + +export default SelectBgPhotoModal; diff --git a/src/components/Signup.css b/src/components/Signup.css new file mode 100644 index 0000000..07dcc7f --- /dev/null +++ b/src/components/Signup.css @@ -0,0 +1,3 @@ +.text-legal { + font-size: small; +} diff --git a/src/components/SignupModal.jsx b/src/components/SignupModal.jsx new file mode 100644 index 0000000..dc3feb1 --- /dev/null +++ b/src/components/SignupModal.jsx @@ -0,0 +1,131 @@ +import React, { useEffect, useState } from "react"; +import Form from "react-bootstrap/Form"; +import Row from "react-bootstrap/Row"; +import Col from "react-bootstrap/Col"; +import Button from "react-bootstrap/Button"; +import Modal from "react-bootstrap/Modal"; +import "./Signup.css"; +import { createUserAccount } from "../backend/backend"; + +const SignupModal = (props) => { + const { show, onHide, onExit } = props; + + const [user, setUser] = useState({ + firstname: "", + lastname: "", + email: "", + password: "", + }); + + const handleChange = (e) => + setUser({ + ...user, + [e.target.name]: e.target.value, + }); + + const [validated, setValidated] = useState(false); + const [formIsValid, setFormIsValid] = useState(false); + + // Submit function (Create account) + const handleSubmit = (e) => { + e.preventDefault(); + const form = e.currentTarget; + if (form.checkValidity() === true) { + createUserAccount({ + firstname: user.firstname, + lastname: user.lastname, + email: user.email, + password: user.password, + }); + setFormIsValid(true); + } + setValidated(true); + }; + + useEffect(() => { + if (formIsValid) onHide(); + }, [formIsValid, onHide]); + + return ( + + + + Sign Up +
It's quick and easy.
+
+
+ +
+ + + + + First name required. + + + + + + Last name required. + + + + + + + + Email required in the right format. + + + + + + + + Password required. + + + + +

+ Signing Up for fakebook you agree to share the uploaded details + with any other user. Please do not upload any sensitive data to + the app, which is built strictly for demonstration purposes. +

+
+ + + +
+
+
+ ); +}; + +export default SignupModal; diff --git a/src/components/StorageImage.jsx b/src/components/StorageImage.jsx new file mode 100644 index 0000000..0e4d270 --- /dev/null +++ b/src/components/StorageImage.jsx @@ -0,0 +1,102 @@ +import React, { useState } from "react"; +import { getImageURL } from "../backend/backend"; +import { useSelector, useDispatch } from "react-redux"; +import placeholderImage from "../images/placeholder-image.jpg"; +import fakebookAvatar from "../images/fakebook-avatar.jpeg"; +import backgroundServer from "../images/background-server.jpg"; +import { imageAdded, imageUrlFound } from "../features/images/imagesSlice"; +import { useEffect } from "react"; + +const StorageImage = (props) => { + const { storagePath, alt, ...rest } = props; + + const PLACEHOLDER_AVATAR_STORAGE_PATH = "fakebook-avatar.jpeg"; + const PLACEHOLDER_BACKGROUND_STORAGE_PATH = "background-server.jpg"; + + //We use the images slice as a buffer. Fetching the actual url of the image + //in the storage takes relatively long time and uses Firebase. We render the same + //image in the app several times. Our goal to fetch the url only once for each image + //to save resources. + const images = useSelector((state) => state.images); + const dispatch = useDispatch(); + + const [url, setUrl] = useState(placeholderImage); + + function changeStoragePath(storagePath) { + const words = storagePath.split("."); + words[words.length - 2] += "_400x400"; + return words.join("."); + } + + useEffect(() => { + let shouldUpdate = true; + const cleanup = () => (shouldUpdate = false); + + //We filter out placeholder pictures + if (storagePath === PLACEHOLDER_AVATAR_STORAGE_PATH) { + setUrl(fakebookAvatar); + return cleanup; + } + if (storagePath === PLACEHOLDER_BACKGROUND_STORAGE_PATH) { + setUrl(backgroundServer); + return cleanup; + } + + //We look for the url in images slice first + let imageIndex = images + .map((image) => image.storagePath) + .indexOf(storagePath); + if (imageIndex === -1) { + imageIndex = images + .map((image) => image.storagePath) + .indexOf(changeStoragePath(storagePath)); + //If we are unable to find it anyway we add the image to the slice + if (imageIndex === -1) { + dispatch( + imageAdded({ + storagePath, + url, + }) + ); + } + //We add the url for the image to the images slice when we have actually got it + //We also update the local state to show the right image + getImageURL(storagePath) + .then((url) => { + setUrl(url); + dispatch( + imageUrlFound({ + storagePath, + url, + }) + ); + }) + .catch((_error) => { + getImageURL(changeStoragePath(storagePath)).then((url) => { + setUrl(url); + dispatch( + imageUrlFound({ + storagePath, + url, + }) + ); + }); + }); + } else { + //If we are able to find the url in the images slice we just use it instead of fetching + const newUrl = images[imageIndex].url; + //We only update the state if it contains different value and we should update because + //the component has not been unmounted by the time the promise resolves + if (newUrl !== url && shouldUpdate) setUrl(newUrl); + } + //We return a cleanup function which runs when the component unmounts. We set + //the shouldUpdate to false, so after this the state cannot be updated. If + //we don't do this React gives us error messages about state update on our + //unmounted component + return cleanup; + }, [images, storagePath, url, dispatch]); + + return {alt}; +}; + +export default StorageImage; diff --git a/src/components/StyledTextarea.jsx b/src/components/StyledTextarea.jsx new file mode 100644 index 0000000..a05ca25 --- /dev/null +++ b/src/components/StyledTextarea.jsx @@ -0,0 +1,66 @@ +import React, { useState, useEffect, useRef } from "react"; + +const StyledTextarea = (props) => { + const { onChange, onKeyPress, value, welcomeText, ...rest } = props; + + const TEXTAREA_STYLE_INIT = { + outline: "none", + border: "none", + resize: "none", + overflow: "hidden", + background: "#e9ecef", + padding: "0", + lineHeight: "0.8em", + }; + const styleInitRef = useRef(TEXTAREA_STYLE_INIT); + const [style, setStyle] = useState(TEXTAREA_STYLE_INIT); + const [textarea, setTextarea] = useState(null); //We save the textarea in the state, so the effect hook can use it + + //When content changes we first change the height to auto, + //which changes back the scrollHeight property of the textarea + //to a low value and the component rerenders + function restyleTextarea(textarea) { + const newStyle = { ...style }; + newStyle.height = "auto"; + setStyle(newStyle); + } + + //When the component has rerendered and the height is auto + //we set the height to the scrollHeight property of textarea + //This way when the height of the content decreses the textarea + //can follow it down too. Without this trick the textarea can + //grow but unable to shrink back + useEffect(() => { + if (style.height !== "auto") return; + if (!textarea) return; + const newStyle = { ...style }; + newStyle.height = textarea.scrollHeight + "px"; + setStyle(newStyle); + }, [style, textarea]); + + //This restyles the text area, when we send the message, so the + //value goes back to "" without executing the onChange handler + useEffect(() => { + if (value === "" && textarea) setStyle(styleInitRef.current); + }, [value, textarea, styleInitRef]); + + return ( + + ); +}; + +export default StyledTextarea; diff --git a/src/components/Titlebar.css b/src/components/Titlebar.css new file mode 100644 index 0000000..952edef --- /dev/null +++ b/src/components/Titlebar.css @@ -0,0 +1,53 @@ +.custom-drop-down-btn button { + height: 0.1em; + width: 1.7em; + border-radius: 1.7em; + border-color: #e9ecef !important; + color: black !important; + background: #e9ecef !important; + box-shadow: none; + font-size: 1.5em; + padding-bottom: 1.5em; +} + +.custom-drop-down-btn button:hover { + background: lightgray !important; +} + +.custom-drop-down-btn button:focus { + color: dodgerblue !important; + background-color: lightblue !important; + border-color: lightblue !important; +} + +.profile { + width: 100px; + height: 46px; + background: #e9ecef; + border-radius: 23px; + caret-color: transparent; +} + +.profile:hover { + background: lightgray; +} + +.nav-container { + max-width: 100em; + margin: auto; +} + +.titlebar { + position: fixed; + width: 100vw; + z-index: 1; + top: 0; + left: 0; +} + +@media (max-width: 640px) { + .spaceing, + .first { + display: none; + } +} diff --git a/src/components/Titlebar.jsx b/src/components/Titlebar.jsx new file mode 100644 index 0000000..e352485 --- /dev/null +++ b/src/components/Titlebar.jsx @@ -0,0 +1,137 @@ +import React, { useRef } from "react"; +import { Navbar, Nav, Dropdown, DropdownButton } from "react-bootstrap"; +import { Link } from "react-router-dom"; +import { VscHome } from "react-icons/vsc"; +import { FaFacebook } from "react-icons/fa"; +import { FaUserFriends } from "react-icons/fa"; +import { MdOndemandVideo } from "react-icons/md"; +import { ImExit } from "react-icons/im"; +import "./Titlebar.css"; +import ProfileLink from "./ProfileLink"; +import { signUserOut } from "../backend/backend"; +import { useSelector, useDispatch } from "react-redux"; +import { useEffect } from "react"; +import { handleClickLink } from "./helper"; +import { linkUpdated } from "../features/link/linkSlice"; +import { friendsListPageSet } from "../features/accountPage/accountPageSlice"; + + +const TitleBar = (props) => { + + const refs = { + home: useRef(null), + friends: useRef(null), + watch: useRef(null), + profile: useRef(null), + }; + + //Get the signed in user, active link and the profileLink + const user = useSelector((state) => state.currentUser); + const link = useSelector((state) => state.link); + const profileLink = useSelector((state) => state.accountPage.profileLink); + + const dispatch = useDispatch(); + + useEffect(() => { + handleClickLink( + { currentTarget: refs[link.active].current }, + refs[link.previous].current + ); + }, [link, refs]); + + // Log out function + const handleClick = () => { + signUserOut(); + }; + + function closeFriendsListPage() { + dispatch(friendsListPageSet(false)); + dispatch(linkUpdated("profile")); + } + + return ( +
+ + + + +
+ + + + +
+ ); +}; + +export default TitleBar; diff --git a/src/components/UpdateProfilePicModal.jsx b/src/components/UpdateProfilePicModal.jsx new file mode 100644 index 0000000..4b83f77 --- /dev/null +++ b/src/components/UpdateProfilePicModal.jsx @@ -0,0 +1,47 @@ +import React from "react"; +import { Modal, Button, Row } from "react-bootstrap"; +import ResponsiveImage from "./ResponsiveImage"; + +const UpdateProfilePicModal = (props) => { + const { show, onHide, onBtnClick, onPhotoClick, userID, photos } = props; + + return ( + + + + Update Profile Picture + + + + +
+ Suggested Photos + + {photos.map((photo, index) => { + return ( + + ); + })} + +
+
+ ); +}; + +export default UpdateProfilePicModal; diff --git a/src/components/UploadPhoto.jsx b/src/components/UploadPhoto.jsx new file mode 100644 index 0000000..a6e47e6 --- /dev/null +++ b/src/components/UploadPhoto.jsx @@ -0,0 +1,34 @@ +import React, { useRef, useEffect } from "react"; +import { addFileToStorage } from "../backend/backend"; + +const UploadPhoto = (props) => { + const { show, setShow, updateDatabase } = props; + + const fileInputRef = useRef(null); + + useEffect(() => { + if (!show) return; + fileInputRef.current.click(); + setShow(false); + }, [show, setShow]); + + function onChange(event) { + event.preventDefault(); + const file = event.target.files[0]; + addFileToStorage(file).then(() => { + return updateDatabase(file); + }); + } + + return ( + + ); +}; + +export default UploadPhoto; diff --git a/src/components/UserAccount.jsx b/src/components/UserAccount.jsx new file mode 100644 index 0000000..d31a805 --- /dev/null +++ b/src/components/UserAccount.jsx @@ -0,0 +1,121 @@ +import React, { useEffect } from "react"; +import TitleBar from "./Titlebar"; +import Profile from "./Profile"; +import PhotoViewer from "./PhotoViewer"; +import HomePage from "./HomePage"; +import FriendsListPage from "./FriendsListPage"; +import { BrowserRouter, Switch, Route } from "react-router-dom"; +import Container from "react-bootstrap/Container"; +import { useDispatch, useSelector } from "react-redux"; +import { + currentUserOffline, + currentUserOnline, + subscribeCurrentUser, + subscribeUsers, + subscribePosts, +} from "../backend/backend"; +import { + friendsListPageSet, + profileLinkSet, + watchSet, +} from "../features/accountPage/accountPageSlice"; + +const UserAccount = (props) => { + const profileLink = useSelector((state) => state.accountPage.profileLink); + + const currentUser = useSelector((state) => state.currentUser); + const users = useSelector((state) => state.users); + const isFriendsListPage = useSelector( + (state) => state.accountPage.isFriendsListPage + ); + + const dispatch = useDispatch(); + + useEffect(() => { + const unsubscribeCurrentUser = subscribeCurrentUser(); + const unsubscribeUsers = subscribeUsers(); + const unsubscribePosts = subscribePosts(); + //We make currentUser online + currentUserOnline(); + //We add event listener for the event when the user closes the browser window + const beforeunloadListener = (e) => { + //We put the user offline + currentUserOffline(); + }; + window.addEventListener("beforeunload", beforeunloadListener); + //we add event listener for the event when the browser window change visibility + const visibilitychangeListener = (e) => { + if (document.visibilityState === "visible") currentUserOnline(); + else currentUserOffline(); + }; + document.addEventListener("visibilitychange", visibilitychangeListener); + return () => { + unsubscribeCurrentUser(); + unsubscribeUsers(); + unsubscribePosts(); + }; + }, []); + + //We add the index of user to the profileLink if there are more users with the exact same userName + const addIndexToProfileLink = () => { + if (currentUser && currentUser.index && currentUser.index > 0) { + return `${profileLink}.${currentUser.index}`; + } else return profileLink; + }; + const newProfileLink = addIndexToProfileLink(); + useEffect(() => dispatch(profileLinkSet(newProfileLink)), [dispatch, newProfileLink]); + + if (users.length === 0 || !currentUser) { + return
...Loading
; + } + + return ( +
+ + + + + { + dispatch(friendsListPageSet(true)); + return ; + }} + /> + } + /> + { + dispatch(friendsListPageSet(false)); + dispatch(watchSet(true)); + return ; + }} + /> + { + if (isFriendsListPage) return ; + else { + return ; + } + }} + /> + { + dispatch(friendsListPageSet(false)); + dispatch(watchSet(false)); + return ; + }} + /> + + + +
+ ); +}; + +export default UserAccount; diff --git a/src/components/VideoView.jsx b/src/components/VideoView.jsx new file mode 100644 index 0000000..813e829 --- /dev/null +++ b/src/components/VideoView.jsx @@ -0,0 +1,24 @@ +import React from "react"; +import DisplayPost from "./DisplayPost"; +import { useSelector } from "react-redux"; + +const VideoView = () => { + const posts = useSelector((state) => state.posts); + + const videos = posts.filter((post) => post.isYoutube); + + return ( + <> + {videos.map((video, index) => ( + + ))} + + ); +}; + +export default VideoView; diff --git a/src/components/helper.js b/src/components/helper.js new file mode 100644 index 0000000..1b2532b --- /dev/null +++ b/src/components/helper.js @@ -0,0 +1,57 @@ +export function handleClickLink(e, linkState, setLinkState) { + const current = e.currentTarget; + const previous = linkState; + if (previous) { + if (previous.id === "profile") previous.style.backgroundColor = "#e9ecef"; + previous.style.borderBottom = "3px solid transparent"; + previous.style.color = ""; + } + if (current) { + if (setLinkState) setLinkState(current); + current.style.color = "dodgerblue"; + if (current.id === "profile") { + current.style.backgroundColor = "lightblue"; + return; + } + current.style.borderBottom = "3px solid dodgerblue"; + } +} + +export function handleTextareaChange(input) { + let value = input.e.target.value; + const newState = { ...input.state }; + newState.text = value; + input.setState(newState); + return value; +} + +export function addPhoto(input) { + const newState = { ...input.state }; + newState.isPhoto = true; + newState.photoURL = `${input.userID}/${input.file.name}`; + input.setState(newState); +} + +export function delPhoto(input) { + //We do not remove the photo from the storage, because in the case of multiple occurances, the removal + //of the photo causes error. If we want to take into account the storage efficiency, we have to store + //the number of occurences of each photo and only delete those from the storage, which only occure once. + //This would cause unnecessary extra logic in a demonstration app like this. + removePhotoFromPost(input.state, input.setState, input.sideEffect); +} + +function removePhotoFromPost(state, setState, sideEffect) { + const newState = { ...state }; + newState.isPhoto = false; + newState.photoURL = ""; + setState(newState); + if (sideEffect) sideEffect(); +} + +export function handleKeyPress(e, save) { + if (e.shiftKey) return; + const code = e.code; + if (code !== "Enter") return; + e.preventDefault(); + save(); +} diff --git a/src/features/accountPage/accountPageSlice.js b/src/features/accountPage/accountPageSlice.js new file mode 100644 index 0000000..22853dd --- /dev/null +++ b/src/features/accountPage/accountPageSlice.js @@ -0,0 +1,26 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const accountPageSlice = createSlice({ + name: "accountPage", + initialState: { + profileLink: "", + isWatch: false, + isFriendsListPage: false, + }, + reducers: { + profileLinkSet: (state, action) => { + state.profileLink = action.payload; + }, + friendsListPageSet: (state, action) => { + state.isFriendsListPage = action.payload; + }, + watchSet: (state, action) => { + state.isWatch = action.payload; + }, + }, +}); + +export const { profileLinkSet, friendsListPageSet, watchSet } = + accountPageSlice.actions; + +export default accountPageSlice.reducer; diff --git a/src/features/currentUser/currentUserSlice.js b/src/features/currentUser/currentUserSlice.js new file mode 100644 index 0000000..a05e3e3 --- /dev/null +++ b/src/features/currentUser/currentUserSlice.js @@ -0,0 +1,42 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const currentUserSlice = createSlice({ + name: "currentUser", + initialState: { + firstname: "", + lastname: "", + profilePictureURL: "fakebook-avatar.jpeg", + backgroundPictureURL: "background-server.jpg", + photos: [], + posts: [], + isOnline: false, + }, + reducers: { + currentUserUpdated: (state, action) => { + const { + firstname, + lastname, + profilePictureURL, + backgroundPictureURL, + photos, + posts, + isOnline, + index, + } = action.payload; + state.firstname = firstname; + state.lastname = lastname; + state.profilePictureURL = profilePictureURL; + state.backgroundPictureURL = backgroundPictureURL; + state.isOnline = isOnline; + if (index) state.index = index; + state.photos = []; + state.posts = []; + photos.forEach((photo) => state.photos.push(photo)); + posts.forEach((post) => state.posts.push(post)); + }, + }, +}); + +export const { currentUserUpdated } = currentUserSlice.actions; + +export default currentUserSlice.reducer; diff --git a/src/features/images/imagesSlice.js b/src/features/images/imagesSlice.js new file mode 100644 index 0000000..a505ae5 --- /dev/null +++ b/src/features/images/imagesSlice.js @@ -0,0 +1,24 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const imagesSlice = createSlice({ + name: "images", + initialState: [], + reducers: { + imageAdded: (state, action) => { + const index = state + .map((image) => image.storagePath) + .indexOf(action.payload.storagePath); + if (index === -1) state.push(action.payload); + }, + imageUrlFound: (state, action) => { + const index = state + .map((image) => image.storagePath) + .indexOf(action.payload.storagePath); + if (index > -1) state[index].url = action.payload.url; + }, + }, +}); + +export const { imageAdded, imageUrlFound } = imagesSlice.actions; + +export default imagesSlice.reducer; diff --git a/src/features/incomingMessages/incomingMessagesSlice.js b/src/features/incomingMessages/incomingMessagesSlice.js new file mode 100644 index 0000000..5cfdfda --- /dev/null +++ b/src/features/incomingMessages/incomingMessagesSlice.js @@ -0,0 +1,17 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const incomingMessagesSlice = createSlice({ + name: "incomingMessages", + initialState: [], + reducers: { + incomingMessagesUpdated: (state, action) => { + const updatedState = []; + action.payload.forEach((message) => updatedState.push(message)); + return updatedState; + }, + }, +}); + +export const { incomingMessagesUpdated } = incomingMessagesSlice.actions; + +export default incomingMessagesSlice.reducer; diff --git a/src/features/link/linkSlice.js b/src/features/link/linkSlice.js new file mode 100644 index 0000000..a17c02a --- /dev/null +++ b/src/features/link/linkSlice.js @@ -0,0 +1,19 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const linkSlice = createSlice({ + name: "link", + initialState: { + active: "home", + previous: "home" + }, + reducers: { + linkUpdated: (state, action) => { + state.previous = state.active; + state.active = action.payload; + }, + }, +}); + +export const { linkUpdated } = linkSlice.actions; + +export default linkSlice.reducer; diff --git a/src/features/outgoingMessages/outgoingMessagesSlice.js b/src/features/outgoingMessages/outgoingMessagesSlice.js new file mode 100644 index 0000000..8338ccb --- /dev/null +++ b/src/features/outgoingMessages/outgoingMessagesSlice.js @@ -0,0 +1,17 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const outgoingMessagesSlice = createSlice({ + name: "outgoingMessages", + initialState: [], + reducers: { + outgoingMessagesUpdated: (state, action) => { + const updatedState = []; + action.payload.forEach((message) => updatedState.push(message)); + return updatedState; + }, + }, +}); + +export const { outgoingMessagesUpdated } = outgoingMessagesSlice.actions; + +export default outgoingMessagesSlice.reducer; diff --git a/src/features/posts/postsSlice.js b/src/features/posts/postsSlice.js new file mode 100644 index 0000000..26dd972 --- /dev/null +++ b/src/features/posts/postsSlice.js @@ -0,0 +1,17 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const postsSlice = createSlice({ + name: "posts", + initialState: [], + reducers: { + postsUpdated: (state, action) => { + const updatedState = []; + action.payload.forEach((post) => updatedState.push(post)); + return updatedState; + }, + }, +}); + +export const { postsUpdated } = postsSlice.actions; + +export default postsSlice.reducer; diff --git a/src/features/user/userSlice.js b/src/features/user/userSlice.js new file mode 100644 index 0000000..2843d01 --- /dev/null +++ b/src/features/user/userSlice.js @@ -0,0 +1,46 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const userSlice = createSlice({ + name: "user", + initialState: { + id: "", + isSignedIn: false, + isEmailVerified: false, + error: "", + isLoading: true, + }, + reducers: { + signIn: (state, action) => { + // Redux Toolkit allows us to write "mutating" logic in reducers. It + // doesn't actually mutate the state because it uses the immer library, + // which detects changes to a "draft state" and produces a brand new + // immutable state based off those changes + state.id = action.payload.id; + state.displayName = action.payload.displayName; + state.isEmailVerified = action.payload.isEmailVerified; + state.isSignedIn = true; + }, + signOut: (state) => { + state.isSignedIn = false; + }, + errorOccured: (state, action) => { + state.error = action.payload; + }, + loadingStarted: (state) => { + state.isLoading = true; + }, + loadingFinished: (state) => { + state.isLoading = false; + }, + }, +}); + +export const { + signIn, + signOut, + errorOccured, + loadingStarted, + loadingFinished, +} = userSlice.actions; + +export default userSlice.reducer; diff --git a/src/features/users/usersSlice.js b/src/features/users/usersSlice.js new file mode 100644 index 0000000..9ebc55e --- /dev/null +++ b/src/features/users/usersSlice.js @@ -0,0 +1,17 @@ +import { createSlice } from "@reduxjs/toolkit"; + +export const usersSlice = createSlice({ + name: "users", + initialState: [], + reducers: { + usersUpdated: (state, action) => { + const updatedState = []; + action.payload.forEach((user) => updatedState.push(user)); + return updatedState; + }, + }, +}); + +export const { usersUpdated } = usersSlice.actions; + +export default usersSlice.reducer; diff --git a/src/firebaseConfig.js b/src/firebaseConfig.js new file mode 100644 index 0000000..a62c863 --- /dev/null +++ b/src/firebaseConfig.js @@ -0,0 +1,11 @@ +const firebaseConfig = { + apiKey: "AIzaSyA6giH2VCl9pBrO86uGH3gcwbmeM-dYMPM", + authDomain: "fakebook-2df7b.firebaseapp.com", + projectId: "fakebook-2df7b", + storageBucket: "fakebook-2df7b.appspot.com", + messagingSenderId: "1030600439600", + appId: "1:1030600439600:web:98617c1d503260115cfaf5", + measurementId: "G-YN35E2SN2E", +}; + +export default firebaseConfig; diff --git a/src/images/background-server.jpg b/src/images/background-server.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9acb8096f924d355123983cf4e90eb71405044bb GIT binary patch literal 128824 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

#^4@JNggsSK=ih`X3-J<>^|6 zNU?q^Hoi0JuN(hg_MJ=qrmc%ObDC~7nYAaT*V>akLx+cZO_qyuPaZSO>S1hevn@^? z1-pjsmgFmRNQL@h!PlCuwu1KZ;<>uA+Yo4GQ!gKVmZ-_qu6S)PurOG$M$P(7e>Y>+ zv+v3;8N_C@}bQ4KceWEyXZ_NL%8bEB>5SShH1D>cuf*@U+A~fU{;D4u+@8 zGX+_Dx%`-L)R9*QZrZtmoqfWm%4Shb`;YNc6LyDlr1AXNayeqMJp!vR>&3R1&ux~aPVt^t%)^$8Vf!C8?|;yrWD zg9wi9n<~$eU6C5qbG6!uW;I|COJaJnt=2~L)!Rj*Dwe%=PJqQqMPJvlsSmb~yNJvt z#)=+`aTZEru(L?G{3{mv+%k4ndwt&Wr)x2=0_<|F)qhV-?JCCan<^3E{VHu+Y>iHf z)*FGUnUMjduW7_EZGi`G(Ct# zL0QnI=S#X_^wRDuDBZwq!`RAGplT58fVcre__A16r+^!_C>(%!qQ+@-1O`i->WK%; zz+32P!;Z{}nkF88Ei5F`5I9z!Yz@wq|L$Q$rDtWGFplW|rFh#YktLwkcRISeGJADIPHE*R;b5@(?;TY%0g#NXP?}?ks zfwyr;|4#-nNbC96Y(%eOiA3@<&uXrQY*l#|N6l?6{hK&ViwSnK!a;J`OSnU2(}q`c z)v`{NU<_sF;UGI4_5_=K{aMVj6|dyhDPiVF{co*^ZP3Xdt-E z0n{RUKJRQ*IX)YTZ2Eol~9P#bj@C&8rGJSwMiENy(emG0?M? zOd*kWB}hQ6m;2I;k!P;?wFMYh1u86e5uqr9|8Um;GP}w-fqk25+Nl}1uKt$DYDT3rX}kOzGsDcG`LjnK?J)5Lz2p@bGFm-QgBqfrp{|xZ9d!@o~+*T`)bdP zGVJ=Ov~x<8ldS35;eXHQYZo3)|ET;2s91OBm7n*36x^b4^YnS!#k~(7d*7Z;0ru`p zQqO7cZ`hD$m>7-3_siT*5p8;;&n@9*J-R?BII3R! z?5}xI=<9ju9|DOd?1StEIC9dy`NfaA`XWR=LPz4YD;6|u*j&s0vx5rZsO96RO@mE! zlTK%5Of4*(8Fpz}{l^aOOi%-iJ)Gy&wt^9Ys2MS_(VyU#&3by#neaqiRpkfHBgn^L z0c*hxwHCr{H{8(z`s06#f99`}*|5DxDA5OJ>B0C95I`r<@VrDx0mnmM@U8z%sps$Z z$^`SOrh~N(oY$>8i=jcIRktKiZ>EUL@5c|dmS2!_)+ZYJFPDgyS1z4brq)Haqo3po z+CFgK=w$b{!t9fj#1~n(%P5T2jxE|bqHP{YEfU2z1vTD3)VPk4cLL1m{{fzL9x1fw z%hC@xlJI^8V2W(#^pXg;;c^R3D05$@fl#(xCo6AlBBS6q-5w;RKRD7w95_B_`~&b6Xwwek zweiChNR$ah3EG*PYXA!`CCm(34m#P$nr*I_&kX(!O=C4I|0HmK9B_-1i{IcNc~4O4 zoItoo&?B`TReDbp37y#g@sPUtc4Yu-5y5RrdZr)pGDjp0}!s-5}>>c3NB-&Z@0zVShDVp8(g`sB2dGzD7;}pU^Tmc*o`8UXXkyUu}MRX#&D{nx# zwHINqXwUoLYna7O{MxffRs66B3zP`e4QIaR2VwjbSG%SMie3w$X_d)S0r|-l?#`HZ z)>G)K>`B#Gm*&U1#=NYAU#)>uef#oedId`rRkd0mSQzbYV(LbOqWtui+BD(v+}1Fs znu6VJH=^Ema`{fgmZ@;o9#+(q(07j!t=bbts}7;ku`hY|CT{KCIDZxY;)pDG5h`&fZ@x=^ zuRj!Iv40<4YrW(8QX*V@qzm=cZbvL*SAdx3VL@A}SU+;%C=K+=M2D7W=C`uDZ!yIO zi5nJ4bnjaZ#`qqd=4}3>jz?tXM%n&+=N1Ule@|Cgx$M*Df3y0b%7>^wy4iStmikwo#gm9R9R(l8omyD+j#(>)}wk(E*Bi2~D`3iw+BvE#qpBgmPzWdk?vEW94*7C$jGw$igfVd|97i}X5SeJFyZN0>yMtKC8m$}$ z>$SkvU&UX=Lgcqk4hP;%A>mJjAj$C9kFdc%DhH=M==0hC0IPU(ex|1OPX|w?D}OKa zmNK@isA$tTo_U_r(f9@rQZVd;h7EKFkWuaaJFccX(0}kO+iPB$A}m+qT1}FvZd0bI z%Napb_m@zlO*H2doqgm%%qSvq^XVD!Sq;`}GS9GVXaoEYZ=zkH$EK#){a2iCOb`=0 z%9btC_PVw%T#@2AHtQ9ike)XNs5@c1$eA8YrdL9FUOu+xAF05Pp8POVk45z z-~l-N8HmZ<^CJ&ZM%Rs?10zDxnt#dS-)u%~@e`|?H-)Bj##_mT*WgsbATW-6&HNT$gJ!+3;Z6`|<*# zIu5Zj)EQ)i+S15PL4HG-K@HX7q>B8{Yy&7^GH>vcxp4=7iRKFhV?HPu9NG7IlSLri z_JFlCTpiqfmu@l^B|DVkr_RiC7|ab|GHX7|XIH698lo;iuTYC8NNnb4*(d{;kVMhi zReYltu|fhyS&*8N-4k6!$N2;u;2cjF(tM|a&RHM7&x{zI*xnJWbn>j;fiW^VF9aam zX?7kbKWOWR$XP)T1Zi0Q^IQ~-XQeS{*ktYdgw$Pb~r{zmx`42 zm(GSXfD@amyePl^kL~JIHjY|o%d!l*h%zlLb`86)$-Cszfnd3BTGuPKN7|nikf6xM z!&lAnUv+g`+L=ccNCh zsc!gxB(EbbtT)tOh49#UDU75IZ{l4_Oy-)#gzwG4SL`7&tC7BGP6}lIj(VT4mr7_GAPCKWppXNsqrTxRQ!)%Qi=p~{3_>x8z*T{;RgI&GrO2TOM z(~gC+wOx`B%FWD`smKux7aEy^VKhra88H2XE#TOT$I8GrD0vu66>#9v*jt{HzHIBZ zym~yhxoW~`c8qRQAckg<1$D|)OC1a{{AS?E&d9ftE%!-sVIOo zZ9w!Z^{p}F)s+3a*oyCn3lg-~u*Q#Ws3^5RnyJFg>?rNgZqtP!&Cmb_2%kkmhK>>8 z;w%knmcT5n*A9e2Q?G0$_PbVAwT?8=hxebz?DU3<#;l76-A_vNl~*F>TmJq7l+2%w zSN?n-klhwtHvJ!nap?`#c*0IN3bTeYPgv!f6uH%nI~m3M(!!@j{Tkg)HB-Il2LK_e z`PtQ_g^pPQP9++xTz<7P}|-nOygysqubc@qLxIt0-n$n&W!sQ=O?O(2eFFx(UaiQ;O1naMA8@+ z@$mV|tcSs18$`#fk(n_Ys)qxI1NJm*9^N-aYM>#q_lWTD%*Y|SuMgo2q>}Hc;NeRB zj**!&!Y=NFZc(H%hj)d>rY5|vyh6=N(M^SAXkWt|rnMs|(*ga@!6LK$oaR1xfMg~! zdD{iIlAqCbRGVe9f`n`9J%j3r111IxL4z!3G0Z6uCPN4>RX#5 zzHWPO$b~pw+t=&nYrk4Q2X|08$QgDN&!82&c?8a}^^>XITFd1>QBqvvsJ5?ESkY+Z z*{`0vO!qO@gxSdJYz7JhTO7aTk~o!c+1LPQeDbBJo<@K&s_5=<=AY#z@2g${bCs5@ zX4;{Cb3FCd=70E6mshvA>1#Tro*r;;$i>`Dsog$NNvsiC&CP}t#Xk<8EDZ3E?AzS3 zS+jF)WOuyTv?xIUvk_(;eEEvc4`02W$z_z{dX8<rZYg78M#t{ZnO?4}WG zh-1pJb0^ZaZjG|a$44J`q^qB4X~?+nHGa=_Mm?WDkWi)cg?4(*coH5=CKT}m+Y^Rv zaOd<&uXb#D@`i^Cn6fp}(Ryt6b}!d9@6%RSRZ{bSI8nA>KOI_NkHJqqsBp@=f~bcp zn-gA4T&YK061xeriz2?8sBoI)iXm|_Qn;UW96TaYZKDZUDvv$qQV{TgZJ>yzGdl`$MB8+Pm$VqmIKq@G+n3Jes z*<*^miFccPYhXro=Us_!G}mNc*7?;WR`v2w%_ma*AAnbDzM@|k^qSuwzXlBfMJ$)7 zb^c|LzuGBZX6_mWwym=o^$H|qdHn-aukFU!u)~X-PyB5Wq6pH8CQxLMZZB^G~I{>!L1`9$Ag_SeWn z={q{{#{2=|raUJcvUkP6wCZ1c^3z0&P30R_jujA2(O}%)fl1~&%9!VxvV)!@aGZn3 zKkV8>ZzG{vh1FM-25qC(YQ~3CsR^zO^<$m5OxxoW2{N>NbLg*;&Q{T&G=1jUXFXs> zw_t#RCu#w_)i$r5uPHh7h1G=(6Xt+Zszo@mehuFim#d$vD}Er+f5uCRpMLIq?>o{5 zr_T`L99Q{Vsz+;$W=E@SXJ1W%QM!!nXkNspQAV>9t^dHW0L^f?YB7p$Kb~|gK*Ez)#i8>zeny*4g_mY?CPe5d5-ML1}?CO zfubXtG}=g;tgTFVG~85Vx#%0wb8GI2wujvG7}@TJN}U!WL`5~)Idyx_4!#ntRa{5N z_n)$$B&O{FoqDE(1e|_;t^hvb8B(eU$){ix!$V(TP<$?NmMiY<7>ZiuQhCawLCE0Y z$XkVEkXL2c)&37}*Gt-QOnj1GtVLqHOo@vLLbD=STltDA>Gi{15v@iw%$}=X)TE!; zaD(&*>mVIGu~My79rc11^+P(00qkcc3f+~pX55b))t>(Vc8NXX9qinE!WRUGC~--g zh!q+V58>hB)UOZP#MWdSg-R@m+&t3`)U&N z1TEJMDB%_tF#0lUUq98Um3gnElsAj9iaA)#UEb8LiO19L=Opa5!#8H9wsraAEn>L7 zYpa_`+t99C`@$+FYRv$92wGX@%gseBNH0V$LoZO>6kP7mpa6tn5#IJDixMAOA18CU z*3^ba%eT_e)AE9MYs?ijI9zY#32XNth3MT<_^s6>Wd>owMCCSf27SrGw93H%^$H63 zkWguZgXfDZ&S6B?4uorh_>S={;u<;mNXbtY;W+6{cpyMohXV>ZFbAS54?*ej)L?{t z6*rI9)>iRiiHX$@*5-Xwhn7Sr&fb++tM3Hzst3NF@|dNPRW&f6o7nk}%7$oEWo>_| z$$uXUSGub)Ss0CCXjck!2;*@1PS~on42PqJZ`lHOiX)(5O1zQ*&PKKfdCl{$>6gtB zo!XcjUdXR3*?$^QKN@*R<^WrQot#4NgeJp`?aIs-Lhnjpp_&Y72{9L9Iu%Wnaxn2`1 z4@jjPL-F@+?04tPQVC~=mIl|AXLf8*gs$63GU5&qC;LA6R%$vNPR|8yB|(UBP4Gk%O~Uo^b}WW&L{4KNF}uU+c#BF9Aa?N!T8qB3*j z12N(=>YN#bpTVz!x>0`v@H4RDl#BnGwZ|dAdhzzyF9JR`)4EGHs<-R3yUuGJ@QE&e zuB}_7{+C&cdpR^6=!9Q}<7^;)0lUrDRNxtv;#chDFV(2vzT~XOUOpW|d^&)&6C2wI z5jw+@NOS?L7O2WTa4!eMWAC6AT~)Yx)vLp#x7kOFV&0=t5>jknA~V*&AGZ6N1E<%i zb=)pq0kM6HNz9+^+}SdkH0Pvg+|pawM7mH8x1r_H*8Fb`Dwx1p+AA|`4YF<|~5 z1w!B2C>43=6EPWcjO%3D!+J8w&#t%g>Ji)|t4^We1a>yp0y8;Oq9}uR#ry!A83^Ti z!1sRul?jTmX&HGB<561Cf|Zwi|Lo+a2Sb~z?EtwyzR8ITeNx)*^SPDn_DS6FoeN`+ zlW7}H5-euNt{vEjKRC}0h$HQHe2F=G+Z(-r<3k}t>>?dpxb|{CJ8`t+HENpDC)FbO z_~zZ%3Bd;XxwzR;MzyYaM1dsEIg*A^Y!fG=(C&io>D*>!=rx(JY^vi(>|!%>{5YNm z*$`{Zq394IbT+AWaGbtY*)j}7rW^^hAfjhs2ND)Z<;E6MnD;{B97b7a^o`O<3D^UU zq!I+8kMCP}suHuNd?*5UV5c4db00DrcZL*fR-*XDcS;qJLkfGb%bRyKq> z!s+*8-U37MlLym}@-=)ipL9+%9!0`^)HzPV@ApV$pqqKVaL@L<+26WWvnkDd=}RYy zx?eq;9MMttLTor%hwBY%MO4_CJax?C)GE~-s()kH0NOVu@7c8JRz{3~kECNGyhgcVf|4pmdtKQNZAFZd})+rm>oF-{)92 z+|IzOp41}lmY>Q8+re66a`>FHtT?_i?etL~<%98gy1KmWs@E}8b10{Z5jFkX#+GkQ zUJyvDS4JhD`REPojy@*F8EM_B|9LFR7p&kOnn*Tg!>Q(=>pSU|Zc+vyx?lcRf;bVi7aWf*$d0nm?DM?>{)rLVi-LeR-J}^U00;nOlDF=EcR& zCI}Os$1oqpS$dM6E3+5%xwvSMCD=}~-EQU|AiMpJ${V|k47)8}P+f=}BV%4D(Whsg z)(#mE0+a5~q_R>gTyK@N`48aum)tc36*+6ZhXl5SqS%)*%M?O{JizR0 zTsJggCS+<(WomA_p6mVUwp-Rqd9Z2O6g(rniK0cT%Un^T6g_d! znaa7<2epT3@WYrkN>uvRG>TU80?bJ`=(H<-=c=i~4YELVLHz#!%Rn^0A}MAS`8HJH zomgSM8>&qh)b1@c+OL=!mpgo(XWD$jW$>#RvOT8bjAxEa!!M9T-$|oNY)Z`4Ix%pA z3Ft8c5jQq5n7(59pZ=lB#Vn^NV>_|#JgzsdF`ki(a~+hEfigbdqaK6xt&9sCEM_d_ zuqWFvV-~Kv7L(w zjqC>#f;#6>PF4Ebjsf!hx;#s8BRv%In-CAE}+LAw1Zl#2x{XkJt zJK~)sI*m4KaJKGcUk|mJGFT8MJ94qV)UoU~fH~YocM&U6z+z}=*-q|e*{G+hNnT?q z0GI{Rj7Obfq$7I|KJnElJFBDBe>y&_Q8S=`&0S5q8ptu-4hH3r+M(pf

EV9x0!iC3hVF^C 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 F|JgovN-zKb literal 0 HcmV?d00001 diff --git a/src/images/fakebook-avatar.jpeg b/src/images/fakebook-avatar.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2564daf38d194a8baf23625a819f879867c6ae81 GIT binary patch literal 12162 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 literal 0 HcmV?d00001 diff --git a/src/images/friends.jpg b/src/images/friends.jpg new file mode 100644 index 0000000000000000000000000000000000000000..418965e61b616e49d2ceeedf04397e7d0e7433b1 GIT binary patch literal 13542 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 Q1+N+K`{4OC_5M!%FOpl}X8-^I literal 0 HcmV?d00001 diff --git a/src/images/placeholder-image.jpg b/src/images/placeholder-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af8b1e74f360cec8088d8085ecce498930be2a0b GIT binary patch literal 14618 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 d$9JU literal 0 HcmV?d00001 diff --git a/src/index.css b/src/index.css index 6119ad9..ff336dd 100644 --- a/src/index.css +++ b/src/index.css @@ -1,68 +1,19 @@ :root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; + font-size: 16px; } body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", + "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow-x: hidden; + background-color: #e9ecef; } -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", + monospace; } diff --git a/src/main.jsx b/src/main.jsx index 26b0467..77642f8 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,5 +1,12 @@ import { render } from 'preact' import './index.css' -import { App } from './app.jsx' +import App from './app.jsx' +import store from './app/store' +import { Provider } from 'react-redux' -render(, document.getElementById('app')) +render( + + + , + document.getElementById("app") +);