├── .gitignore ├── README.md ├── components ├── AuthCheck.js ├── HeartButton.js ├── ImageUploader.js ├── Loader.js ├── Metatags.js ├── Navbar.js ├── PostContent.js ├── PostFeed.js └── UserProfile.js ├── firestore.rules ├── jsconfig.json ├── lib ├── context.js ├── firebase.js └── hooks.js ├── next.config.js ├── package-lock.json ├── package.json ├── pages ├── 404.js ├── [username] │ ├── [slug].js │ └── index.js ├── _app.js ├── admin │ ├── [slug].js │ └── index.js ├── api │ └── [username].js ├── enter.js └── index.js ├── public ├── favicon.ico ├── google.png ├── hacker.png └── vercel.svg └── styles ├── Admin.module.css ├── Post.module.css └── globals.css /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Next.js + Firebase - The Full Course 2 | 3 | - [Live Demo](https://next.fireship.io/) 4 | - [Enroll in the Course](https://fireship.io/courses/react-next-firebase/) 5 | 6 | Become an expert at React, Next.js, and Firebase by building a social blogging community from scratch. 7 | 8 | Build a complex webapp inspired by sites Dev.to and Medium, featuring... 9 | 10 | - 👨‍🎤 Custom Firebase usernames 11 | - 📰 Bot-friendly content (SEO) 12 | - 🦾 Advanced SSR, SSG, and ISR techniques 13 | - 🔥 Firestore CRUD and data modeling 14 | - ⚛️ Reactive forms with react-hook-form 15 | - 📂 Image file uploads 16 | - 💞 Realtime hearts 17 | - 🚀 Security & Deployment 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /components/AuthCheck.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import { useContext } from 'react'; 3 | import { UserContext } from '@lib/context'; 4 | 5 | // Component's children only shown to logged-in users 6 | export default function AuthCheck(props) { 7 | const { username } = useContext(UserContext); 8 | 9 | return username ? props.children : props.fallback || You must be signed in; 10 | } 11 | -------------------------------------------------------------------------------- /components/HeartButton.js: -------------------------------------------------------------------------------- 1 | import { firestore, auth, increment } from '@lib/firebase'; 2 | import { useDocument } from 'react-firebase-hooks/firestore'; 3 | 4 | // Allows user to heart or like a post 5 | export default function Heart({ postRef }) { 6 | // Listen to heart document for currently logged in user 7 | const heartRef = postRef.collection('hearts').doc(auth.currentUser.uid); 8 | const [heartDoc] = useDocument(heartRef); 9 | 10 | // Create a user-to-post relationship 11 | const addHeart = async () => { 12 | const uid = auth.currentUser.uid; 13 | const batch = firestore.batch(); 14 | 15 | batch.update(postRef, { heartCount: increment(1) }); 16 | batch.set(heartRef, { uid }); 17 | 18 | await batch.commit(); 19 | }; 20 | 21 | // Remove a user-to-post relationship 22 | const removeHeart = async () => { 23 | const batch = firestore.batch(); 24 | 25 | batch.update(postRef, { heartCount: increment(-1) }); 26 | batch.delete(heartRef); 27 | 28 | await batch.commit(); 29 | }; 30 | 31 | return heartDoc?.exists ? ( 32 | 33 | ) : ( 34 | 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /components/ImageUploader.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { auth, storage, STATE_CHANGED } from '@lib/firebase'; 3 | import Loader from './Loader'; 4 | 5 | // Uploads images to Firebase Storage 6 | export default function ImageUploader() { 7 | const [uploading, setUploading] = useState(false); 8 | const [progress, setProgress] = useState(0); 9 | const [downloadURL, setDownloadURL] = useState(null); 10 | 11 | // Creates a Firebase Upload Task 12 | const uploadFile = async (e) => { 13 | // Get the file 14 | const file = Array.from(e.target.files)[0]; 15 | const extension = file.type.split('/')[1]; 16 | 17 | // Makes reference to the storage bucket location 18 | const ref = storage.ref(`uploads/${auth.currentUser.uid}/${Date.now()}.${extension}`); 19 | setUploading(true); 20 | 21 | // Starts the upload 22 | const task = ref.put(file); 23 | 24 | // Listen to updates to upload task 25 | task.on(STATE_CHANGED, (snapshot) => { 26 | const pct = ((snapshot.bytesTransferred / snapshot.totalBytes) * 100).toFixed(0); 27 | setProgress(pct); 28 | }); 29 | 30 | // Get downloadURL AFTER task resolves (Note: this is not a native Promise) 31 | task 32 | .then((d) => ref.getDownloadURL()) 33 | .then((url) => { 34 | setDownloadURL(url); 35 | setUploading(false); 36 | }); 37 | }; 38 | 39 | return ( 40 |
41 | 42 | {uploading &&

{progress}%

} 43 | 44 | {!uploading && ( 45 | <> 46 | 50 | 51 | )} 52 | 53 | {downloadURL && {`![alt](${downloadURL})`}} 54 |
55 | ); 56 | } 57 | -------------------------------------------------------------------------------- /components/Loader.js: -------------------------------------------------------------------------------- 1 | // Loading Spinner 2 | export default function Loader({ show }) { 3 | return show ?
: null; 4 | } 5 | -------------------------------------------------------------------------------- /components/Metatags.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | 3 | export default function Metatags({ 4 | title = 'The Full Next.js + Firebase Course', 5 | description = 'A complete Next.js + Firebase course by Fireship.io', 6 | image = 'https://fireship.io/courses/react-next-firebase/img/featured.png', 7 | }) { 8 | return ( 9 | 10 | {title} 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /components/Navbar.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import { useRouter } from 'next/router'; 3 | import { useContext } from 'react'; 4 | import { UserContext } from '@lib/context'; 5 | import { auth } from '@lib/firebase'; 6 | 7 | // Top navbar 8 | export default function Navbar() { 9 | const { user, username } = useContext(UserContext); 10 | 11 | const router = useRouter(); 12 | 13 | const signOut = () => { 14 | auth.signOut(); 15 | router.reload(); 16 | } 17 | 18 | return ( 19 | 56 | ); 57 | } 58 | -------------------------------------------------------------------------------- /components/PostContent.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | import ReactMarkdown from 'react-markdown'; 3 | 4 | // UI component for main post content 5 | export default function PostContent({ post }) { 6 | const createdAt = typeof post?.createdAt === 'number' ? new Date(post.createdAt) : post.createdAt.toDate(); 7 | 8 | return ( 9 |
10 |

{post?.title}

11 | 12 | Written by{' '} 13 | 14 | @{post.username} 15 | {' '} 16 | on {createdAt.toISOString()} 17 | 18 | {post?.content} 19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /components/PostFeed.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | export default function PostFeed({ posts, admin }) { 4 | return posts ? posts.map((post) => ) : null; 5 | } 6 | 7 | function PostItem({ post, admin = false }) { 8 | // Naive method to calc word count and read time 9 | const wordCount = post?.content.trim().split(/\s+/g).length; 10 | const minutesToRead = (wordCount / 100 + 1).toFixed(0); 11 | 12 | return ( 13 |
14 | 15 | 16 | By @{post.username} 17 | 18 | 19 | 20 | 21 |

22 | {post.title} 23 |

24 | 25 | 26 |
27 | 28 | {wordCount} words. {minutesToRead} min read 29 | 30 | 💗 {post.heartCount || 0} Hearts 31 |
32 | 33 | {/* If admin view, show extra controls for user */} 34 | {admin && ( 35 | <> 36 | 37 |

38 | 39 |

40 | 41 | 42 | {post.published ?

Live

:

Unpublished

} 43 | 44 | )} 45 |
46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /components/UserProfile.js: -------------------------------------------------------------------------------- 1 | // UI component for user profile 2 | export default function UserProfile({ user }) { 3 | return ( 4 |
5 | 6 |

7 | @{user.username} 8 |

9 |

{user.displayName || 'Anonymous User'}

10 |
11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /firestore.rules: -------------------------------------------------------------------------------- 1 | rules_version = '2'; 2 | service cloud.firestore { 3 | match /databases/{database}/documents { 4 | match /{document=**} { 5 | 6 | // Required for collection group queries 7 | match /posts/{postId} { 8 | allow read; 9 | } 10 | 11 | match /users/{userId} { 12 | allow read; 13 | allow create: if isValidUser(userId); 14 | } 15 | 16 | match /usernames/{username} { 17 | allow read; 18 | allow create: if isValidUsername(username); 19 | } 20 | 21 | 22 | match /users/{userId}/posts/{postId} { 23 | allow read; 24 | allow create: if canCreatePost(userId); 25 | allow update: if canUpdatePost(userId) || canIncrementHearts(userId, postId); 26 | allow delete: if request.auth.uid == userId; 27 | } 28 | 29 | match /users/{userId}/posts/{postId}/hearts/{heartId} { 30 | allow read; 31 | allow write: if request.auth.uid == heartId; 32 | } 33 | 34 | // Users 35 | 36 | function isValidUser(userId) { 37 | let isOwner = request.auth.uid == userId; 38 | let username = request.resource.data.username; 39 | let createdValidUsername = existsAfter(/databases/$(database)/documents/usernames/$(username)); 40 | 41 | return isOwner && createdValidUsername; 42 | } 43 | 44 | function isValidUsername(username) { 45 | let isOwner = request.auth.uid == request.resource.data.uid; 46 | let isValidLength = username.size() >= 3 && username.size() <= 15; 47 | let isValidUserDoc = getAfter(/databases/$(database)/documents/users/$(request.auth.uid)).data.username == username; 48 | 49 | return isOwner && isValidLength && isValidUserDoc; 50 | } 51 | 52 | // Posts 53 | 54 | function canCreatePost(userId) { 55 | let isOwner = request.auth.uid == userId; 56 | let isNow = request.time == request.resource.data.createdAt; 57 | let isValidContent = request.resource.data.content.size() < 20000 && request.resource.data.heartCount == 0; 58 | let username = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.username; 59 | let usernameMatches = username == request.resource.data.username; 60 | 61 | return isOwner && isNow && isValidContent && usernameMatches; 62 | } 63 | 64 | function canUpdatePost(userId) { 65 | let isOwner = request.auth.uid == userId; 66 | let isNow = request.time == request.resource.data.updatedAt; 67 | let isValidContent = request.resource.data.content.size() < 20000; 68 | let doesNotUpdateForbidden = !request.resource.data.diff(resource.data).affectedKeys().hasAny(['uid', 'username', 'heartCount']); 69 | 70 | return isOwner && isNow && isValidContent && doesNotUpdateForbidden; 71 | } 72 | 73 | // Hearts 74 | 75 | function canIncrementHearts(userId, postId) { 76 | let hasValidFields = request.resource.data.diff(resource.data).affectedKeys().hasOnly(['heartCount']); 77 | let currentUser = request.auth.uid; 78 | let heartDocExistsAfter = existsAfter(/databases/$(database)/documents/users/$(userId)/posts/$(postId)/hearts/$(currentUser)); 79 | let heartDocExists = exists(/databases/$(database)/documents/users/$(userId)/posts/$(postId)/hearts/$(currentUser)); 80 | 81 | let heartDocAdded= !heartDocExists && heartDocExistsAfter; 82 | let heartDocRemoved = heartDocExists && !heartDocExistsAfter; 83 | 84 | 85 | let countChange = request.resource.data.heartCount - resource.data.heartCount; 86 | let validChange = countChange == 1 || countChange == -1; 87 | 88 | return hasValidFields && validChange && ( countChange == 1 ? heartDocAdded : heartDocRemoved ); 89 | } 90 | 91 | 92 | 93 | } 94 | 95 | } 96 | } -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "paths": { 5 | "@components/*": ["components/*"], 6 | "@styles/*": ["styles/*"], 7 | "@lib/*": ["lib/*"], 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /lib/context.js: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | export const UserContext = createContext({ user: null, username: null }); 3 | -------------------------------------------------------------------------------- /lib/firebase.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import 'firebase/auth'; 3 | import 'firebase/firestore'; 4 | import 'firebase/storage'; 5 | 6 | const firebaseConfig = { 7 | apiKey: 'AIzaSyBX5gkKsbOr1V0zxBuSqHWFct12dFOsQHA', 8 | authDomain: 'nextfire-demo.firebaseapp.com', 9 | projectId: 'nextfire-demo', 10 | storageBucket: 'nextfire-demo.appspot.com', 11 | messagingSenderId: '827402452263', 12 | appId: '1:827402452263:web:c9a4bea701665ddf15fd02', 13 | }; 14 | 15 | if (!firebase.apps.length) { 16 | firebase.initializeApp(firebaseConfig); 17 | } 18 | 19 | // Auth exports 20 | export const auth = firebase.auth(); 21 | export const googleAuthProvider = new firebase.auth.GoogleAuthProvider(); 22 | 23 | // Firestore exports 24 | export const firestore = firebase.firestore(); 25 | export const serverTimestamp = firebase.firestore.FieldValue.serverTimestamp; 26 | export const fromMillis = firebase.firestore.Timestamp.fromMillis; 27 | export const increment = firebase.firestore.FieldValue.increment; 28 | 29 | // Storage exports 30 | export const storage = firebase.storage(); 31 | export const STATE_CHANGED = firebase.storage.TaskEvent.STATE_CHANGED; 32 | 33 | /// Helper functions 34 | 35 | /**` 36 | * Gets a users/{uid} document with username 37 | * @param {string} username 38 | */ 39 | export async function getUserWithUsername(username) { 40 | const usersRef = firestore.collection('users'); 41 | const query = usersRef.where('username', '==', username).limit(1); 42 | const userDoc = (await query.get()).docs[0]; 43 | return userDoc; 44 | } 45 | 46 | /**` 47 | * Converts a firestore document to JSON 48 | * @param {DocumentSnapshot} doc 49 | */ 50 | export function postToJSON(doc) { 51 | const data = doc.data(); 52 | return { 53 | ...data, 54 | // Gotcha! firestore timestamp NOT serializable to JSON. Must convert to milliseconds 55 | createdAt: data?.createdAt.toMillis() || 0, 56 | updatedAt: data?.updatedAt.toMillis() || 0, 57 | }; 58 | } 59 | -------------------------------------------------------------------------------- /lib/hooks.js: -------------------------------------------------------------------------------- 1 | import { auth, firestore } from '@lib/firebase'; 2 | import { useEffect, useState } from 'react'; 3 | import { useAuthState } from 'react-firebase-hooks/auth'; 4 | 5 | // Custom hook to read auth record and user profile doc 6 | export function useUserData() { 7 | const [user] = useAuthState(auth); 8 | const [username, setUsername] = useState(null); 9 | 10 | useEffect(() => { 11 | // turn off realtime subscription 12 | let unsubscribe; 13 | 14 | if (user) { 15 | const ref = firestore.collection('users').doc(user.uid); 16 | unsubscribe = ref.onSnapshot((doc) => { 17 | setUsername(doc.data()?.username); 18 | }); 19 | } else { 20 | setUsername(null); 21 | } 22 | 23 | return unsubscribe; 24 | }, [user]); 25 | 26 | return { user, username }; 27 | } 28 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | swcMinify: true, 3 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextfire", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "requires": { 12 | "@babel/highlight": "^7.10.4" 13 | } 14 | }, 15 | "@babel/helper-plugin-utils": { 16 | "version": "7.14.5", 17 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", 18 | "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" 19 | }, 20 | "@babel/helper-validator-identifier": { 21 | "version": "7.15.7", 22 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 23 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" 24 | }, 25 | "@babel/highlight": { 26 | "version": "7.14.5", 27 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 28 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 29 | "requires": { 30 | "@babel/helper-validator-identifier": "^7.14.5", 31 | "chalk": "^2.0.0", 32 | "js-tokens": "^4.0.0" 33 | } 34 | }, 35 | "@babel/plugin-syntax-jsx": { 36 | "version": "7.14.5", 37 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", 38 | "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", 39 | "requires": { 40 | "@babel/helper-plugin-utils": "^7.14.5" 41 | } 42 | }, 43 | "@babel/runtime": { 44 | "version": "7.15.4", 45 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", 46 | "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", 47 | "requires": { 48 | "regenerator-runtime": "^0.13.4" 49 | } 50 | }, 51 | "@babel/types": { 52 | "version": "7.15.0", 53 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", 54 | "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", 55 | "requires": { 56 | "@babel/helper-validator-identifier": "^7.14.9", 57 | "to-fast-properties": "^2.0.0" 58 | } 59 | }, 60 | "@firebase/analytics": { 61 | "version": "0.6.18", 62 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.18.tgz", 63 | "integrity": "sha512-FXNtYDxbs9ynPbzUVuG94BjFPOPpgJ7156660uvCBuKgoBCIVcNqKkJQQ7TH8384fqvGjbjdcgARY9jgAHbtog==", 64 | "requires": { 65 | "@firebase/analytics-types": "0.6.0", 66 | "@firebase/component": "0.5.6", 67 | "@firebase/installations": "0.4.32", 68 | "@firebase/logger": "0.2.6", 69 | "@firebase/util": "1.3.0", 70 | "tslib": "^2.1.0" 71 | } 72 | }, 73 | "@firebase/analytics-types": { 74 | "version": "0.6.0", 75 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.6.0.tgz", 76 | "integrity": "sha512-kbMawY0WRPyL/lbknBkme4CNLl+Gw+E9G4OpNeXAauqoQiNkBgpIvZYy7BRT4sNGhZbxdxXxXbruqUwDzLmvTw==" 77 | }, 78 | "@firebase/app": { 79 | "version": "0.6.30", 80 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.30.tgz", 81 | "integrity": "sha512-uAYEDXyK0mmpZ8hWQj5TNd7WVvfsU8PgsqKpGljbFBG/HhsH8KbcykWAAA+c1PqL7dt/dbt0Reh1y9zEdYzMhg==", 82 | "requires": { 83 | "@firebase/app-types": "0.6.3", 84 | "@firebase/component": "0.5.6", 85 | "@firebase/logger": "0.2.6", 86 | "@firebase/util": "1.3.0", 87 | "dom-storage": "2.1.0", 88 | "tslib": "^2.1.0", 89 | "xmlhttprequest": "1.8.0" 90 | } 91 | }, 92 | "@firebase/app-check": { 93 | "version": "0.3.2", 94 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.3.2.tgz", 95 | "integrity": "sha512-YjpsnV1xVTO1B836IKijRcDeceLgHQNJ/DWa+Vky9UHkm1Mi4qosddX8LZzldaWRTWKX7BN1MbZOLY8r7M/MZQ==", 96 | "requires": { 97 | "@firebase/app-check-interop-types": "0.1.0", 98 | "@firebase/app-check-types": "0.3.1", 99 | "@firebase/component": "0.5.6", 100 | "@firebase/logger": "0.2.6", 101 | "@firebase/util": "1.3.0", 102 | "tslib": "^2.1.0" 103 | } 104 | }, 105 | "@firebase/app-check-interop-types": { 106 | "version": "0.1.0", 107 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", 108 | "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" 109 | }, 110 | "@firebase/app-check-types": { 111 | "version": "0.3.1", 112 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.3.1.tgz", 113 | "integrity": "sha512-KJ+BqJbdNsx4QT/JIT1yDj5p6D+QN97iJs3GuHnORrqL+DU3RWc9nSYQsrY6Tv9jVWcOkMENXAgDT484vzsm2w==" 114 | }, 115 | "@firebase/app-types": { 116 | "version": "0.6.3", 117 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", 118 | "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==" 119 | }, 120 | "@firebase/auth": { 121 | "version": "0.16.8", 122 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.8.tgz", 123 | "integrity": "sha512-mR0UXG4LirWIfOiCWxVmvz1o23BuKGxeItQ2cCUgXLTjNtWJXdcky/356iTUsd7ZV5A78s2NHeN5tIDDG6H4rg==", 124 | "requires": { 125 | "@firebase/auth-types": "0.10.3" 126 | } 127 | }, 128 | "@firebase/auth-interop-types": { 129 | "version": "0.1.6", 130 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", 131 | "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" 132 | }, 133 | "@firebase/auth-types": { 134 | "version": "0.10.3", 135 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.3.tgz", 136 | "integrity": "sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA==" 137 | }, 138 | "@firebase/component": { 139 | "version": "0.5.6", 140 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.6.tgz", 141 | "integrity": "sha512-GyQJ+2lrhsDqeGgd1VdS7W+Y6gNYyI0B51ovNTxeZVG/W8I7t9MwEiCWsCvfm5wQgfsKp9dkzOcJrL5k8oVO/Q==", 142 | "requires": { 143 | "@firebase/util": "1.3.0", 144 | "tslib": "^2.1.0" 145 | } 146 | }, 147 | "@firebase/database": { 148 | "version": "0.11.0", 149 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.11.0.tgz", 150 | "integrity": "sha512-b/kwvCubr6G9coPlo48PbieBDln7ViFBHOGeVt/bt82yuv5jYZBEYAac/mtOVSxpf14aMo/tAN+Edl6SWqXApw==", 151 | "requires": { 152 | "@firebase/auth-interop-types": "0.1.6", 153 | "@firebase/component": "0.5.6", 154 | "@firebase/database-types": "0.8.0", 155 | "@firebase/logger": "0.2.6", 156 | "@firebase/util": "1.3.0", 157 | "faye-websocket": "0.11.3", 158 | "tslib": "^2.1.0" 159 | } 160 | }, 161 | "@firebase/database-types": { 162 | "version": "0.8.0", 163 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.8.0.tgz", 164 | "integrity": "sha512-7IdjAFRfPWyG3b4wcXyghb3Y1CLCSJFZIg1xl5GbTVMttSQFT4B5NYdhsfA34JwAsv5pMzPpjOaS3/K9XJ2KiA==", 165 | "requires": { 166 | "@firebase/app-types": "0.6.3", 167 | "@firebase/util": "1.3.0" 168 | } 169 | }, 170 | "@firebase/firestore": { 171 | "version": "2.4.0", 172 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.4.0.tgz", 173 | "integrity": "sha512-PQ6+lWNrvh74GvFTHT4gCutFipDmtu8D1tNNawKe+/SyL6XFgeuMYgZIpKQgkTSezVDogC7EGQTJBFnewF9pOg==", 174 | "requires": { 175 | "@firebase/component": "0.5.6", 176 | "@firebase/firestore-types": "2.4.0", 177 | "@firebase/logger": "0.2.6", 178 | "@firebase/util": "1.3.0", 179 | "@firebase/webchannel-wrapper": "0.5.1", 180 | "@grpc/grpc-js": "^1.3.2", 181 | "@grpc/proto-loader": "^0.6.0", 182 | "node-fetch": "2.6.1", 183 | "tslib": "^2.1.0" 184 | } 185 | }, 186 | "@firebase/firestore-types": { 187 | "version": "2.4.0", 188 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.4.0.tgz", 189 | "integrity": "sha512-0dgwfuNP7EN6/OlK2HSNSQiQNGLGaRBH0gvgr1ngtKKJuJFuq0Z48RBMeJX9CGjV4TP9h2KaB+KrUKJ5kh1hMg==" 190 | }, 191 | "@firebase/functions": { 192 | "version": "0.6.15", 193 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.15.tgz", 194 | "integrity": "sha512-b7RpLwFXi0N+HgkfK8cmkarSOoBeSrc1jNdadkCacQt+vIePkKM3E9EJXF4roWSa8GwTruodpBsvH+lK9iCAKQ==", 195 | "requires": { 196 | "@firebase/component": "0.5.6", 197 | "@firebase/functions-types": "0.4.0", 198 | "@firebase/messaging-types": "0.5.0", 199 | "node-fetch": "2.6.1", 200 | "tslib": "^2.1.0" 201 | } 202 | }, 203 | "@firebase/functions-types": { 204 | "version": "0.4.0", 205 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz", 206 | "integrity": "sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ==" 207 | }, 208 | "@firebase/installations": { 209 | "version": "0.4.32", 210 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.32.tgz", 211 | "integrity": "sha512-K4UlED1Vrhd2rFQQJih+OgEj8OTtrtH4+Izkx7ip2bhXSc+unk8ZhnF69D0kmh7zjXAqEDJrmHs9O5fI3rV6Tw==", 212 | "requires": { 213 | "@firebase/component": "0.5.6", 214 | "@firebase/installations-types": "0.3.4", 215 | "@firebase/util": "1.3.0", 216 | "idb": "3.0.2", 217 | "tslib": "^2.1.0" 218 | } 219 | }, 220 | "@firebase/installations-types": { 221 | "version": "0.3.4", 222 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", 223 | "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==" 224 | }, 225 | "@firebase/logger": { 226 | "version": "0.2.6", 227 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", 228 | "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" 229 | }, 230 | "@firebase/messaging": { 231 | "version": "0.8.0", 232 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.8.0.tgz", 233 | "integrity": "sha512-hkFHDyVe1kMcY9KEG+prjCbvS6MtLUgVFUbbQqq7JQfiv58E07YCzRUcMrJolbNi/1QHH6Jv16DxNWjJB9+/qA==", 234 | "requires": { 235 | "@firebase/component": "0.5.6", 236 | "@firebase/installations": "0.4.32", 237 | "@firebase/messaging-types": "0.5.0", 238 | "@firebase/util": "1.3.0", 239 | "idb": "3.0.2", 240 | "tslib": "^2.1.0" 241 | } 242 | }, 243 | "@firebase/messaging-types": { 244 | "version": "0.5.0", 245 | "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", 246 | "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==" 247 | }, 248 | "@firebase/performance": { 249 | "version": "0.4.18", 250 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.18.tgz", 251 | "integrity": "sha512-lvZW/TVDne2TyOpWbv++zjRn277HZpbjxbIPfwtnmKjVY1gJ+H77Qi1c2avVIc9hg80uGX/5tNf4pOApNDJLVg==", 252 | "requires": { 253 | "@firebase/component": "0.5.6", 254 | "@firebase/installations": "0.4.32", 255 | "@firebase/logger": "0.2.6", 256 | "@firebase/performance-types": "0.0.13", 257 | "@firebase/util": "1.3.0", 258 | "tslib": "^2.1.0" 259 | } 260 | }, 261 | "@firebase/performance-types": { 262 | "version": "0.0.13", 263 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz", 264 | "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==" 265 | }, 266 | "@firebase/polyfill": { 267 | "version": "0.3.36", 268 | "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", 269 | "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", 270 | "requires": { 271 | "core-js": "3.6.5", 272 | "promise-polyfill": "8.1.3", 273 | "whatwg-fetch": "2.0.4" 274 | } 275 | }, 276 | "@firebase/remote-config": { 277 | "version": "0.1.43", 278 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.43.tgz", 279 | "integrity": "sha512-laNM4MN0CfeSp7XCVNjYOC4DdV6mj0l2rzUh42x4v2wLTweCoJ/kc1i4oWMX9TI7Jw8Am5Wl71Awn1J2pVe5xA==", 280 | "requires": { 281 | "@firebase/component": "0.5.6", 282 | "@firebase/installations": "0.4.32", 283 | "@firebase/logger": "0.2.6", 284 | "@firebase/remote-config-types": "0.1.9", 285 | "@firebase/util": "1.3.0", 286 | "tslib": "^2.1.0" 287 | } 288 | }, 289 | "@firebase/remote-config-types": { 290 | "version": "0.1.9", 291 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz", 292 | "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==" 293 | }, 294 | "@firebase/storage": { 295 | "version": "0.7.0", 296 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.7.0.tgz", 297 | "integrity": "sha512-ebDFKJbM5HOxVtZV+RhVEBVtlWHK+Z5L3kA5uDBA2jMYcn+8NV/crozJnEE+iRsGEco6dLK5JS+Er4qtKLpH5A==", 298 | "requires": { 299 | "@firebase/component": "0.5.6", 300 | "@firebase/storage-types": "0.5.0", 301 | "@firebase/util": "1.3.0", 302 | "node-fetch": "2.6.1", 303 | "tslib": "^2.1.0" 304 | } 305 | }, 306 | "@firebase/storage-types": { 307 | "version": "0.5.0", 308 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.5.0.tgz", 309 | "integrity": "sha512-6Wv3Lu7s18hsgW7HG4BFwycTquZ3m/C8bjBoOsmPu0TD6M1GKwCzOC7qBdN7L6tRYPh8ipTj5+rPFrmhGfUVKA==" 310 | }, 311 | "@firebase/util": { 312 | "version": "1.3.0", 313 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.3.0.tgz", 314 | "integrity": "sha512-SESvmYwuKOVCZ1ZxLbberbx+9cnbxpCa4CG2FUSQYqN6Ab8KyltegMDIsqMw5KyIBZ4n1phfHoOa22xo5NzAlQ==", 315 | "requires": { 316 | "tslib": "^2.1.0" 317 | } 318 | }, 319 | "@firebase/webchannel-wrapper": { 320 | "version": "0.5.1", 321 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.5.1.tgz", 322 | "integrity": "sha512-dZMzN0uAjwJXWYYAcnxIwXqRTZw3o14hGe7O6uhwjD1ZQWPVYA5lASgnNskEBra0knVBsOXB4KXg+HnlKewN/A==" 323 | }, 324 | "@grpc/grpc-js": { 325 | "version": "1.3.7", 326 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.7.tgz", 327 | "integrity": "sha512-CKQVuwuSPh40tgOkR7c0ZisxYRiN05PcKPW72mQL5y++qd7CwBRoaJZvU5xfXnCJDFBmS3qZGQ71Frx6Ofo2XA==", 328 | "requires": { 329 | "@types/node": ">=12.12.47" 330 | } 331 | }, 332 | "@grpc/proto-loader": { 333 | "version": "0.6.4", 334 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.4.tgz", 335 | "integrity": "sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==", 336 | "requires": { 337 | "@types/long": "^4.0.1", 338 | "lodash.camelcase": "^4.3.0", 339 | "long": "^4.0.0", 340 | "protobufjs": "^6.10.0", 341 | "yargs": "^16.1.1" 342 | } 343 | }, 344 | "@hapi/accept": { 345 | "version": "5.0.2", 346 | "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", 347 | "integrity": "sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw==", 348 | "requires": { 349 | "@hapi/boom": "9.x.x", 350 | "@hapi/hoek": "9.x.x" 351 | } 352 | }, 353 | "@hapi/boom": { 354 | "version": "9.1.4", 355 | "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", 356 | "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", 357 | "requires": { 358 | "@hapi/hoek": "9.x.x" 359 | } 360 | }, 361 | "@hapi/hoek": { 362 | "version": "9.2.1", 363 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", 364 | "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" 365 | }, 366 | "@napi-rs/triples": { 367 | "version": "1.0.3", 368 | "resolved": "https://registry.npmjs.org/@napi-rs/triples/-/triples-1.0.3.tgz", 369 | "integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==" 370 | }, 371 | "@next/env": { 372 | "version": "12.0.1", 373 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.0.1.tgz", 374 | "integrity": "sha512-+eJ8mQbAcV/ZILRAgIx9xwDg6hrqm6m/7QLfEvsf2BPnsh+fwU4Xf1zgcbyqD2V4ja4OTWG6ow+Hiukgap3mZQ==" 375 | }, 376 | "@next/polyfill-module": { 377 | "version": "12.0.1", 378 | "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-12.0.1.tgz", 379 | "integrity": "sha512-fTrndwGuvrQO+4myVGcPtsYI4/tmZBhHHJId7MSHWz+9gW4NFgsmDlr8OI9Th2ZXpqk5WHLsTYQ+dLiQp1zV4g==" 380 | }, 381 | "@next/react-dev-overlay": { 382 | "version": "12.0.1", 383 | "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-12.0.1.tgz", 384 | "integrity": "sha512-dLv1to40bvadbr0VO8pBsbr9ddgktCLilfejOpEFQkOOrdQBUuIfegqqEDiCL9THkAO3QGYY4t/ZPfv9wrxLZQ==", 385 | "requires": { 386 | "@babel/code-frame": "7.12.11", 387 | "anser": "1.4.9", 388 | "chalk": "4.0.0", 389 | "classnames": "2.2.6", 390 | "css.escape": "1.5.1", 391 | "data-uri-to-buffer": "3.0.1", 392 | "platform": "1.3.6", 393 | "shell-quote": "1.7.2", 394 | "source-map": "0.8.0-beta.0", 395 | "stacktrace-parser": "0.1.10", 396 | "strip-ansi": "6.0.1" 397 | }, 398 | "dependencies": { 399 | "ansi-regex": { 400 | "version": "5.0.1", 401 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 402 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 403 | }, 404 | "chalk": { 405 | "version": "4.0.0", 406 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 407 | "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 408 | "requires": { 409 | "ansi-styles": "^4.1.0", 410 | "supports-color": "^7.1.0" 411 | } 412 | }, 413 | "has-flag": { 414 | "version": "4.0.0", 415 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 416 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 417 | }, 418 | "strip-ansi": { 419 | "version": "6.0.1", 420 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 421 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 422 | "requires": { 423 | "ansi-regex": "^5.0.1" 424 | } 425 | }, 426 | "supports-color": { 427 | "version": "7.2.0", 428 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 429 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 430 | "requires": { 431 | "has-flag": "^4.0.0" 432 | } 433 | } 434 | } 435 | }, 436 | "@next/react-refresh-utils": { 437 | "version": "12.0.1", 438 | "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-12.0.1.tgz", 439 | "integrity": "sha512-CjTBR9a6ai+2fUT8KFya9AiTaCnfDY34H6pDmtdJdkD+vY08AwtPpv10kzsgNEhsL06210yVzH59IsEQLBIllA==" 440 | }, 441 | "@next/swc-android-arm64": { 442 | "version": "12.0.1", 443 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.0.1.tgz", 444 | "integrity": "sha512-zI/6zsZuO2igknzHzfaQep0PeD3d4/qdjXUcQLwLHJQtGdhPvZFMke1z3BBWZqePHVsR1JPjE4QTii7udF5qsQ==", 445 | "optional": true 446 | }, 447 | "@next/swc-darwin-arm64": { 448 | "version": "12.0.1", 449 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.0.1.tgz", 450 | "integrity": "sha512-vRfHz7rEt9+TTfwi3uY9ObUSLhzMmgVZ96b+yOSmZ6Kxs/V46IXHOLawCnoldXylpskZ/+HTWcrB1D3aimGeZA==", 451 | "optional": true 452 | }, 453 | "@next/swc-darwin-x64": { 454 | "version": "12.0.1", 455 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.0.1.tgz", 456 | "integrity": "sha512-mM7QLIqRUqR8I74gbZ4Uq+dY8k3Whrs98wK+vPurmDTBhXhaVnAYblEkEwe0DJGqlmjD4w6faYfCydmFI69jqw==", 457 | "optional": true 458 | }, 459 | "@next/swc-linux-arm-gnueabihf": { 460 | "version": "12.0.1", 461 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.0.1.tgz", 462 | "integrity": "sha512-QF5LVyAWTah5i1p/yG4a8nTGRXerHoDkS3kWYCdjcwlALOiAJ9m0GUTks/O47izNokBAbZnL7URUdvtGFjP0Ng==", 463 | "optional": true 464 | }, 465 | "@next/swc-linux-arm64-gnu": { 466 | "version": "12.0.1", 467 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.0.1.tgz", 468 | "integrity": "sha512-ETFUh373WsjUJJr32GHSDlVSgwFwS+EJUJuSH40Pr4xB6250YxuRk8ccF6QR5LHqTL4tbbVEEfCD8sZVnccP8w==", 469 | "optional": true 470 | }, 471 | "@next/swc-linux-arm64-musl": { 472 | "version": "12.0.1", 473 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.0.1.tgz", 474 | "integrity": "sha512-pfnXNjKywXyp2DJsjFhkfOlvcNu9xa8HgEhCUKXm1OZ4pGnpeb1+UD4t5Pn9b9ggiWPzauZK1abR/9nShvbSzw==", 475 | "optional": true 476 | }, 477 | "@next/swc-linux-x64-gnu": { 478 | "version": "12.0.1", 479 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.0.1.tgz", 480 | "integrity": "sha512-d9cXS27Ar7TTtA3BJ8gxosDDdVNSFy4MQiwsszKlEiqfGrnINeXKdVgeiOa+xxq+JxNvPzonp4sbX6k8InIocg==", 481 | "optional": true 482 | }, 483 | "@next/swc-linux-x64-musl": { 484 | "version": "12.0.1", 485 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.0.1.tgz", 486 | "integrity": "sha512-4SAmi7riavU6TFGX7wQFioFi/vx8uJ2/Cx7ZfrYiZzzKmmuu2eM8onW1kcKu+aQD777x/kvzW4+2pWkM2gyPOA==", 487 | "optional": true 488 | }, 489 | "@next/swc-win32-arm64-msvc": { 490 | "version": "12.0.1", 491 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.0.1.tgz", 492 | "integrity": "sha512-JRad3QyXvs5zDkeEmc6z5tEvm/ZZnjnsBY921zWw7OIcIZR5wAs+1AnRVjIxHTEHSExxOvBgPyEMpgVkB8OyxQ==", 493 | "optional": true 494 | }, 495 | "@next/swc-win32-ia32-msvc": { 496 | "version": "12.0.1", 497 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.0.1.tgz", 498 | "integrity": "sha512-ierQmzVWPi6a7PqrdgfI6nrQ/SWJ9W5jllByyQeFIOKhOzZiz030Tw+U6V7NqE3gGNeRwpj56Iya8nUb3hlM1g==", 499 | "optional": true 500 | }, 501 | "@next/swc-win32-x64-msvc": { 502 | "version": "12.0.1", 503 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.0.1.tgz", 504 | "integrity": "sha512-li3CCXpdMX0+wJlQpy0xZmHCgHMebaBf5X2BIAJrv8cQXYc6dejeojttXLFNCF0dNAo3UzlbP6h7N+8p6Wbakw==", 505 | "optional": true 506 | }, 507 | "@node-rs/helper": { 508 | "version": "1.2.1", 509 | "resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz", 510 | "integrity": "sha512-R5wEmm8nbuQU0YGGmYVjEc0OHtYsuXdpRG+Ut/3wZ9XAvQWyThN08bTh2cBJgoZxHQUPtvRfeQuxcAgLuiBISg==", 511 | "requires": { 512 | "@napi-rs/triples": "^1.0.3" 513 | } 514 | }, 515 | "@protobufjs/aspromise": { 516 | "version": "1.1.2", 517 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 518 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 519 | }, 520 | "@protobufjs/base64": { 521 | "version": "1.1.2", 522 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 523 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 524 | }, 525 | "@protobufjs/codegen": { 526 | "version": "2.0.4", 527 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 528 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 529 | }, 530 | "@protobufjs/eventemitter": { 531 | "version": "1.1.0", 532 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 533 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 534 | }, 535 | "@protobufjs/fetch": { 536 | "version": "1.1.0", 537 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 538 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 539 | "requires": { 540 | "@protobufjs/aspromise": "^1.1.1", 541 | "@protobufjs/inquire": "^1.1.0" 542 | } 543 | }, 544 | "@protobufjs/float": { 545 | "version": "1.0.2", 546 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 547 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 548 | }, 549 | "@protobufjs/inquire": { 550 | "version": "1.1.0", 551 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 552 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 553 | }, 554 | "@protobufjs/path": { 555 | "version": "1.1.2", 556 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 557 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 558 | }, 559 | "@protobufjs/pool": { 560 | "version": "1.1.0", 561 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 562 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 563 | }, 564 | "@protobufjs/utf8": { 565 | "version": "1.1.0", 566 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 567 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 568 | }, 569 | "@types/long": { 570 | "version": "4.0.1", 571 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 572 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 573 | }, 574 | "@types/mdast": { 575 | "version": "3.0.3", 576 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", 577 | "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", 578 | "requires": { 579 | "@types/unist": "*" 580 | } 581 | }, 582 | "@types/node": { 583 | "version": "16.7.10", 584 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", 585 | "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==" 586 | }, 587 | "@types/unist": { 588 | "version": "2.0.3", 589 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 590 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 591 | }, 592 | "acorn": { 593 | "version": "8.5.0", 594 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", 595 | "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" 596 | }, 597 | "anser": { 598 | "version": "1.4.9", 599 | "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", 600 | "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" 601 | }, 602 | "ansi-regex": { 603 | "version": "5.0.0", 604 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 605 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 606 | }, 607 | "ansi-styles": { 608 | "version": "4.3.0", 609 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 610 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 611 | "requires": { 612 | "color-convert": "^2.0.1" 613 | } 614 | }, 615 | "anymatch": { 616 | "version": "3.1.2", 617 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 618 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 619 | "requires": { 620 | "normalize-path": "^3.0.0", 621 | "picomatch": "^2.0.4" 622 | } 623 | }, 624 | "asn1.js": { 625 | "version": "5.4.1", 626 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 627 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 628 | "requires": { 629 | "bn.js": "^4.0.0", 630 | "inherits": "^2.0.1", 631 | "minimalistic-assert": "^1.0.0", 632 | "safer-buffer": "^2.1.0" 633 | }, 634 | "dependencies": { 635 | "bn.js": { 636 | "version": "4.12.0", 637 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 638 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 639 | } 640 | } 641 | }, 642 | "assert": { 643 | "version": "2.0.0", 644 | "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 645 | "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 646 | "requires": { 647 | "es6-object-assign": "^1.1.0", 648 | "is-nan": "^1.2.1", 649 | "object-is": "^1.0.1", 650 | "util": "^0.12.0" 651 | } 652 | }, 653 | "available-typed-arrays": { 654 | "version": "1.0.5", 655 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 656 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" 657 | }, 658 | "bail": { 659 | "version": "1.0.5", 660 | "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", 661 | "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" 662 | }, 663 | "base64-js": { 664 | "version": "1.5.1", 665 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 666 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 667 | }, 668 | "big.js": { 669 | "version": "5.2.2", 670 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 671 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 672 | }, 673 | "binary-extensions": { 674 | "version": "2.2.0", 675 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 676 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 677 | }, 678 | "bn.js": { 679 | "version": "5.2.0", 680 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 681 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" 682 | }, 683 | "braces": { 684 | "version": "3.0.2", 685 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 686 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 687 | "requires": { 688 | "fill-range": "^7.0.1" 689 | } 690 | }, 691 | "brorand": { 692 | "version": "1.1.0", 693 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 694 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" 695 | }, 696 | "browserify-aes": { 697 | "version": "1.2.0", 698 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 699 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 700 | "requires": { 701 | "buffer-xor": "^1.0.3", 702 | "cipher-base": "^1.0.0", 703 | "create-hash": "^1.1.0", 704 | "evp_bytestokey": "^1.0.3", 705 | "inherits": "^2.0.1", 706 | "safe-buffer": "^5.0.1" 707 | } 708 | }, 709 | "browserify-cipher": { 710 | "version": "1.0.1", 711 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 712 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 713 | "requires": { 714 | "browserify-aes": "^1.0.4", 715 | "browserify-des": "^1.0.0", 716 | "evp_bytestokey": "^1.0.0" 717 | } 718 | }, 719 | "browserify-des": { 720 | "version": "1.0.2", 721 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 722 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 723 | "requires": { 724 | "cipher-base": "^1.0.1", 725 | "des.js": "^1.0.0", 726 | "inherits": "^2.0.1", 727 | "safe-buffer": "^5.1.2" 728 | } 729 | }, 730 | "browserify-rsa": { 731 | "version": "4.1.0", 732 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 733 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 734 | "requires": { 735 | "bn.js": "^5.0.0", 736 | "randombytes": "^2.0.1" 737 | } 738 | }, 739 | "browserify-sign": { 740 | "version": "4.2.1", 741 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 742 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 743 | "requires": { 744 | "bn.js": "^5.1.1", 745 | "browserify-rsa": "^4.0.1", 746 | "create-hash": "^1.2.0", 747 | "create-hmac": "^1.1.7", 748 | "elliptic": "^6.5.3", 749 | "inherits": "^2.0.4", 750 | "parse-asn1": "^5.1.5", 751 | "readable-stream": "^3.6.0", 752 | "safe-buffer": "^5.2.0" 753 | } 754 | }, 755 | "browserify-zlib": { 756 | "version": "0.2.0", 757 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 758 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 759 | "requires": { 760 | "pako": "~1.0.5" 761 | } 762 | }, 763 | "browserslist": { 764 | "version": "4.16.6", 765 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", 766 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", 767 | "requires": { 768 | "caniuse-lite": "^1.0.30001219", 769 | "colorette": "^1.2.2", 770 | "electron-to-chromium": "^1.3.723", 771 | "escalade": "^3.1.1", 772 | "node-releases": "^1.1.71" 773 | } 774 | }, 775 | "buffer": { 776 | "version": "5.6.0", 777 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 778 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 779 | "requires": { 780 | "base64-js": "^1.0.2", 781 | "ieee754": "^1.1.4" 782 | } 783 | }, 784 | "buffer-xor": { 785 | "version": "1.0.3", 786 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 787 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" 788 | }, 789 | "builtin-status-codes": { 790 | "version": "3.0.0", 791 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 792 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" 793 | }, 794 | "bytes": { 795 | "version": "3.1.0", 796 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 797 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 798 | }, 799 | "call-bind": { 800 | "version": "1.0.2", 801 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 802 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 803 | "requires": { 804 | "function-bind": "^1.1.1", 805 | "get-intrinsic": "^1.0.2" 806 | } 807 | }, 808 | "caniuse-lite": { 809 | "version": "1.0.30001271", 810 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz", 811 | "integrity": "sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA==" 812 | }, 813 | "chalk": { 814 | "version": "2.4.2", 815 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 816 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 817 | "requires": { 818 | "ansi-styles": "^3.2.1", 819 | "escape-string-regexp": "^1.0.5", 820 | "supports-color": "^5.3.0" 821 | }, 822 | "dependencies": { 823 | "ansi-styles": { 824 | "version": "3.2.1", 825 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 826 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 827 | "requires": { 828 | "color-convert": "^1.9.0" 829 | } 830 | }, 831 | "color-convert": { 832 | "version": "1.9.3", 833 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 834 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 835 | "requires": { 836 | "color-name": "1.1.3" 837 | } 838 | }, 839 | "color-name": { 840 | "version": "1.1.3", 841 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 842 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 843 | } 844 | } 845 | }, 846 | "character-entities": { 847 | "version": "1.2.4", 848 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", 849 | "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" 850 | }, 851 | "character-entities-legacy": { 852 | "version": "1.1.4", 853 | "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", 854 | "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" 855 | }, 856 | "character-reference-invalid": { 857 | "version": "1.1.4", 858 | "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", 859 | "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" 860 | }, 861 | "chokidar": { 862 | "version": "3.5.1", 863 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 864 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 865 | "requires": { 866 | "anymatch": "~3.1.1", 867 | "braces": "~3.0.2", 868 | "fsevents": "~2.3.1", 869 | "glob-parent": "~5.1.0", 870 | "is-binary-path": "~2.1.0", 871 | "is-glob": "~4.0.1", 872 | "normalize-path": "~3.0.0", 873 | "readdirp": "~3.5.0" 874 | } 875 | }, 876 | "cipher-base": { 877 | "version": "1.0.4", 878 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 879 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 880 | "requires": { 881 | "inherits": "^2.0.1", 882 | "safe-buffer": "^5.0.1" 883 | } 884 | }, 885 | "classnames": { 886 | "version": "2.2.6", 887 | "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", 888 | "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" 889 | }, 890 | "cliui": { 891 | "version": "7.0.4", 892 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 893 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 894 | "requires": { 895 | "string-width": "^4.2.0", 896 | "strip-ansi": "^6.0.0", 897 | "wrap-ansi": "^7.0.0" 898 | } 899 | }, 900 | "color-convert": { 901 | "version": "2.0.1", 902 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 903 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 904 | "requires": { 905 | "color-name": "~1.1.4" 906 | } 907 | }, 908 | "color-name": { 909 | "version": "1.1.4", 910 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 911 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 912 | }, 913 | "colorette": { 914 | "version": "1.4.0", 915 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", 916 | "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" 917 | }, 918 | "commondir": { 919 | "version": "1.0.1", 920 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 921 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" 922 | }, 923 | "constants-browserify": { 924 | "version": "1.0.0", 925 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 926 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" 927 | }, 928 | "convert-source-map": { 929 | "version": "1.7.0", 930 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 931 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 932 | "requires": { 933 | "safe-buffer": "~5.1.1" 934 | }, 935 | "dependencies": { 936 | "safe-buffer": { 937 | "version": "5.1.2", 938 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 939 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 940 | } 941 | } 942 | }, 943 | "core-js": { 944 | "version": "3.6.5", 945 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 946 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 947 | }, 948 | "create-ecdh": { 949 | "version": "4.0.4", 950 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 951 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 952 | "requires": { 953 | "bn.js": "^4.1.0", 954 | "elliptic": "^6.5.3" 955 | }, 956 | "dependencies": { 957 | "bn.js": { 958 | "version": "4.12.0", 959 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 960 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 961 | } 962 | } 963 | }, 964 | "create-hash": { 965 | "version": "1.2.0", 966 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 967 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 968 | "requires": { 969 | "cipher-base": "^1.0.1", 970 | "inherits": "^2.0.1", 971 | "md5.js": "^1.3.4", 972 | "ripemd160": "^2.0.1", 973 | "sha.js": "^2.4.0" 974 | } 975 | }, 976 | "create-hmac": { 977 | "version": "1.1.7", 978 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 979 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 980 | "requires": { 981 | "cipher-base": "^1.0.3", 982 | "create-hash": "^1.1.0", 983 | "inherits": "^2.0.1", 984 | "ripemd160": "^2.0.0", 985 | "safe-buffer": "^5.0.1", 986 | "sha.js": "^2.4.8" 987 | } 988 | }, 989 | "crypto-browserify": { 990 | "version": "3.12.0", 991 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 992 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 993 | "requires": { 994 | "browserify-cipher": "^1.0.0", 995 | "browserify-sign": "^4.0.0", 996 | "create-ecdh": "^4.0.0", 997 | "create-hash": "^1.1.0", 998 | "create-hmac": "^1.1.0", 999 | "diffie-hellman": "^5.0.0", 1000 | "inherits": "^2.0.1", 1001 | "pbkdf2": "^3.0.3", 1002 | "public-encrypt": "^4.0.0", 1003 | "randombytes": "^2.0.0", 1004 | "randomfill": "^1.0.3" 1005 | } 1006 | }, 1007 | "css.escape": { 1008 | "version": "1.5.1", 1009 | "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", 1010 | "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" 1011 | }, 1012 | "cssnano-preset-simple": { 1013 | "version": "3.0.0", 1014 | "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-3.0.0.tgz", 1015 | "integrity": "sha512-vxQPeoMRqUT3c/9f0vWeVa2nKQIHFpogtoBvFdW4GQ3IvEJ6uauCP6p3Y5zQDLFcI7/+40FTgX12o7XUL0Ko+w==", 1016 | "requires": { 1017 | "caniuse-lite": "^1.0.30001202" 1018 | } 1019 | }, 1020 | "cssnano-simple": { 1021 | "version": "3.0.0", 1022 | "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-3.0.0.tgz", 1023 | "integrity": "sha512-oU3ueli5Dtwgh0DyeohcIEE00QVfbPR3HzyXdAl89SfnQG3y0/qcpfLVW+jPIh3/rgMZGwuW96rejZGaYE9eUg==", 1024 | "requires": { 1025 | "cssnano-preset-simple": "^3.0.0" 1026 | } 1027 | }, 1028 | "data-uri-to-buffer": { 1029 | "version": "3.0.1", 1030 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", 1031 | "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" 1032 | }, 1033 | "debug": { 1034 | "version": "4.3.1", 1035 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1036 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1037 | "requires": { 1038 | "ms": "2.1.2" 1039 | } 1040 | }, 1041 | "define-properties": { 1042 | "version": "1.1.3", 1043 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1044 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1045 | "requires": { 1046 | "object-keys": "^1.0.12" 1047 | } 1048 | }, 1049 | "depd": { 1050 | "version": "1.1.2", 1051 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 1052 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 1053 | }, 1054 | "des.js": { 1055 | "version": "1.0.1", 1056 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 1057 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 1058 | "requires": { 1059 | "inherits": "^2.0.1", 1060 | "minimalistic-assert": "^1.0.0" 1061 | } 1062 | }, 1063 | "diffie-hellman": { 1064 | "version": "5.0.3", 1065 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 1066 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 1067 | "requires": { 1068 | "bn.js": "^4.1.0", 1069 | "miller-rabin": "^4.0.0", 1070 | "randombytes": "^2.0.0" 1071 | }, 1072 | "dependencies": { 1073 | "bn.js": { 1074 | "version": "4.12.0", 1075 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1076 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1077 | } 1078 | } 1079 | }, 1080 | "dom-serializer": { 1081 | "version": "1.1.0", 1082 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.1.0.tgz", 1083 | "integrity": "sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==", 1084 | "requires": { 1085 | "domelementtype": "^2.0.1", 1086 | "domhandler": "^3.0.0", 1087 | "entities": "^2.0.0" 1088 | } 1089 | }, 1090 | "dom-storage": { 1091 | "version": "2.1.0", 1092 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 1093 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 1094 | }, 1095 | "domain-browser": { 1096 | "version": "4.19.0", 1097 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", 1098 | "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" 1099 | }, 1100 | "domelementtype": { 1101 | "version": "2.1.0", 1102 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", 1103 | "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" 1104 | }, 1105 | "domhandler": { 1106 | "version": "3.3.0", 1107 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", 1108 | "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", 1109 | "requires": { 1110 | "domelementtype": "^2.0.1" 1111 | } 1112 | }, 1113 | "domutils": { 1114 | "version": "2.4.2", 1115 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.2.tgz", 1116 | "integrity": "sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==", 1117 | "requires": { 1118 | "dom-serializer": "^1.0.1", 1119 | "domelementtype": "^2.0.1", 1120 | "domhandler": "^3.3.0" 1121 | } 1122 | }, 1123 | "electron-to-chromium": { 1124 | "version": "1.3.880", 1125 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.880.tgz", 1126 | "integrity": "sha512-iwIP/6WoeSimzUKJIQtjtpVDsK8Ir8qQCMXsUBwg+rxJR2Uh3wTNSbxoYRfs+3UWx/9MAnPIxVZCyWkm8MT0uw==" 1127 | }, 1128 | "elliptic": { 1129 | "version": "6.5.4", 1130 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 1131 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 1132 | "requires": { 1133 | "bn.js": "^4.11.9", 1134 | "brorand": "^1.1.0", 1135 | "hash.js": "^1.0.0", 1136 | "hmac-drbg": "^1.0.1", 1137 | "inherits": "^2.0.4", 1138 | "minimalistic-assert": "^1.0.1", 1139 | "minimalistic-crypto-utils": "^1.0.1" 1140 | }, 1141 | "dependencies": { 1142 | "bn.js": { 1143 | "version": "4.12.0", 1144 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1145 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1146 | } 1147 | } 1148 | }, 1149 | "emoji-regex": { 1150 | "version": "8.0.0", 1151 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1152 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1153 | }, 1154 | "emojis-list": { 1155 | "version": "2.1.0", 1156 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 1157 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" 1158 | }, 1159 | "encoding": { 1160 | "version": "0.1.13", 1161 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 1162 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 1163 | "requires": { 1164 | "iconv-lite": "^0.6.2" 1165 | } 1166 | }, 1167 | "entities": { 1168 | "version": "2.1.0", 1169 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", 1170 | "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" 1171 | }, 1172 | "es-abstract": { 1173 | "version": "1.19.1", 1174 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", 1175 | "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", 1176 | "requires": { 1177 | "call-bind": "^1.0.2", 1178 | "es-to-primitive": "^1.2.1", 1179 | "function-bind": "^1.1.1", 1180 | "get-intrinsic": "^1.1.1", 1181 | "get-symbol-description": "^1.0.0", 1182 | "has": "^1.0.3", 1183 | "has-symbols": "^1.0.2", 1184 | "internal-slot": "^1.0.3", 1185 | "is-callable": "^1.2.4", 1186 | "is-negative-zero": "^2.0.1", 1187 | "is-regex": "^1.1.4", 1188 | "is-shared-array-buffer": "^1.0.1", 1189 | "is-string": "^1.0.7", 1190 | "is-weakref": "^1.0.1", 1191 | "object-inspect": "^1.11.0", 1192 | "object-keys": "^1.1.1", 1193 | "object.assign": "^4.1.2", 1194 | "string.prototype.trimend": "^1.0.4", 1195 | "string.prototype.trimstart": "^1.0.4", 1196 | "unbox-primitive": "^1.0.1" 1197 | } 1198 | }, 1199 | "es-to-primitive": { 1200 | "version": "1.2.1", 1201 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1202 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1203 | "requires": { 1204 | "is-callable": "^1.1.4", 1205 | "is-date-object": "^1.0.1", 1206 | "is-symbol": "^1.0.2" 1207 | } 1208 | }, 1209 | "es6-object-assign": { 1210 | "version": "1.1.0", 1211 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 1212 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" 1213 | }, 1214 | "escalade": { 1215 | "version": "3.1.1", 1216 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1217 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 1218 | }, 1219 | "escape-string-regexp": { 1220 | "version": "1.0.5", 1221 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1222 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 1223 | }, 1224 | "etag": { 1225 | "version": "1.8.1", 1226 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1227 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1228 | }, 1229 | "events": { 1230 | "version": "3.3.0", 1231 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1232 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 1233 | }, 1234 | "evp_bytestokey": { 1235 | "version": "1.0.3", 1236 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 1237 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 1238 | "requires": { 1239 | "md5.js": "^1.3.4", 1240 | "safe-buffer": "^5.1.1" 1241 | } 1242 | }, 1243 | "extend": { 1244 | "version": "3.0.2", 1245 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1246 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1247 | }, 1248 | "faye-websocket": { 1249 | "version": "0.11.3", 1250 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", 1251 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", 1252 | "requires": { 1253 | "websocket-driver": ">=0.5.1" 1254 | } 1255 | }, 1256 | "fill-range": { 1257 | "version": "7.0.1", 1258 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1259 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1260 | "requires": { 1261 | "to-regex-range": "^5.0.1" 1262 | } 1263 | }, 1264 | "find-cache-dir": { 1265 | "version": "3.3.1", 1266 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", 1267 | "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", 1268 | "requires": { 1269 | "commondir": "^1.0.1", 1270 | "make-dir": "^3.0.2", 1271 | "pkg-dir": "^4.1.0" 1272 | } 1273 | }, 1274 | "find-up": { 1275 | "version": "4.1.0", 1276 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1277 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1278 | "requires": { 1279 | "locate-path": "^5.0.0", 1280 | "path-exists": "^4.0.0" 1281 | } 1282 | }, 1283 | "firebase": { 1284 | "version": "8.10.0", 1285 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-8.10.0.tgz", 1286 | "integrity": "sha512-GCABTbJdo88QgzX5OH/vsfKBWvTRbLUylGlYXtO7uYo1VErfGd2BWW9ATlJP5Gxx+ClDfyvVTvcs2rcNWn3uUA==", 1287 | "requires": { 1288 | "@firebase/analytics": "0.6.18", 1289 | "@firebase/app": "0.6.30", 1290 | "@firebase/app-check": "0.3.2", 1291 | "@firebase/app-types": "0.6.3", 1292 | "@firebase/auth": "0.16.8", 1293 | "@firebase/database": "0.11.0", 1294 | "@firebase/firestore": "2.4.0", 1295 | "@firebase/functions": "0.6.15", 1296 | "@firebase/installations": "0.4.32", 1297 | "@firebase/messaging": "0.8.0", 1298 | "@firebase/performance": "0.4.18", 1299 | "@firebase/polyfill": "0.3.36", 1300 | "@firebase/remote-config": "0.1.43", 1301 | "@firebase/storage": "0.7.0", 1302 | "@firebase/util": "1.3.0" 1303 | } 1304 | }, 1305 | "foreach": { 1306 | "version": "2.0.5", 1307 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 1308 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 1309 | }, 1310 | "fsevents": { 1311 | "version": "2.3.2", 1312 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1313 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1314 | "optional": true 1315 | }, 1316 | "function-bind": { 1317 | "version": "1.1.1", 1318 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1319 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1320 | }, 1321 | "get-caller-file": { 1322 | "version": "2.0.5", 1323 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1324 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 1325 | }, 1326 | "get-intrinsic": { 1327 | "version": "1.1.1", 1328 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 1329 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 1330 | "requires": { 1331 | "function-bind": "^1.1.1", 1332 | "has": "^1.0.3", 1333 | "has-symbols": "^1.0.1" 1334 | } 1335 | }, 1336 | "get-orientation": { 1337 | "version": "1.1.2", 1338 | "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz", 1339 | "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==", 1340 | "requires": { 1341 | "stream-parser": "^0.3.1" 1342 | } 1343 | }, 1344 | "get-symbol-description": { 1345 | "version": "1.0.0", 1346 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 1347 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 1348 | "requires": { 1349 | "call-bind": "^1.0.2", 1350 | "get-intrinsic": "^1.1.1" 1351 | } 1352 | }, 1353 | "glob-parent": { 1354 | "version": "5.1.2", 1355 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1356 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1357 | "requires": { 1358 | "is-glob": "^4.0.1" 1359 | } 1360 | }, 1361 | "glob-to-regexp": { 1362 | "version": "0.4.1", 1363 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 1364 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" 1365 | }, 1366 | "goober": { 1367 | "version": "2.0.28", 1368 | "resolved": "https://registry.npmjs.org/goober/-/goober-2.0.28.tgz", 1369 | "integrity": "sha512-chb/2a0PiCW0isKEfO2FWa++SON4hrUANY5G/evhkuBk1M4k3ehm3JilctICB5AiPYbRlE+b0qFGzfDJW7z3Jw==" 1370 | }, 1371 | "graceful-fs": { 1372 | "version": "4.2.8", 1373 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 1374 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" 1375 | }, 1376 | "has": { 1377 | "version": "1.0.3", 1378 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1379 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1380 | "requires": { 1381 | "function-bind": "^1.1.1" 1382 | } 1383 | }, 1384 | "has-bigints": { 1385 | "version": "1.0.1", 1386 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", 1387 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" 1388 | }, 1389 | "has-flag": { 1390 | "version": "3.0.0", 1391 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1392 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1393 | }, 1394 | "has-symbols": { 1395 | "version": "1.0.2", 1396 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 1397 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 1398 | }, 1399 | "has-tostringtag": { 1400 | "version": "1.0.0", 1401 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 1402 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 1403 | "requires": { 1404 | "has-symbols": "^1.0.2" 1405 | } 1406 | }, 1407 | "hash-base": { 1408 | "version": "3.1.0", 1409 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 1410 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 1411 | "requires": { 1412 | "inherits": "^2.0.4", 1413 | "readable-stream": "^3.6.0", 1414 | "safe-buffer": "^5.2.0" 1415 | } 1416 | }, 1417 | "hash.js": { 1418 | "version": "1.1.7", 1419 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 1420 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 1421 | "requires": { 1422 | "inherits": "^2.0.3", 1423 | "minimalistic-assert": "^1.0.1" 1424 | } 1425 | }, 1426 | "he": { 1427 | "version": "1.2.0", 1428 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1429 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 1430 | }, 1431 | "hmac-drbg": { 1432 | "version": "1.0.1", 1433 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1434 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1435 | "requires": { 1436 | "hash.js": "^1.0.3", 1437 | "minimalistic-assert": "^1.0.0", 1438 | "minimalistic-crypto-utils": "^1.0.1" 1439 | } 1440 | }, 1441 | "html-to-react": { 1442 | "version": "1.4.5", 1443 | "resolved": "https://registry.npmjs.org/html-to-react/-/html-to-react-1.4.5.tgz", 1444 | "integrity": "sha512-KONZUDFPg5OodWaQu2ymfkDmU0JA7zB1iPfvyHehTmMUZnk0DS7/TyCMTzsLH6b4BvxX15g88qZCXFhJWktsmA==", 1445 | "requires": { 1446 | "domhandler": "^3.3.0", 1447 | "htmlparser2": "^5.0", 1448 | "lodash.camelcase": "^4.3.0", 1449 | "ramda": "^0.27.1" 1450 | } 1451 | }, 1452 | "htmlparser2": { 1453 | "version": "5.0.1", 1454 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", 1455 | "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", 1456 | "requires": { 1457 | "domelementtype": "^2.0.1", 1458 | "domhandler": "^3.3.0", 1459 | "domutils": "^2.4.2", 1460 | "entities": "^2.0.0" 1461 | } 1462 | }, 1463 | "http-errors": { 1464 | "version": "1.7.3", 1465 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 1466 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 1467 | "requires": { 1468 | "depd": "~1.1.2", 1469 | "inherits": "2.0.4", 1470 | "setprototypeof": "1.1.1", 1471 | "statuses": ">= 1.5.0 < 2", 1472 | "toidentifier": "1.0.0" 1473 | } 1474 | }, 1475 | "http-parser-js": { 1476 | "version": "0.5.3", 1477 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", 1478 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" 1479 | }, 1480 | "https-browserify": { 1481 | "version": "1.0.0", 1482 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 1483 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" 1484 | }, 1485 | "iconv-lite": { 1486 | "version": "0.6.3", 1487 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 1488 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 1489 | "requires": { 1490 | "safer-buffer": ">= 2.1.2 < 3.0.0" 1491 | } 1492 | }, 1493 | "idb": { 1494 | "version": "3.0.2", 1495 | "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", 1496 | "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" 1497 | }, 1498 | "ieee754": { 1499 | "version": "1.2.1", 1500 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1501 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1502 | }, 1503 | "image-size": { 1504 | "version": "1.0.0", 1505 | "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", 1506 | "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", 1507 | "requires": { 1508 | "queue": "6.0.2" 1509 | } 1510 | }, 1511 | "inherits": { 1512 | "version": "2.0.4", 1513 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1514 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1515 | }, 1516 | "internal-slot": { 1517 | "version": "1.0.3", 1518 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1519 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1520 | "requires": { 1521 | "get-intrinsic": "^1.1.0", 1522 | "has": "^1.0.3", 1523 | "side-channel": "^1.0.4" 1524 | } 1525 | }, 1526 | "is-alphabetical": { 1527 | "version": "1.0.4", 1528 | "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", 1529 | "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" 1530 | }, 1531 | "is-alphanumerical": { 1532 | "version": "1.0.4", 1533 | "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", 1534 | "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", 1535 | "requires": { 1536 | "is-alphabetical": "^1.0.0", 1537 | "is-decimal": "^1.0.0" 1538 | } 1539 | }, 1540 | "is-arguments": { 1541 | "version": "1.1.1", 1542 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1543 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1544 | "requires": { 1545 | "call-bind": "^1.0.2", 1546 | "has-tostringtag": "^1.0.0" 1547 | } 1548 | }, 1549 | "is-bigint": { 1550 | "version": "1.0.4", 1551 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1552 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1553 | "requires": { 1554 | "has-bigints": "^1.0.1" 1555 | } 1556 | }, 1557 | "is-binary-path": { 1558 | "version": "2.1.0", 1559 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1560 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1561 | "requires": { 1562 | "binary-extensions": "^2.0.0" 1563 | } 1564 | }, 1565 | "is-boolean-object": { 1566 | "version": "1.1.2", 1567 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1568 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1569 | "requires": { 1570 | "call-bind": "^1.0.2", 1571 | "has-tostringtag": "^1.0.0" 1572 | } 1573 | }, 1574 | "is-callable": { 1575 | "version": "1.2.4", 1576 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 1577 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" 1578 | }, 1579 | "is-date-object": { 1580 | "version": "1.0.5", 1581 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1582 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1583 | "requires": { 1584 | "has-tostringtag": "^1.0.0" 1585 | } 1586 | }, 1587 | "is-decimal": { 1588 | "version": "1.0.4", 1589 | "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", 1590 | "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" 1591 | }, 1592 | "is-extglob": { 1593 | "version": "2.1.1", 1594 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1595 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1596 | }, 1597 | "is-fullwidth-code-point": { 1598 | "version": "3.0.0", 1599 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1600 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1601 | }, 1602 | "is-generator-function": { 1603 | "version": "1.0.10", 1604 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 1605 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 1606 | "requires": { 1607 | "has-tostringtag": "^1.0.0" 1608 | } 1609 | }, 1610 | "is-glob": { 1611 | "version": "4.0.3", 1612 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1613 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1614 | "requires": { 1615 | "is-extglob": "^2.1.1" 1616 | } 1617 | }, 1618 | "is-hexadecimal": { 1619 | "version": "1.0.4", 1620 | "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", 1621 | "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" 1622 | }, 1623 | "is-nan": { 1624 | "version": "1.3.2", 1625 | "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", 1626 | "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", 1627 | "requires": { 1628 | "call-bind": "^1.0.0", 1629 | "define-properties": "^1.1.3" 1630 | } 1631 | }, 1632 | "is-negative-zero": { 1633 | "version": "2.0.1", 1634 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", 1635 | "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" 1636 | }, 1637 | "is-number": { 1638 | "version": "7.0.0", 1639 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1640 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 1641 | }, 1642 | "is-number-object": { 1643 | "version": "1.0.6", 1644 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", 1645 | "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", 1646 | "requires": { 1647 | "has-tostringtag": "^1.0.0" 1648 | } 1649 | }, 1650 | "is-plain-obj": { 1651 | "version": "2.1.0", 1652 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1653 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 1654 | }, 1655 | "is-regex": { 1656 | "version": "1.1.4", 1657 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1658 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1659 | "requires": { 1660 | "call-bind": "^1.0.2", 1661 | "has-tostringtag": "^1.0.0" 1662 | } 1663 | }, 1664 | "is-shared-array-buffer": { 1665 | "version": "1.0.1", 1666 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", 1667 | "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" 1668 | }, 1669 | "is-string": { 1670 | "version": "1.0.7", 1671 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1672 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1673 | "requires": { 1674 | "has-tostringtag": "^1.0.0" 1675 | } 1676 | }, 1677 | "is-symbol": { 1678 | "version": "1.0.4", 1679 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1680 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1681 | "requires": { 1682 | "has-symbols": "^1.0.2" 1683 | } 1684 | }, 1685 | "is-typed-array": { 1686 | "version": "1.1.8", 1687 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", 1688 | "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", 1689 | "requires": { 1690 | "available-typed-arrays": "^1.0.5", 1691 | "call-bind": "^1.0.2", 1692 | "es-abstract": "^1.18.5", 1693 | "foreach": "^2.0.5", 1694 | "has-tostringtag": "^1.0.0" 1695 | } 1696 | }, 1697 | "is-weakref": { 1698 | "version": "1.0.1", 1699 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", 1700 | "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", 1701 | "requires": { 1702 | "call-bind": "^1.0.0" 1703 | } 1704 | }, 1705 | "jest-worker": { 1706 | "version": "27.0.0-next.5", 1707 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz", 1708 | "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==", 1709 | "requires": { 1710 | "@types/node": "*", 1711 | "merge-stream": "^2.0.0", 1712 | "supports-color": "^8.0.0" 1713 | }, 1714 | "dependencies": { 1715 | "has-flag": { 1716 | "version": "4.0.0", 1717 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1718 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1719 | }, 1720 | "supports-color": { 1721 | "version": "8.1.1", 1722 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1723 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1724 | "requires": { 1725 | "has-flag": "^4.0.0" 1726 | } 1727 | } 1728 | } 1729 | }, 1730 | "js-tokens": { 1731 | "version": "4.0.0", 1732 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1733 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1734 | }, 1735 | "json5": { 1736 | "version": "1.0.1", 1737 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1738 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1739 | "requires": { 1740 | "minimist": "^1.2.0" 1741 | } 1742 | }, 1743 | "loader-utils": { 1744 | "version": "1.2.3", 1745 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", 1746 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", 1747 | "requires": { 1748 | "big.js": "^5.2.2", 1749 | "emojis-list": "^2.0.0", 1750 | "json5": "^1.0.1" 1751 | } 1752 | }, 1753 | "locate-path": { 1754 | "version": "5.0.0", 1755 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1756 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1757 | "requires": { 1758 | "p-locate": "^4.1.0" 1759 | } 1760 | }, 1761 | "lodash.camelcase": { 1762 | "version": "4.3.0", 1763 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1764 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 1765 | }, 1766 | "lodash.debounce": { 1767 | "version": "4.0.8", 1768 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 1769 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" 1770 | }, 1771 | "lodash.kebabcase": { 1772 | "version": "4.1.1", 1773 | "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", 1774 | "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" 1775 | }, 1776 | "lodash.sortby": { 1777 | "version": "4.7.0", 1778 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1779 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 1780 | }, 1781 | "long": { 1782 | "version": "4.0.0", 1783 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 1784 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 1785 | }, 1786 | "loose-envify": { 1787 | "version": "1.4.0", 1788 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1789 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1790 | "requires": { 1791 | "js-tokens": "^3.0.0 || ^4.0.0" 1792 | } 1793 | }, 1794 | "make-dir": { 1795 | "version": "3.1.0", 1796 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1797 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1798 | "requires": { 1799 | "semver": "^6.0.0" 1800 | } 1801 | }, 1802 | "md5.js": { 1803 | "version": "1.3.5", 1804 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1805 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1806 | "requires": { 1807 | "hash-base": "^3.0.0", 1808 | "inherits": "^2.0.1", 1809 | "safe-buffer": "^5.1.2" 1810 | } 1811 | }, 1812 | "mdast-add-list-metadata": { 1813 | "version": "1.0.1", 1814 | "resolved": "https://registry.npmjs.org/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz", 1815 | "integrity": "sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==", 1816 | "requires": { 1817 | "unist-util-visit-parents": "1.1.2" 1818 | } 1819 | }, 1820 | "mdast-util-from-markdown": { 1821 | "version": "0.8.4", 1822 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz", 1823 | "integrity": "sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw==", 1824 | "requires": { 1825 | "@types/mdast": "^3.0.0", 1826 | "mdast-util-to-string": "^2.0.0", 1827 | "micromark": "~2.11.0", 1828 | "parse-entities": "^2.0.0", 1829 | "unist-util-stringify-position": "^2.0.0" 1830 | } 1831 | }, 1832 | "mdast-util-to-string": { 1833 | "version": "2.0.0", 1834 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", 1835 | "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" 1836 | }, 1837 | "merge-stream": { 1838 | "version": "2.0.0", 1839 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1840 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 1841 | }, 1842 | "micromark": { 1843 | "version": "2.11.2", 1844 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.2.tgz", 1845 | "integrity": "sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ==", 1846 | "requires": { 1847 | "debug": "^4.0.0", 1848 | "parse-entities": "^2.0.0" 1849 | } 1850 | }, 1851 | "miller-rabin": { 1852 | "version": "4.0.1", 1853 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1854 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1855 | "requires": { 1856 | "bn.js": "^4.0.0", 1857 | "brorand": "^1.0.1" 1858 | }, 1859 | "dependencies": { 1860 | "bn.js": { 1861 | "version": "4.12.0", 1862 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1863 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 1864 | } 1865 | } 1866 | }, 1867 | "minimalistic-assert": { 1868 | "version": "1.0.1", 1869 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1870 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" 1871 | }, 1872 | "minimalistic-crypto-utils": { 1873 | "version": "1.0.1", 1874 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1875 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" 1876 | }, 1877 | "minimist": { 1878 | "version": "1.2.5", 1879 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1880 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1881 | }, 1882 | "ms": { 1883 | "version": "2.1.2", 1884 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1885 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1886 | }, 1887 | "nanoid": { 1888 | "version": "3.1.30", 1889 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", 1890 | "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" 1891 | }, 1892 | "neo-async": { 1893 | "version": "2.6.2", 1894 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1895 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 1896 | }, 1897 | "next": { 1898 | "version": "12.0.1", 1899 | "resolved": "https://registry.npmjs.org/next/-/next-12.0.1.tgz", 1900 | "integrity": "sha512-4MNXAbD9+Tmtejg0TOKbaP52Cgu4mIn2ejKMLHWV0acxWGkkcE7QvdZwvg5pkg3fQBMrgucOxxtmw4D7yWaZvg==", 1901 | "requires": { 1902 | "@babel/runtime": "7.15.4", 1903 | "@hapi/accept": "5.0.2", 1904 | "@next/env": "12.0.1", 1905 | "@next/polyfill-module": "12.0.1", 1906 | "@next/react-dev-overlay": "12.0.1", 1907 | "@next/react-refresh-utils": "12.0.1", 1908 | "@next/swc-android-arm64": "12.0.1", 1909 | "@next/swc-darwin-arm64": "12.0.1", 1910 | "@next/swc-darwin-x64": "12.0.1", 1911 | "@next/swc-linux-arm-gnueabihf": "12.0.1", 1912 | "@next/swc-linux-arm64-gnu": "12.0.1", 1913 | "@next/swc-linux-arm64-musl": "12.0.1", 1914 | "@next/swc-linux-x64-gnu": "12.0.1", 1915 | "@next/swc-linux-x64-musl": "12.0.1", 1916 | "@next/swc-win32-arm64-msvc": "12.0.1", 1917 | "@next/swc-win32-ia32-msvc": "12.0.1", 1918 | "@next/swc-win32-x64-msvc": "12.0.1", 1919 | "@node-rs/helper": "1.2.1", 1920 | "acorn": "8.5.0", 1921 | "assert": "2.0.0", 1922 | "browserify-zlib": "0.2.0", 1923 | "browserslist": "4.16.6", 1924 | "buffer": "5.6.0", 1925 | "caniuse-lite": "^1.0.30001228", 1926 | "chalk": "2.4.2", 1927 | "chokidar": "3.5.1", 1928 | "constants-browserify": "1.0.0", 1929 | "crypto-browserify": "3.12.0", 1930 | "cssnano-simple": "3.0.0", 1931 | "domain-browser": "4.19.0", 1932 | "encoding": "0.1.13", 1933 | "etag": "1.8.1", 1934 | "events": "3.3.0", 1935 | "find-cache-dir": "3.3.1", 1936 | "get-orientation": "1.1.2", 1937 | "https-browserify": "1.0.0", 1938 | "image-size": "1.0.0", 1939 | "jest-worker": "27.0.0-next.5", 1940 | "node-fetch": "2.6.1", 1941 | "node-html-parser": "1.4.9", 1942 | "os-browserify": "0.3.0", 1943 | "p-limit": "3.1.0", 1944 | "path-browserify": "1.0.1", 1945 | "postcss": "8.2.15", 1946 | "process": "0.11.10", 1947 | "querystring-es3": "0.2.1", 1948 | "raw-body": "2.4.1", 1949 | "react-is": "17.0.2", 1950 | "react-refresh": "0.8.3", 1951 | "react-server-dom-webpack": "0.0.0-experimental-3c4c1c470-20211021", 1952 | "regenerator-runtime": "0.13.4", 1953 | "stream-browserify": "3.0.0", 1954 | "stream-http": "3.1.1", 1955 | "string_decoder": "1.3.0", 1956 | "styled-jsx": "5.0.0-beta.3", 1957 | "timers-browserify": "2.0.12", 1958 | "tty-browserify": "0.0.1", 1959 | "use-subscription": "1.5.1", 1960 | "util": "0.12.4", 1961 | "vm-browserify": "1.1.2", 1962 | "watchpack": "2.1.1", 1963 | "web-streams-polyfill": "3.0.3" 1964 | }, 1965 | "dependencies": { 1966 | "react-is": { 1967 | "version": "17.0.2", 1968 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1969 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" 1970 | } 1971 | } 1972 | }, 1973 | "node-fetch": { 1974 | "version": "2.6.1", 1975 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1976 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1977 | }, 1978 | "node-html-parser": { 1979 | "version": "1.4.9", 1980 | "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", 1981 | "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", 1982 | "requires": { 1983 | "he": "1.2.0" 1984 | } 1985 | }, 1986 | "node-releases": { 1987 | "version": "1.1.77", 1988 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", 1989 | "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" 1990 | }, 1991 | "normalize-path": { 1992 | "version": "3.0.0", 1993 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1994 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1995 | }, 1996 | "object-assign": { 1997 | "version": "4.1.1", 1998 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1999 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2000 | }, 2001 | "object-inspect": { 2002 | "version": "1.11.0", 2003 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", 2004 | "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" 2005 | }, 2006 | "object-is": { 2007 | "version": "1.1.5", 2008 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 2009 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 2010 | "requires": { 2011 | "call-bind": "^1.0.2", 2012 | "define-properties": "^1.1.3" 2013 | } 2014 | }, 2015 | "object-keys": { 2016 | "version": "1.1.1", 2017 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2018 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 2019 | }, 2020 | "object.assign": { 2021 | "version": "4.1.2", 2022 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 2023 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 2024 | "requires": { 2025 | "call-bind": "^1.0.0", 2026 | "define-properties": "^1.1.3", 2027 | "has-symbols": "^1.0.1", 2028 | "object-keys": "^1.1.1" 2029 | } 2030 | }, 2031 | "os-browserify": { 2032 | "version": "0.3.0", 2033 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 2034 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" 2035 | }, 2036 | "p-limit": { 2037 | "version": "3.1.0", 2038 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2039 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2040 | "requires": { 2041 | "yocto-queue": "^0.1.0" 2042 | } 2043 | }, 2044 | "p-locate": { 2045 | "version": "4.1.0", 2046 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2047 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2048 | "requires": { 2049 | "p-limit": "^2.2.0" 2050 | }, 2051 | "dependencies": { 2052 | "p-limit": { 2053 | "version": "2.3.0", 2054 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2055 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2056 | "requires": { 2057 | "p-try": "^2.0.0" 2058 | } 2059 | } 2060 | } 2061 | }, 2062 | "p-try": { 2063 | "version": "2.2.0", 2064 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2065 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 2066 | }, 2067 | "pako": { 2068 | "version": "1.0.11", 2069 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 2070 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 2071 | }, 2072 | "parse-asn1": { 2073 | "version": "5.1.6", 2074 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 2075 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 2076 | "requires": { 2077 | "asn1.js": "^5.2.0", 2078 | "browserify-aes": "^1.0.0", 2079 | "evp_bytestokey": "^1.0.0", 2080 | "pbkdf2": "^3.0.3", 2081 | "safe-buffer": "^5.1.1" 2082 | } 2083 | }, 2084 | "parse-entities": { 2085 | "version": "2.0.0", 2086 | "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", 2087 | "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", 2088 | "requires": { 2089 | "character-entities": "^1.0.0", 2090 | "character-entities-legacy": "^1.0.0", 2091 | "character-reference-invalid": "^1.0.0", 2092 | "is-alphanumerical": "^1.0.0", 2093 | "is-decimal": "^1.0.0", 2094 | "is-hexadecimal": "^1.0.0" 2095 | } 2096 | }, 2097 | "path-browserify": { 2098 | "version": "1.0.1", 2099 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 2100 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 2101 | }, 2102 | "path-exists": { 2103 | "version": "4.0.0", 2104 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2105 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 2106 | }, 2107 | "pbkdf2": { 2108 | "version": "3.1.2", 2109 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 2110 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 2111 | "requires": { 2112 | "create-hash": "^1.1.2", 2113 | "create-hmac": "^1.1.4", 2114 | "ripemd160": "^2.0.1", 2115 | "safe-buffer": "^5.0.1", 2116 | "sha.js": "^2.4.8" 2117 | } 2118 | }, 2119 | "picomatch": { 2120 | "version": "2.3.0", 2121 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 2122 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" 2123 | }, 2124 | "pkg-dir": { 2125 | "version": "4.2.0", 2126 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 2127 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 2128 | "requires": { 2129 | "find-up": "^4.0.0" 2130 | } 2131 | }, 2132 | "platform": { 2133 | "version": "1.3.6", 2134 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 2135 | "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" 2136 | }, 2137 | "postcss": { 2138 | "version": "8.2.15", 2139 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.15.tgz", 2140 | "integrity": "sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q==", 2141 | "requires": { 2142 | "colorette": "^1.2.2", 2143 | "nanoid": "^3.1.23", 2144 | "source-map": "^0.6.1" 2145 | }, 2146 | "dependencies": { 2147 | "source-map": { 2148 | "version": "0.6.1", 2149 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2150 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 2151 | } 2152 | } 2153 | }, 2154 | "process": { 2155 | "version": "0.11.10", 2156 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 2157 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 2158 | }, 2159 | "promise-polyfill": { 2160 | "version": "8.1.3", 2161 | "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", 2162 | "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" 2163 | }, 2164 | "prop-types": { 2165 | "version": "15.7.2", 2166 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 2167 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 2168 | "requires": { 2169 | "loose-envify": "^1.4.0", 2170 | "object-assign": "^4.1.1", 2171 | "react-is": "^16.8.1" 2172 | } 2173 | }, 2174 | "protobufjs": { 2175 | "version": "6.11.2", 2176 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", 2177 | "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", 2178 | "requires": { 2179 | "@protobufjs/aspromise": "^1.1.2", 2180 | "@protobufjs/base64": "^1.1.2", 2181 | "@protobufjs/codegen": "^2.0.4", 2182 | "@protobufjs/eventemitter": "^1.1.0", 2183 | "@protobufjs/fetch": "^1.1.0", 2184 | "@protobufjs/float": "^1.0.2", 2185 | "@protobufjs/inquire": "^1.1.0", 2186 | "@protobufjs/path": "^1.1.2", 2187 | "@protobufjs/pool": "^1.1.0", 2188 | "@protobufjs/utf8": "^1.1.0", 2189 | "@types/long": "^4.0.1", 2190 | "@types/node": ">=13.7.0", 2191 | "long": "^4.0.0" 2192 | } 2193 | }, 2194 | "public-encrypt": { 2195 | "version": "4.0.3", 2196 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 2197 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 2198 | "requires": { 2199 | "bn.js": "^4.1.0", 2200 | "browserify-rsa": "^4.0.0", 2201 | "create-hash": "^1.1.0", 2202 | "parse-asn1": "^5.0.0", 2203 | "randombytes": "^2.0.1", 2204 | "safe-buffer": "^5.1.2" 2205 | }, 2206 | "dependencies": { 2207 | "bn.js": { 2208 | "version": "4.12.0", 2209 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 2210 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" 2211 | } 2212 | } 2213 | }, 2214 | "punycode": { 2215 | "version": "2.1.1", 2216 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2217 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 2218 | }, 2219 | "querystring-es3": { 2220 | "version": "0.2.1", 2221 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 2222 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" 2223 | }, 2224 | "queue": { 2225 | "version": "6.0.2", 2226 | "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", 2227 | "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", 2228 | "requires": { 2229 | "inherits": "~2.0.3" 2230 | } 2231 | }, 2232 | "ramda": { 2233 | "version": "0.27.1", 2234 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", 2235 | "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==" 2236 | }, 2237 | "randombytes": { 2238 | "version": "2.1.0", 2239 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2240 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2241 | "requires": { 2242 | "safe-buffer": "^5.1.0" 2243 | } 2244 | }, 2245 | "randomfill": { 2246 | "version": "1.0.4", 2247 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 2248 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 2249 | "requires": { 2250 | "randombytes": "^2.0.5", 2251 | "safe-buffer": "^5.1.0" 2252 | } 2253 | }, 2254 | "raw-body": { 2255 | "version": "2.4.1", 2256 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 2257 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 2258 | "requires": { 2259 | "bytes": "3.1.0", 2260 | "http-errors": "1.7.3", 2261 | "iconv-lite": "0.4.24", 2262 | "unpipe": "1.0.0" 2263 | }, 2264 | "dependencies": { 2265 | "iconv-lite": { 2266 | "version": "0.4.24", 2267 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2268 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2269 | "requires": { 2270 | "safer-buffer": ">= 2.1.2 < 3" 2271 | } 2272 | } 2273 | } 2274 | }, 2275 | "react": { 2276 | "version": "17.0.1", 2277 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz", 2278 | "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==", 2279 | "requires": { 2280 | "loose-envify": "^1.1.0", 2281 | "object-assign": "^4.1.1" 2282 | } 2283 | }, 2284 | "react-dom": { 2285 | "version": "17.0.1", 2286 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz", 2287 | "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==", 2288 | "requires": { 2289 | "loose-envify": "^1.1.0", 2290 | "object-assign": "^4.1.1", 2291 | "scheduler": "^0.20.1" 2292 | } 2293 | }, 2294 | "react-firebase-hooks": { 2295 | "version": "2.2.0", 2296 | "resolved": "https://registry.npmjs.org/react-firebase-hooks/-/react-firebase-hooks-2.2.0.tgz", 2297 | "integrity": "sha512-bwBaCYa8M+bpTqD0masAPGDTzxiTkGbyxv363hyR+NeNH1HbezPll6G7aMIGl+7OOYRPzfdmpkk72zc3VgXfEw==" 2298 | }, 2299 | "react-hook-form": { 2300 | "version": "6.14.2", 2301 | "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-6.14.2.tgz", 2302 | "integrity": "sha512-GgDUuT3Yfhl1BOcMl862uAFbCixSomtm3CVlQQ1qVu9Tq5BN2uUIRUIXP8l2Gy99eLUrBqU9x4E7N+si9cnvaw==" 2303 | }, 2304 | "react-hot-toast": { 2305 | "version": "1.0.2", 2306 | "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-1.0.2.tgz", 2307 | "integrity": "sha512-wp89H0WA6EtiexAg5l3ys+WaZ3u0xM/FJWxl6YxR3hlquWhKvO9snBgTe4ATPEcgbS6pbc43RbuBINOkYOzA5A==", 2308 | "requires": { 2309 | "goober": "^2.0.15" 2310 | } 2311 | }, 2312 | "react-is": { 2313 | "version": "16.13.1", 2314 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 2315 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 2316 | }, 2317 | "react-markdown": { 2318 | "version": "5.0.3", 2319 | "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-5.0.3.tgz", 2320 | "integrity": "sha512-jDWOc1AvWn0WahpjW6NK64mtx6cwjM4iSsLHJPNBqoAgGOVoIdJMqaKX4++plhOtdd4JksdqzlDibgPx6B/M2w==", 2321 | "requires": { 2322 | "@types/mdast": "^3.0.3", 2323 | "@types/unist": "^2.0.3", 2324 | "html-to-react": "^1.3.4", 2325 | "mdast-add-list-metadata": "1.0.1", 2326 | "prop-types": "^15.7.2", 2327 | "react-is": "^16.8.6", 2328 | "remark-parse": "^9.0.0", 2329 | "unified": "^9.0.0", 2330 | "unist-util-visit": "^2.0.0", 2331 | "xtend": "^4.0.1" 2332 | } 2333 | }, 2334 | "react-refresh": { 2335 | "version": "0.8.3", 2336 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", 2337 | "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" 2338 | }, 2339 | "react-server-dom-webpack": { 2340 | "version": "0.0.0-experimental-3c4c1c470-20211021", 2341 | "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-0.0.0-experimental-3c4c1c470-20211021.tgz", 2342 | "integrity": "sha512-YyRlED5kR0C2aQ3IJ/8BR2TELt51RcDZhnUDKz+m/HU+Gb/qak0CZkG0A8Zxffom9VI6HFkUj1dRFZqm0Lh9Pg==", 2343 | "requires": { 2344 | "acorn": "^6.2.1", 2345 | "loose-envify": "^1.1.0", 2346 | "neo-async": "^2.6.1", 2347 | "object-assign": "^4.1.1" 2348 | }, 2349 | "dependencies": { 2350 | "acorn": { 2351 | "version": "6.4.2", 2352 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 2353 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" 2354 | } 2355 | } 2356 | }, 2357 | "readable-stream": { 2358 | "version": "3.6.0", 2359 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2360 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2361 | "requires": { 2362 | "inherits": "^2.0.3", 2363 | "string_decoder": "^1.1.1", 2364 | "util-deprecate": "^1.0.1" 2365 | } 2366 | }, 2367 | "readdirp": { 2368 | "version": "3.5.0", 2369 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 2370 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 2371 | "requires": { 2372 | "picomatch": "^2.2.1" 2373 | } 2374 | }, 2375 | "regenerator-runtime": { 2376 | "version": "0.13.4", 2377 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", 2378 | "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==" 2379 | }, 2380 | "remark-parse": { 2381 | "version": "9.0.0", 2382 | "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", 2383 | "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", 2384 | "requires": { 2385 | "mdast-util-from-markdown": "^0.8.0" 2386 | } 2387 | }, 2388 | "require-directory": { 2389 | "version": "2.1.1", 2390 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2391 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2392 | }, 2393 | "ripemd160": { 2394 | "version": "2.0.2", 2395 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 2396 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 2397 | "requires": { 2398 | "hash-base": "^3.0.0", 2399 | "inherits": "^2.0.1" 2400 | } 2401 | }, 2402 | "safe-buffer": { 2403 | "version": "5.2.1", 2404 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2405 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2406 | }, 2407 | "safer-buffer": { 2408 | "version": "2.1.2", 2409 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2410 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2411 | }, 2412 | "scheduler": { 2413 | "version": "0.20.1", 2414 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.1.tgz", 2415 | "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==", 2416 | "requires": { 2417 | "loose-envify": "^1.1.0", 2418 | "object-assign": "^4.1.1" 2419 | } 2420 | }, 2421 | "semver": { 2422 | "version": "6.3.0", 2423 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2424 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 2425 | }, 2426 | "setimmediate": { 2427 | "version": "1.0.5", 2428 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 2429 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 2430 | }, 2431 | "setprototypeof": { 2432 | "version": "1.1.1", 2433 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 2434 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 2435 | }, 2436 | "sha.js": { 2437 | "version": "2.4.11", 2438 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 2439 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 2440 | "requires": { 2441 | "inherits": "^2.0.1", 2442 | "safe-buffer": "^5.0.1" 2443 | } 2444 | }, 2445 | "shell-quote": { 2446 | "version": "1.7.2", 2447 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", 2448 | "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" 2449 | }, 2450 | "side-channel": { 2451 | "version": "1.0.4", 2452 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2453 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2454 | "requires": { 2455 | "call-bind": "^1.0.0", 2456 | "get-intrinsic": "^1.0.2", 2457 | "object-inspect": "^1.9.0" 2458 | } 2459 | }, 2460 | "source-map": { 2461 | "version": "0.8.0-beta.0", 2462 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 2463 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 2464 | "requires": { 2465 | "whatwg-url": "^7.0.0" 2466 | } 2467 | }, 2468 | "stacktrace-parser": { 2469 | "version": "0.1.10", 2470 | "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", 2471 | "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", 2472 | "requires": { 2473 | "type-fest": "^0.7.1" 2474 | } 2475 | }, 2476 | "statuses": { 2477 | "version": "1.5.0", 2478 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2479 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2480 | }, 2481 | "stream-browserify": { 2482 | "version": "3.0.0", 2483 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", 2484 | "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", 2485 | "requires": { 2486 | "inherits": "~2.0.4", 2487 | "readable-stream": "^3.5.0" 2488 | } 2489 | }, 2490 | "stream-http": { 2491 | "version": "3.1.1", 2492 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", 2493 | "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", 2494 | "requires": { 2495 | "builtin-status-codes": "^3.0.0", 2496 | "inherits": "^2.0.4", 2497 | "readable-stream": "^3.6.0", 2498 | "xtend": "^4.0.2" 2499 | } 2500 | }, 2501 | "stream-parser": { 2502 | "version": "0.3.1", 2503 | "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", 2504 | "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", 2505 | "requires": { 2506 | "debug": "2" 2507 | }, 2508 | "dependencies": { 2509 | "debug": { 2510 | "version": "2.6.9", 2511 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2512 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2513 | "requires": { 2514 | "ms": "2.0.0" 2515 | } 2516 | }, 2517 | "ms": { 2518 | "version": "2.0.0", 2519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2520 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2521 | } 2522 | } 2523 | }, 2524 | "string-hash": { 2525 | "version": "1.1.3", 2526 | "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", 2527 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" 2528 | }, 2529 | "string-width": { 2530 | "version": "4.2.2", 2531 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 2532 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 2533 | "requires": { 2534 | "emoji-regex": "^8.0.0", 2535 | "is-fullwidth-code-point": "^3.0.0", 2536 | "strip-ansi": "^6.0.0" 2537 | } 2538 | }, 2539 | "string.prototype.trimend": { 2540 | "version": "1.0.4", 2541 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", 2542 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", 2543 | "requires": { 2544 | "call-bind": "^1.0.2", 2545 | "define-properties": "^1.1.3" 2546 | } 2547 | }, 2548 | "string.prototype.trimstart": { 2549 | "version": "1.0.4", 2550 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", 2551 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", 2552 | "requires": { 2553 | "call-bind": "^1.0.2", 2554 | "define-properties": "^1.1.3" 2555 | } 2556 | }, 2557 | "string_decoder": { 2558 | "version": "1.3.0", 2559 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2560 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2561 | "requires": { 2562 | "safe-buffer": "~5.2.0" 2563 | } 2564 | }, 2565 | "strip-ansi": { 2566 | "version": "6.0.0", 2567 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2568 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 2569 | "requires": { 2570 | "ansi-regex": "^5.0.0" 2571 | } 2572 | }, 2573 | "styled-jsx": { 2574 | "version": "5.0.0-beta.3", 2575 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.0-beta.3.tgz", 2576 | "integrity": "sha512-HtDDGSFPvmjHIqWf9n8Oo54tAoY/DTplvlyOH2+YOtD80Sp31Ap8ffSmxhgk5EkUoJ7xepdXMGT650mSffWuRA==", 2577 | "requires": { 2578 | "@babel/plugin-syntax-jsx": "7.14.5", 2579 | "@babel/types": "7.15.0", 2580 | "convert-source-map": "1.7.0", 2581 | "loader-utils": "1.2.3", 2582 | "source-map": "0.7.3", 2583 | "string-hash": "1.1.3", 2584 | "stylis": "3.5.4", 2585 | "stylis-rule-sheet": "0.0.10" 2586 | }, 2587 | "dependencies": { 2588 | "source-map": { 2589 | "version": "0.7.3", 2590 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 2591 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" 2592 | } 2593 | } 2594 | }, 2595 | "stylis": { 2596 | "version": "3.5.4", 2597 | "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", 2598 | "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" 2599 | }, 2600 | "stylis-rule-sheet": { 2601 | "version": "0.0.10", 2602 | "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", 2603 | "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" 2604 | }, 2605 | "supports-color": { 2606 | "version": "5.5.0", 2607 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2608 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2609 | "requires": { 2610 | "has-flag": "^3.0.0" 2611 | } 2612 | }, 2613 | "timers-browserify": { 2614 | "version": "2.0.12", 2615 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", 2616 | "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", 2617 | "requires": { 2618 | "setimmediate": "^1.0.4" 2619 | } 2620 | }, 2621 | "to-fast-properties": { 2622 | "version": "2.0.0", 2623 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2624 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 2625 | }, 2626 | "to-regex-range": { 2627 | "version": "5.0.1", 2628 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2629 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2630 | "requires": { 2631 | "is-number": "^7.0.0" 2632 | } 2633 | }, 2634 | "toidentifier": { 2635 | "version": "1.0.0", 2636 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 2637 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 2638 | }, 2639 | "tr46": { 2640 | "version": "1.0.1", 2641 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 2642 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 2643 | "requires": { 2644 | "punycode": "^2.1.0" 2645 | } 2646 | }, 2647 | "trough": { 2648 | "version": "1.0.5", 2649 | "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", 2650 | "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" 2651 | }, 2652 | "tslib": { 2653 | "version": "2.3.1", 2654 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 2655 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 2656 | }, 2657 | "tty-browserify": { 2658 | "version": "0.0.1", 2659 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 2660 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" 2661 | }, 2662 | "type-fest": { 2663 | "version": "0.7.1", 2664 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", 2665 | "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" 2666 | }, 2667 | "unbox-primitive": { 2668 | "version": "1.0.1", 2669 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", 2670 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", 2671 | "requires": { 2672 | "function-bind": "^1.1.1", 2673 | "has-bigints": "^1.0.1", 2674 | "has-symbols": "^1.0.2", 2675 | "which-boxed-primitive": "^1.0.2" 2676 | } 2677 | }, 2678 | "unified": { 2679 | "version": "9.2.0", 2680 | "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", 2681 | "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", 2682 | "requires": { 2683 | "bail": "^1.0.0", 2684 | "extend": "^3.0.0", 2685 | "is-buffer": "^2.0.0", 2686 | "is-plain-obj": "^2.0.0", 2687 | "trough": "^1.0.0", 2688 | "vfile": "^4.0.0" 2689 | }, 2690 | "dependencies": { 2691 | "is-buffer": { 2692 | "version": "2.0.5", 2693 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 2694 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 2695 | } 2696 | } 2697 | }, 2698 | "unist-util-is": { 2699 | "version": "4.0.4", 2700 | "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz", 2701 | "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==" 2702 | }, 2703 | "unist-util-stringify-position": { 2704 | "version": "2.0.3", 2705 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", 2706 | "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", 2707 | "requires": { 2708 | "@types/unist": "^2.0.2" 2709 | } 2710 | }, 2711 | "unist-util-visit": { 2712 | "version": "2.0.3", 2713 | "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", 2714 | "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", 2715 | "requires": { 2716 | "@types/unist": "^2.0.0", 2717 | "unist-util-is": "^4.0.0", 2718 | "unist-util-visit-parents": "^3.0.0" 2719 | }, 2720 | "dependencies": { 2721 | "unist-util-visit-parents": { 2722 | "version": "3.1.1", 2723 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", 2724 | "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", 2725 | "requires": { 2726 | "@types/unist": "^2.0.0", 2727 | "unist-util-is": "^4.0.0" 2728 | } 2729 | } 2730 | } 2731 | }, 2732 | "unist-util-visit-parents": { 2733 | "version": "1.1.2", 2734 | "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz", 2735 | "integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==" 2736 | }, 2737 | "unpipe": { 2738 | "version": "1.0.0", 2739 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2740 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2741 | }, 2742 | "use-subscription": { 2743 | "version": "1.5.1", 2744 | "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", 2745 | "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", 2746 | "requires": { 2747 | "object-assign": "^4.1.1" 2748 | } 2749 | }, 2750 | "util": { 2751 | "version": "0.12.4", 2752 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", 2753 | "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", 2754 | "requires": { 2755 | "inherits": "^2.0.3", 2756 | "is-arguments": "^1.0.4", 2757 | "is-generator-function": "^1.0.7", 2758 | "is-typed-array": "^1.1.3", 2759 | "safe-buffer": "^5.1.2", 2760 | "which-typed-array": "^1.1.2" 2761 | } 2762 | }, 2763 | "util-deprecate": { 2764 | "version": "1.0.2", 2765 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2766 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2767 | }, 2768 | "vfile": { 2769 | "version": "4.2.1", 2770 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", 2771 | "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", 2772 | "requires": { 2773 | "@types/unist": "^2.0.0", 2774 | "is-buffer": "^2.0.0", 2775 | "unist-util-stringify-position": "^2.0.0", 2776 | "vfile-message": "^2.0.0" 2777 | }, 2778 | "dependencies": { 2779 | "is-buffer": { 2780 | "version": "2.0.5", 2781 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 2782 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 2783 | } 2784 | } 2785 | }, 2786 | "vfile-message": { 2787 | "version": "2.0.4", 2788 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", 2789 | "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", 2790 | "requires": { 2791 | "@types/unist": "^2.0.0", 2792 | "unist-util-stringify-position": "^2.0.0" 2793 | } 2794 | }, 2795 | "vm-browserify": { 2796 | "version": "1.1.2", 2797 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 2798 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" 2799 | }, 2800 | "watchpack": { 2801 | "version": "2.1.1", 2802 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", 2803 | "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", 2804 | "requires": { 2805 | "glob-to-regexp": "^0.4.1", 2806 | "graceful-fs": "^4.1.2" 2807 | } 2808 | }, 2809 | "web-streams-polyfill": { 2810 | "version": "3.0.3", 2811 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.0.3.tgz", 2812 | "integrity": "sha512-d2H/t0eqRNM4w2WvmTdoeIvzAUSpK7JmATB8Nr2lb7nQ9BTIJVjbQ/TRFVEh2gUH1HwclPdoPtfMoFfetXaZnA==" 2813 | }, 2814 | "webidl-conversions": { 2815 | "version": "4.0.2", 2816 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 2817 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 2818 | }, 2819 | "websocket-driver": { 2820 | "version": "0.7.4", 2821 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 2822 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 2823 | "requires": { 2824 | "http-parser-js": ">=0.5.1", 2825 | "safe-buffer": ">=5.1.0", 2826 | "websocket-extensions": ">=0.1.1" 2827 | } 2828 | }, 2829 | "websocket-extensions": { 2830 | "version": "0.1.4", 2831 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 2832 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" 2833 | }, 2834 | "whatwg-fetch": { 2835 | "version": "2.0.4", 2836 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", 2837 | "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" 2838 | }, 2839 | "whatwg-url": { 2840 | "version": "7.1.0", 2841 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 2842 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 2843 | "requires": { 2844 | "lodash.sortby": "^4.7.0", 2845 | "tr46": "^1.0.1", 2846 | "webidl-conversions": "^4.0.2" 2847 | } 2848 | }, 2849 | "which-boxed-primitive": { 2850 | "version": "1.0.2", 2851 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2852 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2853 | "requires": { 2854 | "is-bigint": "^1.0.1", 2855 | "is-boolean-object": "^1.1.0", 2856 | "is-number-object": "^1.0.4", 2857 | "is-string": "^1.0.5", 2858 | "is-symbol": "^1.0.3" 2859 | } 2860 | }, 2861 | "which-typed-array": { 2862 | "version": "1.1.7", 2863 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", 2864 | "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", 2865 | "requires": { 2866 | "available-typed-arrays": "^1.0.5", 2867 | "call-bind": "^1.0.2", 2868 | "es-abstract": "^1.18.5", 2869 | "foreach": "^2.0.5", 2870 | "has-tostringtag": "^1.0.0", 2871 | "is-typed-array": "^1.1.7" 2872 | } 2873 | }, 2874 | "wrap-ansi": { 2875 | "version": "7.0.0", 2876 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2877 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2878 | "requires": { 2879 | "ansi-styles": "^4.0.0", 2880 | "string-width": "^4.1.0", 2881 | "strip-ansi": "^6.0.0" 2882 | } 2883 | }, 2884 | "xmlhttprequest": { 2885 | "version": "1.8.0", 2886 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 2887 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 2888 | }, 2889 | "xtend": { 2890 | "version": "4.0.2", 2891 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2892 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 2893 | }, 2894 | "y18n": { 2895 | "version": "5.0.8", 2896 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2897 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 2898 | }, 2899 | "yargs": { 2900 | "version": "16.2.0", 2901 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2902 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2903 | "requires": { 2904 | "cliui": "^7.0.2", 2905 | "escalade": "^3.1.1", 2906 | "get-caller-file": "^2.0.5", 2907 | "require-directory": "^2.1.1", 2908 | "string-width": "^4.2.0", 2909 | "y18n": "^5.0.5", 2910 | "yargs-parser": "^20.2.2" 2911 | } 2912 | }, 2913 | "yargs-parser": { 2914 | "version": "20.2.9", 2915 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 2916 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 2917 | }, 2918 | "yocto-queue": { 2919 | "version": "0.1.0", 2920 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2921 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 2922 | } 2923 | } 2924 | } 2925 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nextfire", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "export": "next export" 10 | }, 11 | "dependencies": { 12 | "firebase": "^8.2.1", 13 | "lodash.debounce": "^4.0.8", 14 | "lodash.kebabcase": "^4.1.1", 15 | "next": "12.0.1", 16 | "react": "17.0.1", 17 | "react-dom": "17.0.1", 18 | "react-firebase-hooks": "^2.2.0", 19 | "react-hook-form": "^6.14.2", 20 | "react-hot-toast": "^1.0.2", 21 | "react-markdown": "^5.0.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pages/404.js: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | export default function Custom404() { 4 | return ( 5 |
6 |

404 - That page does not seem to exist...

7 | 14 | 15 | 16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /pages/[username]/[slug].js: -------------------------------------------------------------------------------- 1 | import styles from '@styles/Post.module.css'; 2 | import PostContent from '@components/PostContent'; 3 | import HeartButton from '@components/HeartButton'; 4 | import AuthCheck from '@components/AuthCheck'; 5 | import Metatags from '@components/Metatags'; 6 | import { UserContext } from '@lib/context'; 7 | import { firestore, getUserWithUsername, postToJSON } from '../../lib/firebase'; 8 | 9 | import Link from 'next/link'; 10 | import { useDocumentData } from 'react-firebase-hooks/firestore'; 11 | import { useContext } from 'react'; 12 | 13 | export async function getStaticProps({ params }) { 14 | const { username, slug } = params; 15 | const userDoc = await getUserWithUsername(username); 16 | 17 | let post; 18 | let path; 19 | 20 | if (userDoc) { 21 | const postRef = userDoc.ref.collection('posts').doc(slug); 22 | post = postToJSON(await postRef.get()); 23 | 24 | path = postRef.path; 25 | } 26 | 27 | return { 28 | props: { post, path }, 29 | revalidate: 100, 30 | }; 31 | } 32 | 33 | export async function getStaticPaths() { 34 | // Improve my using Admin SDK to select empty docs 35 | const snapshot = await firestore.collectionGroup('posts').get(); 36 | 37 | const paths = snapshot.docs.map((doc) => { 38 | const { slug, username } = doc.data(); 39 | return { 40 | params: { username, slug }, 41 | }; 42 | }); 43 | 44 | return { 45 | // must be in this format: 46 | // paths: [ 47 | // { params: { username, slug }} 48 | // ], 49 | paths, 50 | fallback: 'blocking', 51 | }; 52 | } 53 | 54 | export default function Post(props) { 55 | const postRef = firestore.doc(props.path); 56 | const [realtimePost] = useDocumentData(postRef); 57 | 58 | const post = realtimePost || props.post; 59 | 60 | const { user: currentUser } = useContext(UserContext); 61 | 62 | return ( 63 |
64 | 65 | 66 |
67 | 68 |
69 | 70 | 91 |
92 | ); 93 | } 94 | -------------------------------------------------------------------------------- /pages/[username]/index.js: -------------------------------------------------------------------------------- 1 | import { getUserWithUsername, postToJSON } from '@lib/firebase'; 2 | import UserProfile from '@components/UserProfile'; 3 | import Metatags from '@components/Metatags'; 4 | import PostFeed from '@components/PostFeed'; 5 | 6 | 7 | export async function getServerSideProps({ query }) { 8 | const { username } = query; 9 | 10 | const userDoc = await getUserWithUsername(username); 11 | 12 | // If no user, short circuit to 404 page 13 | if (!userDoc) { 14 | return { 15 | notFound: true, 16 | }; 17 | } 18 | 19 | // JSON serializable data 20 | let user = null; 21 | let posts = null; 22 | 23 | if (userDoc) { 24 | user = userDoc.data(); 25 | const postsQuery = userDoc.ref 26 | .collection('posts') 27 | .where('published', '==', true) 28 | .orderBy('createdAt', 'desc') 29 | .limit(5); 30 | posts = (await postsQuery.get()).docs.map(postToJSON); 31 | } 32 | 33 | return { 34 | props: { user, posts }, // will be passed to the page component as props 35 | }; 36 | } 37 | 38 | export default function UserProfilePage({ user, posts }) { 39 | return ( 40 |
41 | 42 | 43 | 44 |
45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import '@styles/globals.css'; 2 | import Navbar from '@components/Navbar'; 3 | import { UserContext } from '@lib/context'; 4 | import { useUserData } from '@lib/hooks'; 5 | import { Toaster } from 'react-hot-toast'; 6 | 7 | function MyApp({ Component, pageProps }) { 8 | const userData = useUserData(); 9 | 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | 19 | export default MyApp; 20 | -------------------------------------------------------------------------------- /pages/admin/[slug].js: -------------------------------------------------------------------------------- 1 | import styles from '@styles/Admin.module.css'; 2 | import AuthCheck from '@components/AuthCheck'; 3 | import { firestore, auth, serverTimestamp } from '@lib/firebase'; 4 | import ImageUploader from '@components/ImageUploader'; 5 | 6 | import { useState } from 'react'; 7 | import { useRouter } from 'next/router'; 8 | 9 | import { useDocumentDataOnce } from 'react-firebase-hooks/firestore'; 10 | import { useForm } from 'react-hook-form'; 11 | import ReactMarkdown from 'react-markdown'; 12 | import Link from 'next/link'; 13 | import toast from 'react-hot-toast'; 14 | 15 | export default function AdminPostEdit(props) { 16 | return ( 17 | 18 | 19 | 20 | ); 21 | } 22 | 23 | function PostManager() { 24 | const [preview, setPreview] = useState(false); 25 | 26 | const router = useRouter(); 27 | const { slug } = router.query; 28 | 29 | const postRef = firestore.collection('users').doc(auth.currentUser.uid).collection('posts').doc(slug); 30 | const [post] = useDocumentDataOnce(postRef); 31 | 32 | return ( 33 |
34 | {post && ( 35 | <> 36 |
37 |

{post.title}

38 |

ID: {post.slug}

39 | 40 | 41 |
42 | 43 | 51 | 52 | )} 53 |
54 | ); 55 | } 56 | 57 | function PostForm({ defaultValues, postRef, preview }) { 58 | const { register, errors, handleSubmit, formState, reset, watch } = useForm({ defaultValues, mode: 'onChange' }); 59 | 60 | const { isValid, isDirty } = formState; 61 | 62 | const updatePost = async ({ content, published }) => { 63 | await postRef.update({ 64 | content, 65 | published, 66 | updatedAt: serverTimestamp(), 67 | }); 68 | 69 | reset({ content, published }); 70 | 71 | toast.success('Post updated successfully!'); 72 | }; 73 | 74 | return ( 75 |
76 | {preview && ( 77 |
78 | {watch('content')} 79 |
80 | )} 81 | 82 |
83 | 84 | 85 | 93 | 94 | {errors.content &&

{errors.content.message}

} 95 | 96 |
97 | 98 | 99 |
100 | 101 | 104 |
105 |
106 | ); 107 | } 108 | 109 | function DeletePostButton({ postRef }) { 110 | const router = useRouter(); 111 | 112 | const deletePost = async () => { 113 | const doIt = confirm('are you sure!'); 114 | if (doIt) { 115 | await postRef.delete(); 116 | router.push('/admin'); 117 | toast('post annihilated ', { icon: '🗑️' }); 118 | } 119 | }; 120 | 121 | return ( 122 | 125 | ); 126 | } 127 | -------------------------------------------------------------------------------- /pages/admin/index.js: -------------------------------------------------------------------------------- 1 | import styles from '@styles/Admin.module.css'; 2 | import AuthCheck from '@components/AuthCheck'; 3 | import PostFeed from '@components/PostFeed'; 4 | import { UserContext } from '@lib/context'; 5 | import { firestore, auth, serverTimestamp } from '@lib/firebase'; 6 | 7 | import { useContext, useState } from 'react'; 8 | import { useRouter } from 'next/router'; 9 | 10 | import { useCollection } from 'react-firebase-hooks/firestore'; 11 | import kebabCase from 'lodash.kebabcase'; 12 | import toast from 'react-hot-toast'; 13 | 14 | export default function AdminPostsPage(props) { 15 | return ( 16 |
17 | 18 | 19 | 20 | 21 |
22 | ); 23 | } 24 | 25 | function PostList() { 26 | const ref = firestore.collection('users').doc(auth.currentUser.uid).collection('posts'); 27 | const query = ref.orderBy('createdAt'); 28 | const [querySnapshot] = useCollection(query); 29 | 30 | const posts = querySnapshot?.docs.map((doc) => doc.data()); 31 | 32 | return ( 33 | <> 34 |

Manage your Posts

35 | 36 | 37 | ); 38 | } 39 | 40 | function CreateNewPost() { 41 | const router = useRouter(); 42 | const { username } = useContext(UserContext); 43 | const [title, setTitle] = useState(''); 44 | 45 | // Ensure slug is URL safe 46 | const slug = encodeURI(kebabCase(title)); 47 | 48 | // Validate length 49 | const isValid = title.length > 3 && title.length < 100; 50 | 51 | // Create a new post in firestore 52 | const createPost = async (e) => { 53 | e.preventDefault(); 54 | const uid = auth.currentUser.uid; 55 | const ref = firestore.collection('users').doc(uid).collection('posts').doc(slug); 56 | 57 | // Tip: give all fields a default value here 58 | const data = { 59 | title, 60 | slug, 61 | uid, 62 | username, 63 | published: false, 64 | content: '# hello world!', 65 | createdAt: serverTimestamp(), 66 | updatedAt: serverTimestamp(), 67 | heartCount: 0, 68 | }; 69 | 70 | await ref.set(data); 71 | 72 | toast.success('Post created!'); 73 | 74 | // Imperative navigation after doc is set 75 | router.push(`/admin/${slug}`); 76 | }; 77 | 78 | return ( 79 |
80 | setTitle(e.target.value)} 83 | placeholder="My Awesome Article!" 84 | className={styles.input} 85 | /> 86 |

87 | Slug: {slug} 88 |

89 | 92 |
93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /pages/api/[username].js: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | export default async (req, res) => { 3 | 4 | res.statusCode = 200 5 | res.json({ }) 6 | } 7 | -------------------------------------------------------------------------------- /pages/enter.js: -------------------------------------------------------------------------------- 1 | import { auth, firestore, googleAuthProvider } from '@lib/firebase'; 2 | import { UserContext } from '@lib/context'; 3 | import Metatags from '@components/Metatags'; 4 | 5 | import { useEffect, useState, useCallback, useContext } from 'react'; 6 | import debounce from 'lodash.debounce'; 7 | 8 | export default function Enter(props) { 9 | const { user, username } = useContext(UserContext); 10 | 11 | // 1. user signed out 12 | // 2. user signed in, but missing username 13 | // 3. user signed in, has username 14 | return ( 15 |
16 | 17 | {user ? !username ? : : } 18 |
19 | ); 20 | } 21 | 22 | // Sign in with Google button 23 | function SignInButton() { 24 | const signInWithGoogle = async () => { 25 | await auth.signInWithPopup(googleAuthProvider); 26 | }; 27 | 28 | return ( 29 | <> 30 | 33 | 36 | 37 | ); 38 | } 39 | 40 | // Sign out button 41 | function SignOutButton() { 42 | return ; 43 | } 44 | 45 | // Username form 46 | function UsernameForm() { 47 | const [formValue, setFormValue] = useState(''); 48 | const [isValid, setIsValid] = useState(false); 49 | const [loading, setLoading] = useState(false); 50 | 51 | const { user, username } = useContext(UserContext); 52 | 53 | const onSubmit = async (e) => { 54 | e.preventDefault(); 55 | 56 | // Create refs for both documents 57 | const userDoc = firestore.doc(`users/${user.uid}`); 58 | const usernameDoc = firestore.doc(`usernames/${formValue}`); 59 | 60 | // Commit both docs together as a batch write. 61 | const batch = firestore.batch(); 62 | batch.set(userDoc, { username: formValue, photoURL: user.photoURL, displayName: user.displayName }); 63 | batch.set(usernameDoc, { uid: user.uid }); 64 | 65 | await batch.commit(); 66 | }; 67 | 68 | const onChange = (e) => { 69 | // Force form value typed in form to match correct format 70 | const val = e.target.value.toLowerCase(); 71 | const re = /^(?=[a-zA-Z0-9._]{3,15}$)(?!.*[_.]{2})[^_.].*[^_.]$/; 72 | 73 | // Only set form value if length is < 3 OR it passes regex 74 | if (val.length < 3) { 75 | setFormValue(val); 76 | setLoading(false); 77 | setIsValid(false); 78 | } 79 | 80 | if (re.test(val)) { 81 | setFormValue(val); 82 | setLoading(true); 83 | setIsValid(false); 84 | } 85 | }; 86 | 87 | // 88 | 89 | useEffect(() => { 90 | checkUsername(formValue); 91 | }, [formValue]); 92 | 93 | // Hit the database for username match after each debounced change 94 | // useCallback is required for debounce to work 95 | const checkUsername = useCallback( 96 | debounce(async (username) => { 97 | if (username.length >= 3) { 98 | const ref = firestore.doc(`usernames/${username}`); 99 | const { exists } = await ref.get(); 100 | console.log('Firestore read executed!'); 101 | setIsValid(!exists); 102 | setLoading(false); 103 | } 104 | }, 500), 105 | [] 106 | ); 107 | 108 | return ( 109 | !username && ( 110 |
111 |

Choose Username

112 |
113 | 114 | 115 | 118 | 119 |

Debug State

120 |
121 | Username: {formValue} 122 |
123 | Loading: {loading.toString()} 124 |
125 | Username Valid: {isValid.toString()} 126 |
127 | 128 |
129 | ) 130 | ); 131 | } 132 | 133 | function UsernameMessage({ username, isValid, loading }) { 134 | if (loading) { 135 | return

Checking...

; 136 | } else if (isValid) { 137 | return

{username} is available!

; 138 | } else if (username && !isValid) { 139 | return

That username is taken!

; 140 | } else { 141 | return

; 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import PostFeed from '@components/PostFeed'; 2 | import Metatags from '@components/Metatags'; 3 | import Loader from '@components/Loader'; 4 | import { firestore, fromMillis, postToJSON } from '@lib/firebase'; 5 | 6 | import { useState } from 'react'; 7 | 8 | // Max post to query per page 9 | const LIMIT = 10; 10 | 11 | export async function getServerSideProps(context) { 12 | const postsQuery = firestore 13 | .collectionGroup('posts') 14 | .where('published', '==', true) 15 | .orderBy('createdAt', 'desc') 16 | .limit(LIMIT); 17 | 18 | const posts = (await postsQuery.get()).docs.map(postToJSON); 19 | 20 | return { 21 | props: { posts }, // will be passed to the page component as props 22 | }; 23 | } 24 | 25 | export default function Home(props) { 26 | const [posts, setPosts] = useState(props.posts); 27 | const [loading, setLoading] = useState(false); 28 | 29 | const [postsEnd, setPostsEnd] = useState(false); 30 | 31 | // Get next page in pagination query 32 | const getMorePosts = async () => { 33 | setLoading(true); 34 | const last = posts[posts.length - 1]; 35 | 36 | const cursor = typeof last.createdAt === 'number' ? fromMillis(last.createdAt) : last.createdAt; 37 | 38 | const query = firestore 39 | .collectionGroup('posts') 40 | .where('published', '==', true) 41 | .orderBy('createdAt', 'desc') 42 | .startAfter(cursor) 43 | .limit(LIMIT); 44 | 45 | const newPosts = (await query.get()).docs.map((doc) => doc.data()); 46 | 47 | setPosts(posts.concat(newPosts)); 48 | setLoading(false); 49 | 50 | if (newPosts.length < LIMIT) { 51 | setPostsEnd(true); 52 | } 53 | }; 54 | 55 | return ( 56 |
57 | 58 | 59 |
60 |

💡 Next.js + Firebase - The Full Course

61 |

Welcome! This app is built with Next.js and Firebase and is loosely inspired by Dev.to.

62 |

Sign up for an 👨‍🎤 account, ✍️ write posts, then 💞 heart content created by other users. All public content is server-rendered and search-engine optimized.

63 |
64 | 65 | 66 | 67 | {!loading && !postsEnd && } 68 | 69 | 70 | 71 | {postsEnd && 'You have reached the end!'} 72 |
73 | ); 74 | } 75 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/favicon.ico -------------------------------------------------------------------------------- /public/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/google.png -------------------------------------------------------------------------------- /public/hacker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fireship-io/next-firebase-course/5a6baa6c9ca86dc8020abaad78123256f21dafbb/public/hacker.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /styles/Admin.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100vh; 3 | display: flex; 4 | } 5 | 6 | .container section { 7 | width: 60vw; 8 | margin-right: 1rem; 9 | } 10 | 11 | .container aside { 12 | display: flex; 13 | flex-direction: column; 14 | width: 20%; 15 | min-width: 250px; 16 | min-height: 200px; 17 | text-align: center; 18 | position: sticky; 19 | top: 80px; 20 | height: 0; 21 | } 22 | 23 | .hidden { 24 | display: none; 25 | } 26 | 27 | .controls { 28 | display: flex; 29 | flex-direction: column; 30 | } 31 | 32 | .controls textarea { 33 | height: 60vh; 34 | border: none; 35 | outline: none; 36 | padding: 0.5rem; 37 | font-size: 1.25rem; 38 | } 39 | 40 | .input { 41 | outline: none; 42 | border: none; 43 | font-size: 2.5rem; 44 | width: 100%; 45 | padding: 5px 10px; 46 | } 47 | 48 | .checkbox { 49 | display: inline; 50 | width: auto; 51 | } 52 | 53 | @media only screen and (max-width: 768px) { 54 | .container { 55 | flex-direction: column; 56 | } 57 | 58 | .container section { 59 | width: 100%; 60 | } 61 | 62 | .container aside { 63 | width: 100%; 64 | position: relative; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /styles/Post.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | min-height: 100vh; 3 | display: flex; 4 | } 5 | 6 | .container section { 7 | width: 80%; 8 | margin-right: 1rem; 9 | } 10 | 11 | .container aside { 12 | align-items: center; 13 | display: flex; 14 | flex-direction: column; 15 | width: 20%; 16 | min-width: 250px; 17 | text-align: center; 18 | position: sticky; 19 | top: 80px; 20 | height: 0; 21 | min-height: 300px; 22 | } 23 | 24 | 25 | @media only screen and (max-width: 768px) { 26 | .container { 27 | flex-direction: column; 28 | } 29 | 30 | .container section { 31 | width: 100%; 32 | } 33 | 34 | .container aside { 35 | width: 100%; 36 | position: relative; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,400;0,700;1,400&display=swap'); 2 | 3 | :root { 4 | --color-bg: #eef0f1; 5 | --color-text: #08090a; 6 | --color-blue: #3b49df; 7 | --color-red: #df3b3b; 8 | --color-green: #3bdf72; 9 | --color-gray: #b5bdc4; 10 | } 11 | html, 12 | body { 13 | padding: 0; 14 | margin: 0; 15 | font-family: 'Noto Sans', sans-serif; 16 | background-color: var(--color-bg); 17 | color: var(--color-text); 18 | margin-top: 50px; 19 | } 20 | 21 | 22 | 23 | main { 24 | padding: 1rem 10vw; 25 | } 26 | 27 | h1 { font-size: 2rem; } 28 | h2 { font-size: 1.5rem; } 29 | h2 { font-size: 1.25rem; } 30 | 31 | a { 32 | color: inherit; 33 | text-decoration: none; 34 | cursor: pointer; 35 | } 36 | 37 | * { 38 | box-sizing: border-box; 39 | } 40 | 41 | img {max-width: 100%;} 42 | 43 | input { 44 | display: inline-block; 45 | outline: none; 46 | border: none; 47 | font-size: 1.5rem; 48 | width: 100%; 49 | padding: 5px 10px; 50 | } 51 | 52 | fieldset { 53 | border: none; 54 | padding: 1rem 0; 55 | font-size: 1.25rem; 56 | } 57 | 58 | code { 59 | overflow-x: scroll; 60 | } 61 | 62 | /* Navbar */ 63 | 64 | .navbar { 65 | height: 70px; 66 | width: 100%; 67 | background: white; 68 | color: var(--colors-text); 69 | position: fixed; 70 | top: 0; 71 | padding: 0 10vw; 72 | font-weight: bold; 73 | border-bottom: 1px solid var(--color-gray); 74 | z-index: 99; 75 | } 76 | 77 | .navbar ul { 78 | list-style-type: none; 79 | margin: 0; 80 | padding: 0; 81 | display: flex; 82 | align-items: center; 83 | justify-content: space-between; 84 | height: 100%; 85 | } 86 | 87 | .navbar img { 88 | border-radius: 50%; 89 | width: 50px; 90 | height: 50px; 91 | cursor: pointer; 92 | } 93 | 94 | .navbar li { 95 | border-radius: 50%; 96 | 97 | } 98 | 99 | /* Buttons */ 100 | 101 | .btn, button { 102 | background-color: var(--color-gray); 103 | border: none; 104 | color: var(--color-text); 105 | padding: 1rem 2rem; 106 | display: flex; 107 | align-items: center; 108 | text-align: center; 109 | justify-content: center; 110 | text-decoration: none; 111 | font-family: 'Noto Sans', sans-serif; 112 | font-weight: bold; 113 | border-radius: 0.25rem; 114 | cursor: pointer; 115 | margin: 0.5rem 1rem 0.5rem 0; 116 | } 117 | 118 | @media only screen and (max-width: 768px) { 119 | button { 120 | padding: 0.5rem 1rem; 121 | font-size: 0.8rem; 122 | } 123 | } 124 | 125 | 126 | button:hover { 127 | filter: brightness(90%); 128 | } 129 | 130 | button:disabled, 131 | button[disabled]{ 132 | filter: brightness(80%); 133 | cursor: not-allowed; 134 | } 135 | 136 | button.btn-blue { 137 | background-color: var(--color-blue); 138 | color: white; 139 | } 140 | 141 | button.btn-red { 142 | background-color: var(--color-red); 143 | color: white; 144 | } 145 | 146 | button.btn-green { 147 | background-color: var(--color-green); 148 | color: white; 149 | } 150 | 151 | button.btn-google { 152 | background-color: white; 153 | color: var(--color-text); 154 | } 155 | 156 | .btn-google img { 157 | width: 30px; 158 | margin-right: 10px; 159 | } 160 | 161 | button.btn-logo { 162 | background-color: var(--color-text); 163 | color: white; 164 | text-transform: uppercase; 165 | font-size: 1.5rem; 166 | padding: 0.5rem 1rem; 167 | } 168 | 169 | /* Cards */ 170 | 171 | .card { 172 | padding: 2rem; 173 | margin: 1rem 0; 174 | background-color: white; 175 | border: 1px solid var(--color-gray); 176 | border-radius: 8px; 177 | } 178 | 179 | .card footer { 180 | display: flex; 181 | } 182 | 183 | .card-img-center { 184 | width:20%; 185 | display:block; 186 | margin:auto; 187 | border-radius: 50%; 188 | max-width: 150px; 189 | } 190 | 191 | .card-info { 192 | color: white; 193 | background: var(--color-blue); 194 | } 195 | 196 | /* Loader */ 197 | 198 | .loader { 199 | border: 10px solid var(--color-bg); 200 | border-top: 10px solid var(--color-blue); 201 | border-radius: 50%; 202 | width: 50px; 203 | height: 50px; 204 | animation: spin 2s linear infinite; 205 | } 206 | 207 | @keyframes spin { 208 | 0% { transform: rotate(0deg); } 209 | 100% { transform: rotate(360deg); } 210 | } 211 | 212 | /* File uploads */ 213 | 214 | input[type="file"] { 215 | display: none; 216 | } 217 | 218 | .upload-snippet { 219 | width: 75%; 220 | margin-left: auto; 221 | background: white; 222 | padding: 5px; 223 | margin: 5px 0; 224 | } 225 | /* Utilities */ 226 | 227 | .push-left { 228 | margin-left: auto; 229 | } 230 | 231 | .text-sm { 232 | font-size: 0.85rem; 233 | } 234 | 235 | .text-danger { 236 | font-weight: bold; 237 | color: var(--color-red); 238 | } 239 | 240 | .text-success { 241 | font-weight: bold; 242 | color: var(--color-green); 243 | } 244 | 245 | .text-info { 246 | font-weight: bold; 247 | color: var(--color-blue); 248 | } 249 | 250 | .box { 251 | display: flex; 252 | justify-content: space-between; 253 | } 254 | 255 | .box-center { 256 | display: flex; 257 | flex-direction: column; 258 | align-content: center; 259 | text-align: center; 260 | } 261 | 262 | .hidden { display: none; } --------------------------------------------------------------------------------