diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..30ced78 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,27 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/enatega-multivendor-admin" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "npm" # See documentation for possible values + directory: "/enatega-multivendor-app" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "npm" # See documentation for possible values + directory: "/enatega-multivendor-restaurant" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "npm" # See documentation for possible values + directory: "/enatega-multivendor-rider" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "npm" # See documentation for possible values + directory: "/enatega-multivendor-web" # Location of package manifests + schedule: + interval: "weekly" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d30c8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.expo +.DS_Store \ No newline at end of file diff --git a/LICENSE b/LICENSE index a6192e0..2a183f2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Martha E. Grimaldi +Copyright (c) 2023 Ninjas Code Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 8d66a76..ceb7660 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,236 @@ -# online-food-ordering-system-in-php-with-source-code -An online food ordering system in PHP with source code is a fully customizable food delivery application, an all-in-one solution for managing orders and deliveries. Check out our product page for more information. +
+ + + + + + + + + + + +
+ + +
+

Enatega Multi Vendor Food Delivery System

+ The food delivery and order management system for the future. +
+
+
+ + +
+ + [![Static Badge](https://img.shields.io/badge/License-MIT-red)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/blob/main/LICENSE) + [![Stars](https://img.shields.io/github/stars/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution.svg)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/stargazers) + [![Forks](https://img.shields.io/github/forks/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution.svg)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/network/members) + ![GitHub release (latest by date)](https://img.shields.io/github/v/release/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution) + [![GitHub contributors](https://img.shields.io/github/contributors/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/graphs/contributors) + [![Open Pull Requests](https://img.shields.io/github/issues-pr-raw/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution.svg)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/pulls) + [![Activity](https://img.shields.io/github/last-commit/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution.svg)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/commits/main) + [![YouTube Channel](https://img.shields.io/badge/Watch_us-Youtube-red)](https://www.youtube.com/@ninjascode509) + [![Company Website](https://img.shields.io/badge/Visit_us-Website-blue)](https://enatega.com) + [![Closed Issues](https://img.shields.io/github/issues-closed/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution?color=success)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/issues?q=is%3Aissue+is%3Aclosed) +[![Closed Pull Requests](https://img.shields.io/badge/Closed%20Pull%20Requests-View%20on%20GitHub-blue.svg)](https://github.com/Ninjas-Code-official/Enatega-Multivendor-Food-Delivery-Solution/pulls?q=is%3Apr+is%3Aclosed) + + + +
+ +
+ + [![Static Badge](https://img.shields.io/badge/facebook-blue?logo=facebook&logoColor=Blue&color=%23fbfbfb)](https://www.facebook.com/enatega) + [![Static Badge](https://img.shields.io/badge/Instagram-blue?logo=instagram&logoColor=D815BE&color=%23fcfcfc)](https://www.instagram.com/enatega.nb/) + [![Static Badge](https://img.shields.io/badge/Twitter-blue?logo=Twitter&logoColor=blue&color=%23fcfcfc)](https://twitter.com/EnategaA) + [![Static Badge](https://img.shields.io/badge/LinkedIn-blue?logo=LinkedIn&logoColor=darkblue&color=%23fcfcfc)](https://www.linkedin.com/company/14583783/) + +
+ +
+ + + Demo video + + +
+ + + +The Enatega Multi vendor food delivery system is perfect for customers looking to deploy a readymade and easy to use food ordering platform for their own food delivery and logistics business. Just like foodpanda and ubereats, our food delivery system can incorporate multiple restaurants as well as restaurants that operate in multiple locations. With access to the admin panel and separate applications for customers and riders, you can use this solution to create your own online food ordering and order/delivery management system instantaneously. + +Our solution is open source but the backend and API are proprietary, and can be obtained via paid license. + + +
+ +## :fast_forward: Quick Links + +- [:book: What is included](#heading-1) +- [:rocket: Features](#heading-2) +- [:wrench: Setup](#heading-3) +- [:gear: Prerequisites](#heading-4) +- [:computer: Technologies](#heading-5) +- [:camera: Screenshots](#heading-6) +- [:triangular_ruler: High Level Architecture](#heading-7) +- [:page_with_curl: Documentation](#heading-8) +- [:movie_camera: Demo Videos](#heading-14) +- [:video_game: Demos](#heading-9) +- [:busts_in_silhouette: Contributors](#heading-10) +- [:warning: Disclaimer](#heading-12) +- [:email: Contact Us](#heading-13) + + +
+ +## :question: What is included: + +Our food delivery system also comes with the following: + +- Enatega Multi vendor Customer App +- Enatega Multi vendor Rider App +- Enatega Multi vendor Restaurant App +- Customer Food Ordering Website +- Admin Web Dashboard +- Application ProgramInterface Server +- Analytics Dashboard with Expo Amplitude +- Error crash reporting with Sentry + +## :fire: Features: + +- Authentication using Google, Apple, and Facebook +- Different sections feature for promoting restaurants +- Push notifications and Emails to Users for account creation and order status changes +- Real-time tracking of Rider and chat with Rider option +- Email and Phone number verification +- Location-based restaurants shown on Map and Home Screen +- Multi-Language and different themes support +- Rating and Review features for order +- Details of restaurants include ratings and reviews, opening and closing timings, delivery timings, restaurant menu and items, restaurant location, minimum order +- Payment Integration for both PayPal and Stripe +- Previous order history and adding favorite restaurants +- Adding address with Google Places suggestions and Maps integration +- Analytics and Error reporting with Amplitude and Sentry +- Options to add different variations of food items and adding notes to restaurant + Pick up and delivery option with different timings + +## :repeat_one: Setup: + +As we’ve mentioned above, the solution includes five separate modules. To setup these modules, follow the steps below: + +To run the module, you need to have nodejs installed on your machine. Once nodejs is installed, go to the directory and enter the following commands + +The required credentials and keys have been set already. You can setup your own keys and credentials + +The version of nodejs should be between 14.0 to 16.0 + + +[![Guide Badge](https://img.shields.io/badge/Do_with_guided_tutorial-blue?style=for-the-badge&logo=book-reader)](https://enatega.com/multi-vendor-doc/) + + +## :information_source: Prerequisites: + +App Ids for Mobile App in app.json + +- Facebook Scheme +- Facebook App Id +- Facebook Display Name +- iOS Client Id Google +- Android Id Google +- Amplitude Api Key +- server url + +Set credentials in API in file helpers/config.js and helpers/credentials.js + +- Email User Name +- Password For Email +- Mongo User +- Mongo Password +- Mongo DB Name +- Reset Password Link +- Admin User name +- Admin Password +- User Id +- Name + +Set credentials in Admin Dashboard in file src/index.js + +- Firebase Api Key +- Auth Domain +- Database Url +- Project Id +- Storage Buck +- Messaging Sender Id +- App Id + +NOTE: Email provider has been only been tested for gmail accounts + +## :hammer_and_wrench: Technologies: +| Expo | React-Navigation | Apollo GraphQL | ReactJS | NodeJS | MongoDB | Firebase | +|:-------:|:------------:|:--------------:|:-------:|:------:|:-------:|:--------:| +| Enatega Logos| Enatega Logos| Enatega Logos| Enatega Logos | Enatega Logos | Enatega Logos | Enatega Logos | + +|React Native | React Router | GraphQL | ExpressJS | React Strap | Amplitude | +|:------------:|:------------:|:-------:|:---------:|:-----------:|:---------:| +|Enatega Logos | Enatega Logos |Enatega Logos | Enatega Logos |Enatega Logos | Enatega Logos | + +## :framed_picture: Screenshots: + +| Rider App | +| :----------------------: | +| ![](./assets/rider-app.png) | + +| Restaurant APP | +| :----------------------------: | +| ![](./assets/restuarant-app-1-scaled.webp) | + +| Customer App | +| :-----------------------: | +| ![](./assets/Customer-app.png) | + +| Customer Web | +| :-----------------------: | +| ![](./assets/Web-app-scaled.webp) | + +| Dashboard | +| :-----------------------: | +| ![](./assets/dasboard-scaled.webp) | + +## :wrench: High Level Architecture: + +![](./assets/high-level.png) + + + +## :book: Documentation + +Find the link for the complete documentation of the Enatega Multi Vendor Solution [here](https://enatega.com/multivendor-documentation/). + +## :tv: Demo Videos: +| Admin Dashboard Demo | Mobile App Demo | +| :---------------------------: | :----------------------------: | +| Video| Video + +## :iphone: Demos: + +| Customer App | Rider App | Restaurant App | Customer Web | Admin Dashboard | +| :---------------------------: | :----------------------------: | :----------------------------:|:----------------------------:|:----------------------------:| +| Enatega Logos| Enatega Logos| Enatega Logos| Enatega Logos | Enatega Logos | +| Android Logo iOS Logo |Android Logo iOS Logo |Android Logo iOS Logo | + +## :people_holding_hands: Contributors: +
+
+ + + +
+ +## :warning: Disclaimer: + +The frontend source code for our solution is completely open source. However, the API and backend is proprietary and can be accessed via a paid license. For further information, contact us on the channels provided below. + +## :mailbox_with_mail: Contact Us: + +[Check out the Product Page and Pricing and more for Enatega Multivendor Food Delivery Solution](https://enatega.com/?utm_source=github&utm_medium=referral&utm_campaign=github_guide&utm_id=12345678) diff --git a/assets/Customer-app.png b/assets/Customer-app.png new file mode 100644 index 0000000..db61879 Binary files /dev/null and b/assets/Customer-app.png differ diff --git a/assets/LOGOS-FOR-ENATGEA-res.png b/assets/LOGOS-FOR-ENATGEA-res.png new file mode 100644 index 0000000..76628cb Binary files /dev/null and b/assets/LOGOS-FOR-ENATGEA-res.png differ diff --git a/assets/React-strap.png b/assets/React-strap.png new file mode 100644 index 0000000..4a66883 Binary files /dev/null and b/assets/React-strap.png differ diff --git a/assets/Untitled-1-1.png b/assets/Untitled-1-1.png new file mode 100644 index 0000000..2f6fb2f Binary files /dev/null and b/assets/Untitled-1-1.png differ diff --git a/assets/Web-app-scaled.webp b/assets/Web-app-scaled.webp new file mode 100644 index 0000000..f4081da Binary files /dev/null and b/assets/Web-app-scaled.webp differ diff --git a/assets/admin1.png b/assets/admin1.png new file mode 100644 index 0000000..6417630 Binary files /dev/null and b/assets/admin1.png differ diff --git a/assets/admin2.png b/assets/admin2.png new file mode 100644 index 0000000..601d696 Binary files /dev/null and b/assets/admin2.png differ diff --git a/assets/admin3.png b/assets/admin3.png new file mode 100644 index 0000000..bb87659 Binary files /dev/null and b/assets/admin3.png differ diff --git a/assets/amplitude.png b/assets/amplitude.png new file mode 100644 index 0000000..0e53285 Binary files /dev/null and b/assets/amplitude.png differ diff --git a/assets/android_518705.png b/assets/android_518705.png new file mode 100644 index 0000000..ed16bcd Binary files /dev/null and b/assets/android_518705.png differ diff --git a/assets/apollo.png b/assets/apollo.png new file mode 100644 index 0000000..c36eac5 Binary files /dev/null and b/assets/apollo.png differ diff --git a/assets/architecture.png b/assets/architecture.png new file mode 100644 index 0000000..49af186 Binary files /dev/null and b/assets/architecture.png differ diff --git a/assets/customer1.jpeg b/assets/customer1.jpeg new file mode 100644 index 0000000..3438f81 Binary files /dev/null and b/assets/customer1.jpeg differ diff --git a/assets/customer2.jpeg b/assets/customer2.jpeg new file mode 100644 index 0000000..5799f00 Binary files /dev/null and b/assets/customer2.jpeg differ diff --git a/assets/customer3.jpeg b/assets/customer3.jpeg new file mode 100644 index 0000000..e8d6c16 Binary files /dev/null and b/assets/customer3.jpeg differ diff --git a/assets/customerWeb1.png b/assets/customerWeb1.png new file mode 100644 index 0000000..9184045 Binary files /dev/null and b/assets/customerWeb1.png differ diff --git a/assets/customerWeb2.png b/assets/customerWeb2.png new file mode 100644 index 0000000..f68ff94 Binary files /dev/null and b/assets/customerWeb2.png differ diff --git a/assets/customerWeb3.png b/assets/customerWeb3.png new file mode 100644 index 0000000..bc6aba8 Binary files /dev/null and b/assets/customerWeb3.png differ diff --git a/assets/dasboard-scaled.webp b/assets/dasboard-scaled.webp new file mode 100644 index 0000000..e51d143 Binary files /dev/null and b/assets/dasboard-scaled.webp differ diff --git a/assets/expoicon.png b/assets/expoicon.png new file mode 100644 index 0000000..dcb25cc Binary files /dev/null and b/assets/expoicon.png differ diff --git a/assets/express-js.png b/assets/express-js.png new file mode 100644 index 0000000..a172b0a Binary files /dev/null and b/assets/express-js.png differ diff --git a/assets/final.green.final.1.jpg b/assets/final.green.final.1.jpg new file mode 100644 index 0000000..57b57d4 Binary files /dev/null and b/assets/final.green.final.1.jpg differ diff --git a/assets/firebase.png b/assets/firebase.png new file mode 100644 index 0000000..16ac9a9 Binary files /dev/null and b/assets/firebase.png differ diff --git a/assets/graphQl-1.png b/assets/graphQl-1.png new file mode 100644 index 0000000..0eae042 Binary files /dev/null and b/assets/graphQl-1.png differ diff --git a/assets/high-level.png b/assets/high-level.png new file mode 100644 index 0000000..e5233c6 Binary files /dev/null and b/assets/high-level.png differ diff --git a/assets/logooo.png b/assets/logooo.png new file mode 100644 index 0000000..be13166 Binary files /dev/null and b/assets/logooo.png differ diff --git a/assets/mongoDB.png b/assets/mongoDB.png new file mode 100644 index 0000000..55a350b Binary files /dev/null and b/assets/mongoDB.png differ diff --git a/assets/node-js.png b/assets/node-js.png new file mode 100644 index 0000000..6e8209d Binary files /dev/null and b/assets/node-js.png differ diff --git a/assets/react-js.png b/assets/react-js.png new file mode 100644 index 0000000..e5254cd Binary files /dev/null and b/assets/react-js.png differ diff --git a/assets/react-native.png b/assets/react-native.png new file mode 100644 index 0000000..0b2eb03 Binary files /dev/null and b/assets/react-native.png differ diff --git a/assets/react-navigation.png b/assets/react-navigation.png new file mode 100644 index 0000000..8170cf2 Binary files /dev/null and b/assets/react-navigation.png differ diff --git a/assets/react-router-svgrepo-com.png b/assets/react-router-svgrepo-com.png new file mode 100644 index 0000000..6e9b448 Binary files /dev/null and b/assets/react-router-svgrepo-com.png differ diff --git a/assets/restaurant1.png b/assets/restaurant1.png new file mode 100644 index 0000000..ef17fd1 Binary files /dev/null and b/assets/restaurant1.png differ diff --git a/assets/restaurant2.jpeg b/assets/restaurant2.jpeg new file mode 100644 index 0000000..8787f1c Binary files /dev/null and b/assets/restaurant2.jpeg differ diff --git a/assets/restaurant3.jpeg b/assets/restaurant3.jpeg new file mode 100644 index 0000000..7e69a6c Binary files /dev/null and b/assets/restaurant3.jpeg differ diff --git a/assets/restuarant-app-1-scaled.webp b/assets/restuarant-app-1-scaled.webp new file mode 100644 index 0000000..7d9de32 Binary files /dev/null and b/assets/restuarant-app-1-scaled.webp differ diff --git a/assets/rider-app.png b/assets/rider-app.png new file mode 100644 index 0000000..abb15c3 Binary files /dev/null and b/assets/rider-app.png differ diff --git a/assets/rider1.jpeg b/assets/rider1.jpeg new file mode 100644 index 0000000..78a1990 Binary files /dev/null and b/assets/rider1.jpeg differ diff --git a/assets/rider2.jpeg b/assets/rider2.jpeg new file mode 100644 index 0000000..212d0a9 Binary files /dev/null and b/assets/rider2.jpeg differ diff --git a/assets/rider3.jpeg b/assets/rider3.jpeg new file mode 100644 index 0000000..e9b55f1 Binary files /dev/null and b/assets/rider3.jpeg differ diff --git a/assets/social_10096939.png b/assets/social_10096939.png new file mode 100644 index 0000000..668b620 Binary files /dev/null and b/assets/social_10096939.png differ diff --git a/assets/thumbnail.png b/assets/thumbnail.png new file mode 100644 index 0000000..35cbbde Binary files /dev/null and b/assets/thumbnail.png differ diff --git a/assets/worldwide.png b/assets/worldwide.png new file mode 100644 index 0000000..92bd431 Binary files /dev/null and b/assets/worldwide.png differ diff --git a/contributing/contributing.md b/contributing/contributing.md new file mode 100644 index 0000000..2cff018 --- /dev/null +++ b/contributing/contributing.md @@ -0,0 +1,17 @@ +### Contributing to Enatega Multi-Vendor Solution + +Welcome to Enatega Multi-Vendor Solution! We're excited you're here and want to contribute. + +### Getting Started + +If you would like to become an active contributor please read this document in its entireity. This will help you get started and answer any questions you may have. + +### How can I help? + +There are many ways you can help contribute to Enatega Restaurant Solution. Here are a few ideas: + +- Developers can make contribution to the code +- Designers can make contribution to the design +- Writers can make contribution to the documentation +- Testers can make contribution to the testing +- Translators can make contribution to the translation diff --git a/enatega-multivendor-admin/.eslintignore b/enatega-multivendor-admin/.eslintignore new file mode 100644 index 0000000..56630b3 --- /dev/null +++ b/enatega-multivendor-admin/.eslintignore @@ -0,0 +1,4 @@ +src/assets/* +public/* +build/* +server/* \ No newline at end of file diff --git a/enatega-multivendor-admin/.eslintrc.json b/enatega-multivendor-admin/.eslintrc.json new file mode 100644 index 0000000..2b9748d --- /dev/null +++ b/enatega-multivendor-admin/.eslintrc.json @@ -0,0 +1,27 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": [ + "plugin:react/recommended" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 10, + "sourceType": "module" + }, + "plugins": [ + "react" + ], + "rules": { + "space-before-function-paren": ["error", "never"], + "react/prop-types": 0 + } +} diff --git a/enatega-multivendor-admin/.gitignore b/enatega-multivendor-admin/.gitignore new file mode 100644 index 0000000..99ec874 --- /dev/null +++ b/enatega-multivendor-admin/.gitignore @@ -0,0 +1,3 @@ +node_modules +/build +.env \ No newline at end of file diff --git a/enatega-multivendor-admin/.prettierignore b/enatega-multivendor-admin/.prettierignore new file mode 100644 index 0000000..b3eb4bd --- /dev/null +++ b/enatega-multivendor-admin/.prettierignore @@ -0,0 +1,3 @@ +src/assets/* +public/* +build/* \ No newline at end of file diff --git a/enatega-multivendor-admin/.prettierrc.js b/enatega-multivendor-admin/.prettierrc.js new file mode 100644 index 0000000..2fc75e2 --- /dev/null +++ b/enatega-multivendor-admin/.prettierrc.js @@ -0,0 +1 @@ +module.exports = 'prettier-config-standard' diff --git a/enatega-multivendor-admin/LICENSE b/enatega-multivendor-admin/LICENSE new file mode 100644 index 0000000..038a2d4 --- /dev/null +++ b/enatega-multivendor-admin/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Creative Tim + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/enatega-multivendor-admin/package-lock.json b/enatega-multivendor-admin/package-lock.json new file mode 100644 index 0000000..7e1fed4 --- /dev/null +++ b/enatega-multivendor-admin/package-lock.json @@ -0,0 +1,26812 @@ +{ + "name": "enatega-multivendor", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "enatega-multivendor", + "version": "2.0.0", + "dependencies": { + "@apollo/client": "^3.5.8", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@material-ui/core": "^4.12.4", + "@material-ui/lab": "^4.0.0-alpha.61", + "@mui/icons-material": "^5.8.3", + "@mui/material": "^5.8.3", + "@mui/styles": "^5.8.3", + "@react-google-maps/api": "^2.0.0", + "@sentry/react": "^6.16.1", + "@sentry/tracing": "^6.16.1", + "@tawk.to/tawk-messenger-react": "^1.0.0", + "@wojtekmaj/react-timerange-picker": "^3.0.0", + "apollo-boost": "^0.4.9", + "chart.js": "^3.6.0", + "env-cmd": "^10.1.0", + "firebase": "^9.4.0", + "graphql": "^15.0.0", + "husky": "^8.0.3", + "i18next": "^17.0.0", + "moment": "2.24.0", + "node-sass": "^8.0.0", + "nouislider": "13.1.1", + "react": "^17.0.0", + "react-chartjs-2": "^4.0.0", + "react-data-table-component": "^6.9.3", + "react-datetime": "2.16.3", + "react-dom": "^17.0.0", + "react-i18next": "^10.10.0", + "react-loader-spinner": "^4.0.0", + "react-notifications": "^1.7.4", + "react-router-dom": "5.1.2", + "react-scripts": "^4.0.0", + "source-map-explorer": "^2.5.2", + "styled-components": "^5.1.1", + "subscriptions-transport-ws": "^0.11.0", + "validate.js": "^0.12.0" + }, + "devDependencies": { + "@types/googlemaps": "3.30.18", + "@types/markerclustererplus": "2.1.33", + "@types/react": "^17.0.0", + "husky": "^4.2.5", + "lint-staged": "^10.2.7", + "prettier": "2.0.5", + "prettier-config-standard": "^1.0.1", + "typescript": "3.3.3333" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apollo/client": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.9.5.tgz", + "integrity": "sha512-7y+c8MTPU+hhTwvcGVtMMGIgWduzrvG1mz5yJMRyqYbheBkkky3Lki6ADWVSBXG1lZoOtPYvB2zDgVfKb2HSsw==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/caches": "^1.0.0", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", + "graphql-tag": "^2.12.6", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.18.0", + "prop-types": "^15.7.2", + "rehackt": "0.0.5", + "response-iterator": "^0.2.6", + "symbol-observable": "^4.0.0", + "ts-invariant": "^0.10.3", + "tslib": "^2.3.0", + "zen-observable-ts": "^1.2.5" + }, + "peerDependencies": { + "graphql": "^15.0.0 || ^16.0.0", + "graphql-ws": "^5.5.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.23.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", + "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "dependencies": { + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.9.tgz", + "integrity": "sha512-hJhBCb0+NnTWybvWq2WpbCYDOcflSbx0t+BYP65e5R9GVnukiDTi+on5bFkk4p7QGuv190H6KfNiV9Knf/3cZA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.23.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-decorators": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", + "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", + "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", + "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.13.tgz", + "integrity": "sha512-GfiI1JxJ7ecluEmDjPzseRXk/PX31hS7+tjgBopL7XjB2hLUdR+0FTMXy2Q3/hXezypDvU6or7gVFizDESrkXw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", + "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", + "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", + "dependencies": { + "@firebase/app-check": "0.8.0", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.13.tgz", + "integrity": "sha512-j6ANZaWjeVy5zg6X7uiqh6lM6o3n3LD1+/SJFNs9V781xyryyZWXe+tmnWNWPkP086QfJoNkWN9pMQRqSG4vMg==", + "dependencies": { + "@firebase/app": "0.9.13", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.23.2.tgz", + "integrity": "sha512-dM9iJ0R6tI1JczuGSxXmQbXAgtYie0K4WvKcuyuSTCu9V8eEDiz4tfa1sO3txsfvwg7nOY3AjoCyMYEdqZ8hdg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.2.tgz", + "integrity": "sha512-Q30e77DWXFmXEt5dg5JbqEDpjw9y3/PcP9LslDPR7fARmAOTIY9MM6HXzm9KC+dlrKH/+p6l8g9ifJiam9mc4A==", + "dependencies": { + "@firebase/auth": "0.23.2", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", + "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", + "dependencies": { + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", + "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "0.14.4", + "@firebase/database-types": "0.10.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", + "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.13.0.tgz", + "integrity": "sha512-NwcnU+madJXQ4fbLkGx1bWvL612IJN/qO6bZ6dlPmyf7QRyu5azUosijdAN675r+bOOJxMtP1Bv981bHBXAbUg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.1", + "@grpc/grpc-js": "~1.7.0", + "@grpc/proto-loader": "^0.6.13", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.12.tgz", + "integrity": "sha512-mazuNGAx5Kt9Nph0pm6ULJFp/+j7GSsx+Ncw1GrnKl+ft1CQ4q2LcUssXnjqkX2Ry0fNGqUzC1mfIUrk9bYtjQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-types": "2.5.1", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", + "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", + "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", + "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/functions": "0.10.0", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", + "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", + "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/messaging/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.4", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", + "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", + "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.1.tgz", + "integrity": "sha512-Dq5rYfEpdeel0bLVN+nfD1VWmzCkK+pJbSjIawGE+RY4+NIJqhbUDDQjvV0NUK84fMfwxvtFoCtEe70HfZjFcw==" + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@googlemaps/js-api-loader": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@googlemaps/js-api-loader/-/js-api-loader-1.16.2.tgz", + "integrity": "sha512-psGw5u0QM6humao48Hn4lrChOM2/rA43ZCm3tKK9qQsEj1/VzqkCqnvGfEOshDbBQflydfaRovbKwZMF4AyqbA==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/@googlemaps/markerclusterer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@googlemaps/markerclusterer/-/markerclusterer-2.5.3.tgz", + "integrity": "sha512-x7lX0R5yYOoiNectr10wLgCBasNcXFHiADIBdmn7jQllF2B5ENQw5XtZK+hIw4xnV0Df0xhN4LN98XqA5jaiOw==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "supercluster": "^8.0.1" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", + "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.6.2", + "jest-util": "^26.6.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/reporters": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.6.2", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-resolve-dependencies": "^26.6.3", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "jest-watcher": "^26.6.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", + "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "dependencies": { + "@jest/types": "^26.6.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", + "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", + "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", + "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", + "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", + "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "dependencies": { + "@jest/test-result": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-runner": "^26.6.3", + "jest-runtime": "^26.6.3" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", + "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.6.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.6.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@material-ui/core": { + "version": "4.12.4", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", + "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.5", + "@material-ui/system": "^4.12.2", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/core/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@material-ui/lab": { + "version": "4.0.0-alpha.61", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", + "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@material-ui/core": "^4.12.1", + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/lab/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@material-ui/styles": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", + "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", + "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.3", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/@material-ui/system": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", + "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.3", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", + "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@material-ui/utils/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.36", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", + "integrity": "sha512-6A8fYiXgjqTO6pgj31Hc8wm1M3rFYCxDRh09dBVk0L0W4cb2lnurRJa3cAyic6hHY+we1S58OdGYRbKmOsDpGQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.10.tgz", + "integrity": "sha512-qPv7B+LeMatYuzRjB3hlZUHqinHx/fX4YFBiaS19oC02A1e9JFuDKDvlyRQQ5oRSbJJt0QlaLTlr0IcauVcJRQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.10.tgz", + "integrity": "sha512-9cF8oUHZKo9oQ7EQ3pxPELaZuZVmphskU4OI6NiJNDVN7zcuvrEsuWjYo1Zh4fLiC39Nrvm30h/B51rcUjvSGA==", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.10.tgz", + "integrity": "sha512-YJJGHjwDOucecjDEV5l9ISTCo+l9YeWrho623UajzoHRYxuKUmwrGVYOW4PKwGvCx9SU9oklZnbbi2Clc5XZHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.36", + "@mui/core-downloads-tracker": "^5.15.10", + "@mui/system": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/private-theming": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.9.tgz", + "integrity": "sha512-/aMJlDOxOTAXyp4F2rIukW1O0anodAMCkv1DfBh/z9vaKHY3bd5fFf42wmP+0GRmwMinC5aWPpNfHXOED1fEtg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.9", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.9.tgz", + "integrity": "sha512-NRKtYkL5PZDH7dEmaLEIiipd3mxNnQSO+Yo8rFNBNptY8wzQnQ+VjayTq39qH7Sast5cwHKYFusUrQyD+SS4Og==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/styles": { + "version": "5.15.10", + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.10.tgz", + "integrity": "sha512-VUl9rCK89lkCZ+ctYv1hSCN9gBke9CfnXF9BtGPkw9jTxPkrW6fQQYep2wcHdzLORE3w96oq9BbSXDqrOnSEPA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/hash": "^0.9.1", + "@mui/private-theming": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.10.0", + "jss-plugin-camel-case": "^10.10.0", + "jss-plugin-default-unit": "^10.10.0", + "jss-plugin-global": "^10.10.0", + "jss-plugin-nested": "^10.10.0", + "jss-plugin-props-sort": "^10.10.0", + "jss-plugin-rule-value-function": "^10.10.0", + "jss-plugin-vendor-prefixer": "^10.10.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styles/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/system": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.9.tgz", + "integrity": "sha512-SxkaaZ8jsnIJ77bBXttfG//LUf6nTfOcaOuIgItqfHv60ZCQy/Hu7moaob35kBb+guxVJnoSZ+7vQJrA/E7pKg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.9", + "@mui/styled-engine": "^5.15.9", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.9", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", + "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.9.tgz", + "integrity": "sha512-yDYfr61bCYUz1QtwvpqYy/3687Z8/nS4zv7lv/ih/6ZFGMl1iolEvxRmR84v2lOYxlds+kq1IVYbXxDKh8Z9sg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@react-google-maps/api": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/@react-google-maps/api/-/api-2.19.3.tgz", + "integrity": "sha512-jiLqvuOt5lOowkLeq7d077AByTyJp+s6hZVlLhlq7SBacBD37aUNpXBz2OsazfeR6Aw4a+9RRhAEjEFvrR1f5A==", + "dependencies": { + "@googlemaps/js-api-loader": "1.16.2", + "@googlemaps/markerclusterer": "2.5.3", + "@react-google-maps/infobox": "2.19.2", + "@react-google-maps/marker-clusterer": "2.19.2", + "@types/google.maps": "3.55.2", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17 || ^18", + "react-dom": "^16.8 || ^17 || ^18" + } + }, + "node_modules/@react-google-maps/infobox": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@react-google-maps/infobox/-/infobox-2.19.2.tgz", + "integrity": "sha512-6wvBqeJsQ/eFSvoxg+9VoncQvNoVCdmxzxRpLvmjPD+nNC6mHM0vJH1xSqaKijkMrfLJT0nfkTGpovrF896jwg==" + }, + "node_modules/@react-google-maps/marker-clusterer": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/@react-google-maps/marker-clusterer/-/marker-clusterer-2.19.2.tgz", + "integrity": "sha512-x9ibmsP0ZVqzyCo1Pitbw+4b6iEXRw/r1TCy3vOUR3eKrzWLnHYZMR325BkZW2r8fnuWE/V3Fp4QZOP9qYORCw==" + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", + "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", + "dependencies": { + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@sentry/browser": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.19.7.tgz", + "integrity": "sha512-oDbklp4O3MtAM4mtuwyZLrgO1qDVYIujzNJQzXmi9YzymJCuzMLSRDvhY83NNDCRxf0pds4DShgYeZdbSyKraA==", + "dependencies": { + "@sentry/core": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/core": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", + "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/react": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-6.19.7.tgz", + "integrity": "sha512-VzJeBg/v41jfxUYPkH2WYrKjWc4YiMLzDX0f4Zf6WkJ4v3IlDDSkX6DfmWekjTKBho6wiMkSNy2hJ1dHfGZ9jA==", + "dependencies": { + "@sentry/browser": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "hoist-non-react-statics": "^3.3.2", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x" + } + }, + "node_modules/@sentry/react/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/tracing": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-6.19.7.tgz", + "integrity": "sha512-ol4TupNnv9Zd+bZei7B6Ygnr9N3Gp1PUrNI761QSlHtPC25xXC5ssSD3GMhBgyQrcvpuRcCFHVNNM97tN5cZiA==", + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz", + "integrity": "sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A==", + "dependencies": { + "ejs": "^2.6.1", + "magic-string": "^0.25.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tawk.to/tawk-messenger-react": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tawk.to/tawk-messenger-react/-/tawk-messenger-react-1.0.0.tgz", + "integrity": "sha512-4jGmgz47bcbEIdX3Qvi8Uj7//vroIBX1AKFpnTg9urgCejPShprlGPrGkSj0uWjfNTMD6S0Sh+JP0CkopSyXDw==", + "dependencies": { + "ansi-styles": "^4.3.0", + "aria-query": "^5.0.0", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bindings": "^1.5.0", + "body-parser": "^1.19.1", + "browserslist": "^4.19.1", + "camelcase": "^6.3.0", + "caniuse-lite": "^1.0.30001296", + "chalk": "^4.1.2", + "color-convert": "^2.0.1", + "color-name": "^1.1.4", + "color-string": "^1.9.0", + "confusing-browser-globals": "^1.0.11", + "content-disposition": "^0.5.4", + "cookie": "^0.4.1", + "core-js": "^3.20.2", + "core-js-compat": "^3.20.2", + "core-js-pure": "^3.20.2", + "cross-spawn": "^7.0.3", + "css": "^3.0.0", + "css-select": "^4.2.1", + "css-what": "^5.1.0", + "debug": "^4.3.3", + "diff-sequences": "^27.4.0", + "dom-serializer": "^1.3.2", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "electron-to-chromium": "^1.4.35", + "emoji-regex": "^9.2.2", + "escape-string-regexp": "^4.0.0", + "eslint-module-utils": "^2.7.2", + "eslint-plugin-import": "^2.25.4", + "estraverse": "^5.3.0", + "execa": "^4.1.0", + "express": "^4.17.2", + "file-uri-to-path": "^1.0.0", + "follow-redirects": "^1.14.6", + "get-stream": "^5.2.0", + "graceful-fs": "^4.2.9", + "has-flag": "^4.0.0", + "http-errors": "^1.8.1", + "http-parser-js": "^0.5.5", + "ignore": "^5.2.0", + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "is-descriptor": "^1.0.2", + "is-extendable": "^1.0.1", + "is-negative-zero": "^2.0.2", + "is-obj": "^1.0.1", + "is-stream": "^2.0.1", + "is-weakref": "^1.0.2", + "istanbul-reports": "^3.1.3", + "jest-cli": "^26.6.3", + "jest-diff": "^27.4.6", + "jest-get-type": "^27.4.0", + "jest-worker": "^27.4.6", + "minipass": "^3.1.6", + "nan": "^2.15.0", + "npm-run-path": "^4.0.1", + "nth-check": "^2.0.1", + "object-inspect": "^1.12.0", + "path-key": "^3.1.1", + "picomatch": "^2.3.1", + "pirates": "^4.0.4", + "postcss-selector-parser": "^6.0.8", + "postcss-value-parser": "^4.2.0", + "pretty-format": "^27.4.6", + "prop-types": "^15.8.1", + "qs": "^6.9.6", + "raw-body": "^2.4.2", + "react": "^17.0.2", + "react-error-overlay": "^6.0.10", + "react-is": "^17.0.2", + "resolve-from": "^5.0.0", + "send": "^0.17.2", + "serve-static": "^1.14.2", + "setprototypeof": "^1.2.0", + "shebang-command": "^2.0.0", + "shebang-regex": "^3.0.0", + "sockjs": "^0.3.24", + "source-map": "^0.6.1", + "source-map-js": "^1.0.1", + "source-map-resolve": "^0.6.0", + "string_decoder": "^1.3.0", + "strip-bom": "^4.0.0", + "supports-color": "^7.2.0", + "supports-preserve-symlinks-flag": "^1.0.0", + "table": "^6.7.5", + "toidentifier": "^1.0.1", + "tslib": "^2.3.1", + "type-fest": "^0.21.3", + "typescript": "^4.5.4", + "url-parse": "^1.5.4", + "util.promisify": "^1.0.0", + "which": "^2.0.2" + }, + "peerDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2", + "react-scripts": "4.0.3" + } + }, + "node_modules/@tawk.to/tawk-messenger-react/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@tawk.to/tawk-messenger-react/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@tawk.to/tawk-messenger-react/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/google-maps": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@types/google-maps/-/google-maps-3.2.6.tgz", + "integrity": "sha512-ySOadZErcnCnNG+Zkmv5n+QG9DyTt7Mkx5Yk1dTjjNPtD8ByFaf+klZ/CxzgYcweduWEijTP0ASkANl57D0PRQ==", + "dev": true, + "dependencies": { + "@types/google.maps": "*" + } + }, + "node_modules/@types/google.maps": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.55.2.tgz", + "integrity": "sha512-JcTwzkxskR8DN/nnX96Pie3gGN3WHiPpuxzuQ9z3516o1bB243d8w8DHUJ8BohuzoT1o3HUFta2ns/mkZC8KRw==" + }, + "node_modules/@types/googlemaps": { + "version": "3.30.18", + "resolved": "https://registry.npmjs.org/@types/googlemaps/-/googlemaps-3.30.18.tgz", + "integrity": "sha512-rXYs277SHf7ceAR7RSoGh/fkYvy2eBl5mvmMlUEcPMMkwCP9XkFdwrtDZ4OGeEawOfnwauu/yoi0eTpfGp4MPg==", + "deprecated": "Types for the Google Maps browser API have moved to @types/google.maps. Note: these types are not for the googlemaps npm package, which is a Node API.", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/markerclustererplus": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/@types/markerclustererplus/-/markerclustererplus-2.1.33.tgz", + "integrity": "sha512-ZDxsLUp8BmK9MVZZeQVDDzVrEXgRL0021AQcfXqfreFhdfZ9+PS0P6o4nZBvoIVYTmGSBemdCdI6mL6hf9yWvg==", + "dev": true, + "dependencies": { + "@types/google-maps": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==" + }, + "node_modules/@types/node": { + "version": "20.11.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", + "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==" + }, + "node_modules/@types/react": { + "version": "17.0.75", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", + "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", + "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", + "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==" + }, + "node_modules/@types/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-Hm/T0kV3ywpJyMGNbsItdivRhYNCQQf1IIsYsXnoVPES4t+FMLyDe0/K+Ea7ahWtMtSNb22ZdY7MIyoD9rqARg==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.38", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.38.tgz", + "integrity": "sha512-oOW7E931XJU1mVfCnxCVgv8GLFL768pDO5u2Gzk82i8yTIgX6i7cntyZOkZYb/JtYM8252SN9bQp9tgkVDSsRw==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@types/zen-observable": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.7.tgz", + "integrity": "sha512-LKzNTjj+2j09wAo/vvVjzgw5qckJJzhdGgWHW7j69QIGdq/KnZrMAMIHQiWGl3Ccflh5/CudBAntTPYdprPltA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wojtekmaj/date-utils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.5.1.tgz", + "integrity": "sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==", + "funding": { + "url": "https://github.com/wojtekmaj/date-utils?sponsor=1" + } + }, + "node_modules/@wojtekmaj/react-timerange-picker": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@wojtekmaj/react-timerange-picker/-/react-timerange-picker-3.5.0.tgz", + "integrity": "sha512-vFibWX7YFRhBLFRBn4IyBShcMZ6OwFXO7tTYFINb+dVHc7hzZ8L4KkB8Nbw/cehEnkhsZCKx4TJ85a0Ie2ZpIQ==", + "dependencies": { + "make-event-props": "^1.1.0", + "merge-class-names": "^1.1.1", + "prop-types": "^15.6.0", + "react-clock": "^3.0.0", + "react-fit": "^1.4.0", + "react-time-picker": "^4.5.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-timerange-picker?sponsor=1" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/context": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", + "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha512-JoAxEa1DfP9m2xfB/y2r/aKcwXNlltr4+0QSBC4TrLfcxyvepX2Pv0t/xpgGV5bGsDzCYV8SzjWgyCW0T9yYbA==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apollo-boost": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.9.tgz", + "integrity": "sha512-05y5BKcDaa8w47f8d81UVwKqrAjn8uKLv6QM9fNdldoNzQ+rnOHgFlnrySUZRz9QIT3vPftQkEz2UEASp1Mi5g==", + "dependencies": { + "apollo-cache": "^1.3.5", + "apollo-cache-inmemory": "^1.6.6", + "apollo-client": "^2.6.10", + "apollo-link": "^1.0.6", + "apollo-link-error": "^1.0.3", + "apollo-link-http": "^1.3.1", + "graphql-tag": "^2.4.2", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-boost/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-boost/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-cache": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz", + "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==", + "dependencies": { + "apollo-utilities": "^1.3.4", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-cache-inmemory": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz", + "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==", + "dependencies": { + "apollo-cache": "^1.3.5", + "apollo-utilities": "^1.3.4", + "optimism": "^0.10.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-cache-inmemory/node_modules/@wry/context": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", + "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==", + "dependencies": { + "@types/node": ">=6", + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-cache-inmemory/node_modules/optimism": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz", + "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==", + "dependencies": { + "@wry/context": "^0.4.0" + } + }, + "node_modules/apollo-cache-inmemory/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-cache-inmemory/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-cache/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-client": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz", + "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==", + "dependencies": { + "@types/zen-observable": "^0.8.0", + "apollo-cache": "1.3.5", + "apollo-link": "^1.0.0", + "apollo-utilities": "1.3.4", + "symbol-observable": "^1.0.2", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0", + "zen-observable": "^0.8.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-client/node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/apollo-client/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-client/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-link": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", + "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", + "dependencies": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.21" + }, + "peerDependencies": { + "graphql": "^0.11.3 || ^0.12.3 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-link-error": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.13.tgz", + "integrity": "sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==", + "dependencies": { + "apollo-link": "^1.2.14", + "apollo-link-http-common": "^0.2.16", + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-link-error/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-link-http": { + "version": "1.5.17", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz", + "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==", + "dependencies": { + "apollo-link": "^1.2.14", + "apollo-link-http-common": "^0.2.16", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-link-http-common": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz", + "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==", + "dependencies": { + "apollo-link": "^1.2.14", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-link-http-common/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-link-http-common/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-link-http/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-link/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-link/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/apollo-link/node_modules/zen-observable-ts": { + "version": "0.8.21", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", + "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", + "dependencies": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } + }, + "node_modules/apollo-utilities": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", + "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", + "dependencies": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.10.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/apollo-utilities/node_modules/@wry/equality": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", + "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-utilities/node_modules/ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "dependencies": { + "tslib": "^1.9.3" + } + }, + "node_modules/apollo-utilities/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "engines": { + "node": "*" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "dependencies": { + "babylon": "^6.18.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", + "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", + "dependencies": { + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dependencies": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-loader/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", + "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.5.0", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==" + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", + "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001588", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", + "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", + "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==", + "dependencies": { + "arity-n": "^1.0.4" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/copy-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "dependencies": { + "browserslist": "^4.22.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", + "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-react-class": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", + "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "dependencies": { + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-blank-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "bin": { + "css-has-pseudo": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/css-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", + "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "dependencies": { + "camelcase": "^6.0.0", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^2.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.3", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.1", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dependencies": { + "postcss": "^7.0.5" + }, + "bin": { + "css-prefers-color-scheme": "cli.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-select/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-element-overflow": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/detect-element-overflow/-/detect-element-overflow-1.4.2.tgz", + "integrity": "sha512-4m6cVOtvm/GJLjo7WFkPfwXoEIIbM7GQwIh4WEa4g7IsNi1YzwUsGL5ApNLrrHL29bHeNeQ+/iZhw+YHqgE2Fw==", + "funding": { + "url": "https://github.com/wojtekmaj/detect-element-overflow?sponsor=1" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.676", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.676.tgz", + "integrity": "sha512-uHt4FB8SeYdhcOsj2ix/C39S7sPSNFJpzShjxGOm1KdF4MHyGqGi389+T5cErsodsijojXilYaHIKKqJfqh7uQ==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/enhanced-resolve/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/enhanced-resolve/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.1", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz", + "integrity": "sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==", + "dependencies": { + "confusing-browser-globals": "^1.0.10" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0", + "@typescript-eslint/parser": "^4.0.0", + "babel-eslint": "^10.0.0", + "eslint": "^7.5.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-jest": "^24.0.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.20.3", + "eslint-plugin-react-hooks": "^4.0.8", + "eslint-plugin-testing-library": "^3.9.0" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-testing-library": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz", + "integrity": "sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw==", + "dependencies": { + "lodash": "^4.17.15", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz", + "integrity": "sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", + "integrity": "sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^3.10.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^5 || ^6 || ^7" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/experimental-utils": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz", + "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==", + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/typescript-estree": "3.10.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/types": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz", + "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/typescript-estree": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz", + "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==", + "dependencies": { + "@typescript-eslint/types": "3.10.1", + "@typescript-eslint/visitor-keys": "3.10.1", + "debug": "^4.1.1", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/@typescript-eslint/visitor-keys": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz", + "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", + "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", + "dependencies": { + "@types/eslint": "^7.29.0", + "arrify": "^2.0.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^3.1.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/expect/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "deprecated": "This module is no longer supported." + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", + "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-versions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", + "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", + "dev": true, + "dependencies": { + "semver-regex": "^3.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firebase": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", + "integrity": "sha512-/4lUVY0lUvBDIaeY1q6dUYhS8Sd18Qb9CgWkPZICUo9IXpJNCEagfNZXBBFCkMTTN5L5gx2Hjr27y21a9NzUcA==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.13", + "@firebase/app-check": "0.8.0", + "@firebase/app-check-compat": "0.3.7", + "@firebase/app-compat": "0.2.13", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "0.23.2", + "@firebase/auth-compat": "0.4.2", + "@firebase/database": "0.14.4", + "@firebase/database-compat": "0.3.4", + "@firebase/firestore": "3.13.0", + "@firebase/firestore-compat": "0.3.12", + "@firebase/functions": "0.10.0", + "@firebase/functions-compat": "0.3.5", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.4", + "@firebase/messaging-compat": "0.2.4", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-compat": "0.3.2", + "@firebase/util": "1.9.3" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.0.tgz", + "integrity": "sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==" + }, + "node_modules/flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash." + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-user-locale": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/get-user-locale/-/get-user-locale-1.5.1.tgz", + "integrity": "sha512-WiNpoFRcHn1qxP9VabQljzGwkAQDrcpqUtaP0rNBEkFxJdh4f3tik6MfZsMYZc+UgQJdGCxWEjL9wnCUlRQXag==", + "dependencies": { + "lodash.memoize": "^4.1.1" + }, + "funding": { + "url": "https://github.com/wojtekmaj/get-user-locale?sponsor=1" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "optional": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==" + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-parse-stringify2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz", + "integrity": "sha512-wMKQ3aJ/dwXzDHPpA7XgsRXXCkEhHkAF6Ioh7D51lgZO7Qy0LmcFddC9TI/qNQJvSM1KL8KbcR3FtuybsrzFlQ==", + "dependencies": { + "void-elements": "^2.0.1" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz", + "integrity": "sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.8.tgz", + "integrity": "sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^4.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^5.0.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "bin": { + "husky-run": "bin/run.js", + "husky-upgrade": "lib/upgrader/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/husky" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/i18next": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-17.3.1.tgz", + "integrity": "sha512-4nY+yaENaoZKmpbiDXPzucVHCN3hN9Z9Zk7LyQXVOKVIpnYOJ3L/yxHJlBPtJDq3PGgjFwA0QBFm/26Z0iDT5A==", + "dependencies": { + "@babel/runtime": "^7.3.1" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", + "dependencies": { + "@jest/core": "^26.6.0", + "import-local": "^3.0.2", + "jest-cli": "^26.6.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", + "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-26.6.0.tgz", + "integrity": "sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^26.6.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", + "stack-utils": "^2.0.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-cli": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", + "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "dependencies": { + "@jest/core": "^26.6.3", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-cli/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", + "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-environment-jsdom": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", + "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", + "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2", + "jest-util": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", + "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.6.2", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", + "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.6.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "pretty-format": "^26.6.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-jasmine2/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-leak-detector": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", + "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-matcher-utils": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", + "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-message-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", + "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-mock": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", + "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.18.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", + "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", + "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.6.2", + "jest-leak-detector": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "jest-runtime": "^26.6.3", + "jest-util": "^26.6.2", + "jest-worker": "^26.6.2", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runtime": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", + "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/environment": "^26.6.2", + "@jest/fake-timers": "^26.6.2", + "@jest/globals": "^26.6.2", + "@jest/source-map": "^26.6.2", + "@jest/test-result": "^26.6.2", + "@jest/transform": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "cjs-module-lexer": "^0.6.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.6.3", + "jest-haste-map": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-mock": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-snapshot": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", + "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", + "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.6.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.6.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.6.2", + "jest-matcher-utils": "^26.6.2", + "jest-message-util": "^26.6.2", + "jest-resolve": "^26.6.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.6.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", + "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", + "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/jest-util": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", + "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "dependencies": { + "@jest/types": "^26.6.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-watch-typeahead": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz", + "integrity": "sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "jest": "^26.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", + "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/kdbush": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lint-staged": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz", + "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.1.0", + "listr2": "^3.2.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.orderby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.orderby/-/lodash.orderby-4.6.0.tgz", + "integrity": "sha512-T0rZxKmghOOf5YPnn8EY5iLYeWCpZq8G41FfqoVHH5QDTAFaghJRmAdLiadEDq+ztgM2q5PjA+Z1fOwGrLgmtg==" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/make-event-props": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-class-names": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/merge-class-names/-/merge-class-names-1.4.2.tgz", + "integrity": "sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw==", + "funding": { + "url": "https://github.com/wojtekmaj/merge-class-names?sponsor=1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-refs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", + "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", + "funding": { + "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.3.tgz", + "integrity": "sha512-TtF6hZE59SGmS4U8529qB+jJFeW6asTLDIpPgvPLSCsooAwJS7QprHIFTqv9/Qh3NdLwQxFYgiHX5lqb6jqzPA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz", + "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/move-concurrently/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==" + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + }, + "node_modules/nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/native-url": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.2.6.tgz", + "integrity": "sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA==", + "dependencies": { + "querystring": "^0.2.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-gyp/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/node-gyp/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/node-libs-browser/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/node-sass": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-8.0.0.tgz", + "integrity": "sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A==", + "hasInstallScript": true, + "dependencies": { + "async-foreach": "^0.1.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "make-fetch-happen": "^10.0.4", + "meow": "^9.0.0", + "nan": "^2.17.0", + "node-gyp": "^8.4.1", + "sass-graph": "^4.0.1", + "stdout-stream": "^1.4.0", + "true-case-path": "^2.2.1" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nouislider": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-13.1.1.tgz", + "integrity": "sha512-PYXfMYYZA2F7QzMSEANocyIr8OgeMBrQBCre5wHsZiyha0DSrt9i5weEV2oWaJDYnG2qDKb6GwmKAkczqTzvAQ==" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==" + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimism": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", + "dependencies": { + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.4.3", + "tslib": "^2.3.0" + } + }, + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/parallel-transform/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", + "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "dependencies": { + "postcss": "^7" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "browserslist": "^4" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dependencies": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dependencies": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-custom-selectors/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dependencies": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz", + "integrity": "sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==", + "dependencies": { + "postcss": "^7.0.26" + } + }, + "node_modules/postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dependencies": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-load-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-normalize": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", + "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", + "dependencies": { + "@csstools/normalize.css": "^10.1.0", + "browserslist": "^4.6.2", + "postcss": "^7.0.17", + "postcss-browser-comments": "^3.0.0", + "sanitize.css": "^10.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dependencies": { + "postcss": "^7.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dependencies": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dependencies": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dependencies": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-safe-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz", + "integrity": "sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ==", + "dependencies": { + "postcss": "^8.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/postcss-safe-parser/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dependencies": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dependencies": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-config-standard": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-config-standard/-/prettier-config-standard-1.0.1.tgz", + "integrity": "sha512-S0zuixvAFlc0zruhYEDMsjt2VG/e5S5hSbqGuxTMWA0ygjII8EP9U7c/wsCQyjjAoaYG82bUsVmaSQ6veQ+u6g==", + "dev": true + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "engines": { + "node": ">=8" + } + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz", + "integrity": "sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA==", + "dependencies": { + "core-js": "^3.6.5", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", + "whatwg-fetch": "^3.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/react-chartjs-2": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-4.3.1.tgz", + "integrity": "sha512-5i3mjP6tU7QSn0jvb8I4hudTzHJqS8l00ORJnVwI2sYu0ihpj83Lv2YzfxunfxTZkscKvZu2F2w9LkwNBhj6xA==", + "peerDependencies": { + "chart.js": "^3.5.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clock": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-clock/-/react-clock-3.1.0.tgz", + "integrity": "sha512-KLV3pDBcETc7lHPPqK6EpRaPS8NA3STAes+zIdfr7IY67vYgYc3brOAnGC9IcgA4X4xNPnLZwwaLJXmHrQ/MnQ==", + "dependencies": { + "@wojtekmaj/date-utils": "^1.0.0", + "get-user-locale": "^1.4.0", + "merge-class-names": "^1.1.1", + "prop-types": "^15.6.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-clock?sponsor=1" + }, + "peerDependencies": { + "react": "^15.5.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.5.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-data-table-component": { + "version": "6.11.8", + "resolved": "https://registry.npmjs.org/react-data-table-component/-/react-data-table-component-6.11.8.tgz", + "integrity": "sha512-ukKJKaKNDU5+jEEZFo16+4zwQPRvw1Z13S7FOj4dr73JWRf/lKkE108jciK2tj1JPMub3qXG2h0zXDn5y2WUfQ==", + "dependencies": { + "deepmerge": "^4.2.2", + "lodash.orderby": "^4.6.0", + "shortid": "^2.2.16" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "styled-components": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/react-datetime": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/react-datetime/-/react-datetime-2.16.3.tgz", + "integrity": "sha512-amWfb5iGEiyqjLmqCLlPpu2oN415jK8wX1qoTq7qn6EYiU7qQgbNHglww014PT4O/3G5eo/3kbJu/M/IxxTyGw==", + "dependencies": { + "create-react-class": "^15.5.2", + "object-assign": "^3.0.0", + "prop-types": "^15.5.7", + "react-onclickoutside": "^6.5.0" + }, + "peerDependencies": { + "moment": ">=2.16.0", + "react": ">=0.13", + "react-dom": ">=0.13" + } + }, + "node_modules/react-datetime/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fit": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/react-fit/-/react-fit-1.7.1.tgz", + "integrity": "sha512-y/TYovCCBzfIwRJsbLj0rH4Es40wPQhU5GPPq9GlbdF09b0OdzTdMSkBza0QixSlgFzTm6dkM7oTFzaVvaBx+w==", + "dependencies": { + "detect-element-overflow": "^1.4.0", + "prop-types": "^15.6.0", + "tiny-warning": "^1.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-fit?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "@types/react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react-i18next": { + "version": "10.13.2", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-10.13.2.tgz", + "integrity": "sha512-DGoauWUdPEv/+PLa03nN+wlW31XrGmQJz+zIyOA+tRTIwlRaNgeM62nGP1WG3g7fJrphMZUwPcAQqNv6XBYM4w==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "html-parse-stringify2": "2.0.1" + }, + "peerDependencies": { + "i18next": ">= 17.0.0", + "react": ">= 16.8.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-loader-spinner": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-4.0.0.tgz", + "integrity": "sha512-RU2vpEej6G4ECei0h3q6bgLU10of9Lw5O+4AwF/mtkrX5oY20Sh/AxoPJ7etbrs/7Q3u4jN5qwCwGLRKCHpk6g==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react-notifications": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/react-notifications/-/react-notifications-1.7.4.tgz", + "integrity": "sha512-dsR7mUQfe8YdFLqVsjT0GFd4n26UWkzefdjMELfEVygjuuyU6ZZ0LpZhFHdfmraGeBFLWHNxygpGlHHituUyjQ==", + "dependencies": { + "acorn": "6.4.1", + "classnames": "^2.1.1", + "prop-types": "^15.5.10", + "react-transition-group": "^4.4.1" + } + }, + "node_modules/react-notifications/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/react-onclickoutside": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", + "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", + "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.1.2", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-scripts": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-4.0.3.tgz", + "integrity": "sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A==", + "dependencies": { + "@babel/core": "7.12.3", + "@pmmmwh/react-refresh-webpack-plugin": "0.4.3", + "@svgr/webpack": "5.5.0", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "@typescript-eslint/parser": "^4.5.0", + "babel-eslint": "^10.1.0", + "babel-jest": "^26.6.0", + "babel-loader": "8.1.0", + "babel-plugin-named-asset-import": "^0.3.7", + "babel-preset-react-app": "^10.0.0", + "bfj": "^7.0.2", + "camelcase": "^6.1.0", + "case-sensitive-paths-webpack-plugin": "2.3.0", + "css-loader": "4.3.0", + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^7.11.0", + "eslint-config-react-app": "^6.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jest": "^24.1.0", + "eslint-plugin-jsx-a11y": "^6.3.1", + "eslint-plugin-react": "^7.21.5", + "eslint-plugin-react-hooks": "^4.2.0", + "eslint-plugin-testing-library": "^3.9.2", + "eslint-webpack-plugin": "^2.5.2", + "file-loader": "6.1.1", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "4.5.0", + "identity-obj-proxy": "3.0.0", + "jest": "26.6.0", + "jest-circus": "26.6.0", + "jest-resolve": "26.6.0", + "jest-watch-typeahead": "0.6.1", + "mini-css-extract-plugin": "0.11.3", + "optimize-css-assets-webpack-plugin": "5.0.4", + "pnp-webpack-plugin": "1.6.4", + "postcss-flexbugs-fixes": "4.2.1", + "postcss-loader": "3.0.0", + "postcss-normalize": "8.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "5.0.2", + "prompts": "2.4.0", + "react-app-polyfill": "^2.0.0", + "react-dev-utils": "^11.0.3", + "react-refresh": "^0.8.3", + "resolve": "1.18.1", + "resolve-url-loader": "^3.1.2", + "sass-loader": "^10.0.5", + "semver": "7.3.2", + "style-loader": "1.3.0", + "terser-webpack-plugin": "4.2.3", + "ts-pnp": "1.2.0", + "url-loader": "4.1.1", + "webpack": "4.44.2", + "webpack-dev-server": "3.11.1", + "webpack-manifest-plugin": "2.2.0", + "workbox-webpack-plugin": "5.1.4" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.1.3" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-scripts/node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", + "integrity": "sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ==", + "dependencies": { + "ansi-html": "^0.0.7", + "error-stack-parser": "^2.0.6", + "html-entities": "^1.2.1", + "native-url": "^0.2.6", + "schema-utils": "^2.6.5", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.x" + }, + "peerDependencies": { + "@types/webpack": "4.x", + "react-refresh": ">=0.8.3 <0.10.0", + "sockjs-client": "^1.4.0", + "type-fest": "^0.13.1", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/react-scripts/node_modules/jest-resolve": { + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", + "dependencies": { + "@jest/types": "^26.6.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.6.0", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/react-scripts/node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-scripts/node_modules/resolve": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "dependencies": { + "is-core-module": "^2.0.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/react-scripts/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-time-picker": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/react-time-picker/-/react-time-picker-4.5.0.tgz", + "integrity": "sha512-06ViW8t3hGmkrwGvUtaoZ5ud/uSlQwMexn86eL3uoTV6FnIeRhKq0H944L4bA1ne4xIndO4Fro5tGUMmWUA9gw==", + "dependencies": { + "@wojtekmaj/date-utils": "^1.0.0", + "get-user-locale": "^1.2.0", + "make-event-props": "^1.1.0", + "merge-class-names": "^1.1.1", + "merge-refs": "^1.0.0", + "prop-types": "^15.6.0", + "react-clock": "^3.0.0", + "react-fit": "^1.4.0", + "update-input-width": "^1.2.2" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-time-picker?sponsor=1" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-transition-group/node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehackt": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.0.5.tgz", + "integrity": "sha512-BI1rV+miEkaHj8zd2n+gaMgzu/fKz7BGlb4zZ6HAiY9adDmJMkaDcmuXlJFv0eyKUob+oszs3/2gdnXUrzx2Tg==", + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve-url-loader": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.5.tgz", + "integrity": "sha512-mgFMCmrV/tA4738EsFmPFE5/MaqSgUMe8LK971kVEKA/RrNVb7+VqFsg/qmKyythf34eyq476qIobP/gfFBGSQ==", + "dependencies": { + "adjust-sourcemap-loader": "3.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "^1.2.3", + "postcss": "7.0.36", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-url-loader/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/resolve-url-loader/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/resolve-url-loader/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/resolve-url-loader/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url-loader/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/response-iterator": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", + "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==", + "dependencies": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + } + }, + "node_modules/rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==" + }, + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==" + }, + "node_modules/rework/node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/rework/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rework/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dependencies": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + }, + "bin": { + "rollup": "dist/bin/rollup" + } + }, + "node_modules/rollup-plugin-babel": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz", + "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-babel.", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "rollup-pluginutils": "^2.8.1" + }, + "peerDependencies": { + "@babel/core": "7 || ^7.0.0-rc.2", + "rollup": ">=0.60.0 <3" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", + "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "jest-worker": "^24.9.0", + "rollup-pluginutils": "^2.8.2", + "serialize-javascript": "^4.0.0", + "terser": "^4.6.2" + }, + "peerDependencies": { + "rollup": ">=0.66.0 <3" + } + }, + "node_modules/rollup-plugin-terser/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, + "node_modules/rollup/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/run-queue/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sanitize.css": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", + "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" + }, + "node_modules/sass-graph": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", + "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.17.11", + "scss-tokenizer": "^0.4.3", + "yargs": "^17.2.1" + }, + "bin": { + "sassgraph": "bin/sassgraph" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-graph/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/sass-loader": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.5.2.tgz", + "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==", + "dependencies": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-loader/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scss-tokenizer": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", + "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", + "dependencies": { + "js-base64": "^2.4.9", + "source-map": "^0.7.3" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/semver-regex": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "optional": true + }, + "node_modules/shortid": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", + "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "nanoid": "^2.1.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/snapdragon/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socks": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.3.tgz", + "integrity": "sha512-vfuYK48HXCTFD03G/1/zkIls3Ebr2YNa4qU9gHDZdblHLiqhJrJGkY3+0Nx0JpN9qBhJbVObc1CNciT1bIZJxw==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-explorer": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", + "dependencies": { + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-explorer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/stdout-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stdout-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stdout-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stdout-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-http/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/stream-http/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "dependencies": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/styled-components": { + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", + "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/subscriptions-transport-ws": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz", + "integrity": "sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==", + "deprecated": "The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md", + "dependencies": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependencies": { + "graphql": "^15.7.2 || ^16.0.0" + } + }, + "node_modules/subscriptions-transport-ws/node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supercluster": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", + "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "dependencies": { + "kdbush": "^4.0.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/terser-webpack-plugin/node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", + "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/true-case-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", + "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==" + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-invariant": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.1.tgz", + "integrity": "sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "3.3.3333", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", + "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==" + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/update-input-width": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/update-input-width/-/update-input-width-1.4.2.tgz", + "integrity": "sha512-/p0XLhrQQQ4bMWD7bL9duYObwYCO1qGr8R19xcMmoMSmXuQ7/1//veUnCObQ7/iW6E2pGS6rFkS4TfH4ur7e/g==", + "funding": { + "url": "https://github.com/wojtekmaj/update-input-width?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util.promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.2.tgz", + "integrity": "sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "object.getownpropertydescriptors": "^2.1.6", + "safe-array-concat": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==" + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.12.0.tgz", + "integrity": "sha512-/x2RJSvbqEyxKj0RPN4xaRquK+EggjeVXiDDEyrJzsJogjtiZ9ov7lj/svVb4DM5Q5braQF4cooAryQbUwOxlA==" + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "node_modules/watchpack-chokidar2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/webpack-dev-server/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-log/node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "dependencies": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.11.5" + }, + "peerDependencies": { + "webpack": "2 || 3 || 4" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/webpack/node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/webpack/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz", + "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz", + "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-build": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-5.1.4.tgz", + "integrity": "sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow==", + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/preset-env": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@hapi/joi": "^15.1.0", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/plugin-replace": "^2.3.1", + "@surma/rollup-plugin-off-main-thread": "^1.1.1", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.6", + "lodash.template": "^4.5.0", + "pretty-bytes": "^5.3.0", + "rollup": "^1.31.1", + "rollup-plugin-babel": "^4.3.3", + "rollup-plugin-terser": "^5.3.1", + "source-map": "^0.7.3", + "source-map-url": "^0.4.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "tempy": "^0.3.0", + "upath": "^1.2.0", + "workbox-background-sync": "^5.1.4", + "workbox-broadcast-update": "^5.1.4", + "workbox-cacheable-response": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-expiration": "^5.1.4", + "workbox-google-analytics": "^5.1.4", + "workbox-navigation-preload": "^5.1.4", + "workbox-precaching": "^5.1.4", + "workbox-range-requests": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4", + "workbox-streams": "^5.1.4", + "workbox-sw": "^5.1.4", + "workbox-window": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/workbox-build/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz", + "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-core": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz", + "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==" + }, + "node_modules/workbox-expiration": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz", + "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-google-analytics": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz", + "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "^5.1.4", + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4", + "workbox-strategies": "^5.1.4" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz", + "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-precaching": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz", + "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-range-requests": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz", + "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-routing": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz", + "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/workbox-strategies": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz", + "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-streams": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz", + "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==", + "dependencies": { + "workbox-core": "^5.1.4", + "workbox-routing": "^5.1.4" + } + }, + "node_modules/workbox-sw": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-5.1.4.tgz", + "integrity": "sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz", + "integrity": "sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "fast-json-stable-stringify": "^2.0.0", + "source-map-url": "^0.4.0", + "upath": "^1.1.2", + "webpack-sources": "^1.3.0", + "workbox-build": "^5.1.4" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/workbox-window": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-5.1.4.tgz", + "integrity": "sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw==", + "dependencies": { + "workbox-core": "^5.1.4" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zen-observable-ts": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", + "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", + "dependencies": { + "zen-observable": "0.8.15" + } + } + } +} diff --git a/enatega-multivendor-admin/package.json b/enatega-multivendor-admin/package.json new file mode 100644 index 0000000..142e154 --- /dev/null +++ b/enatega-multivendor-admin/package.json @@ -0,0 +1,91 @@ +{ + "name": "enatega-multivendor", + "version": "2.0.0", + "description": "Enatega MultiVendor dashboard", + "main": "index.js", + "homepage": "https://multivendor-admin.ninjascode.com/", + "scripts": { + "analyze": "source-map-explorer 'build/static/js/*.js'", + "start": "react-scripts --openssl-legacy-provider start", + "build": "react-scripts --openssl-legacy-provider build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "lint:fix": "eslint . --ext .js,.jsx --fix", + "format": "prettier --write '**/*.{js,jsx}'", + "start:staging": "env-cmd -f .env.staging react-scripts start", + "start:dev": "SET PORT=3000 env-cmd -f .env.development react-scripts start", + "start:prod": "env-cmd -f .env.production react-scripts start", + "build:dev": "env-cmd -f .env.dev react-scripts build", + "build:prod": "env-cmd -f .env.production react-scripts build", + "build:staging": "env-cmd -f .env.staging react-scripts build" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "npm run format", + "npm run lint:fix" + ] + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ], + "dependencies": { + "@apollo/client": "^3.5.8", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@material-ui/core": "^4.12.4", + "@material-ui/lab": "^4.0.0-alpha.61", + "@mui/icons-material": "^5.8.3", + "@mui/material": "^5.8.3", + "@mui/styles": "^5.8.3", + "@react-google-maps/api": "^2.0.0", + "@sentry/react": "^6.16.1", + "@sentry/tracing": "^6.16.1", + "@tawk.to/tawk-messenger-react": "^1.0.0", + "@wojtekmaj/react-timerange-picker": "^3.0.0", + "apollo-boost": "^0.4.9", + "chart.js": "^3.6.0", + "env-cmd": "^10.1.0", + "firebase": "^9.4.0", + "graphql": "^15.0.0", + "husky": "^8.0.3", + "i18next": "^17.0.0", + "moment": "2.24.0", + "node-sass": "^8.0.0", + "nouislider": "13.1.1", + "react": "^17.0.0", + "react-chartjs-2": "^4.0.0", + "react-data-table-component": "^6.9.3", + "react-datetime": "2.16.3", + "react-dom": "^17.0.0", + "react-i18next": "^10.10.0", + "react-loader-spinner": "^4.0.0", + "react-notifications": "^1.7.4", + "react-router-dom": "5.1.2", + "react-scripts": "^4.0.0", + "source-map-explorer": "^2.5.2", + "styled-components": "^5.1.1", + "subscriptions-transport-ws": "^0.11.0", + "validate.js": "^0.12.0" + }, + "devDependencies": { + "@types/googlemaps": "3.30.18", + "@types/markerclustererplus": "2.1.33", + "@types/react": "^17.0.0", + "husky": "^4.2.5", + "lint-staged": "^10.2.7", + "prettier": "2.0.5", + "prettier-config-standard": "^1.0.1", + "typescript": "3.3.3333" + } +} diff --git a/enatega-multivendor-admin/public/apple-icon.png b/enatega-multivendor-admin/public/apple-icon.png new file mode 100644 index 0000000..a20470f Binary files /dev/null and b/enatega-multivendor-admin/public/apple-icon.png differ diff --git a/enatega-multivendor-admin/public/favicon.ico b/enatega-multivendor-admin/public/favicon.ico new file mode 100644 index 0000000..7482a65 Binary files /dev/null and b/enatega-multivendor-admin/public/favicon.ico differ diff --git a/enatega-multivendor-admin/public/favicon.png b/enatega-multivendor-admin/public/favicon.png new file mode 100644 index 0000000..4035919 Binary files /dev/null and b/enatega-multivendor-admin/public/favicon.png differ diff --git a/enatega-multivendor-admin/public/firebase-messaging-sw.js b/enatega-multivendor-admin/public/firebase-messaging-sw.js new file mode 100644 index 0000000..c8e80b8 --- /dev/null +++ b/enatega-multivendor-admin/public/firebase-messaging-sw.js @@ -0,0 +1,46 @@ +// // Give the service worker access to Firebase Messaging. +// // Note that you can only use Firebase Messaging here, other Firebase libraries +// // are not available in the service worker. +importScripts( + "https://www.gstatic.com/firebasejs/9.4.0/firebase-app-compat.js" + ); + importScripts( + "https://www.gstatic.com/firebasejs/9.4.0/firebase-messaging-compat.js" + ); +// // Initialize the Firebase app in the service worker by passing in the +// // messagingSenderId. +firebase.initializeApp({ + apiKey: "AIzaSyDx_iSQ9LroTF7NMm20aRvw2wJqhwSnJ3U", + authDomain: "enatega-multivender-web.firebaseapp.com", + projectId: "enatega-multivender-web", + storageBucket: "enatega-multivender-web.appspot.com", + messagingSenderId: "438532750182", + appId: "1:438532750182:web:516b850eff4e0349f0a6a7", + measurementId: "G-KLBJSEHRYQ", +}); + + +// // Retrieve an instance of Firebase Messaging so that it can handle background +// // messages. +const messaging = firebase.messaging(); + + +messaging.onBackgroundMessage(function (payload) { + try { + console.log('onBackgroundMessage') + // Customize notification here + const { title, body } = payload.notification; + console.log('title', title, body) + const notificationOptions = { + body, + icon: "/favicon.png", + }; + + // eslint-disable-next-line no-restricted-globals + self.registration.showNotification(title, notificationOptions); + } catch (error) { + console.log('error', error) + } + + }); + \ No newline at end of file diff --git a/enatega-multivendor-admin/public/index.html b/enatega-multivendor-admin/public/index.html new file mode 100644 index 0000000..a2437f4 --- /dev/null +++ b/enatega-multivendor-admin/public/index.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + Enatega Multivendor Dashboard + + + + + +
+ + + + \ No newline at end of file diff --git a/enatega-multivendor-admin/public/manifest.json b/enatega-multivendor-admin/public/manifest.json new file mode 100644 index 0000000..c474388 --- /dev/null +++ b/enatega-multivendor-admin/public/manifest.json @@ -0,0 +1,16 @@ +{ + "short_name": "BLK Design System React", + "name": "BLK Design System React by Creative Tim", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff", + "gcm_sender_id": "390014290500" +} diff --git a/enatega-multivendor-admin/src/apollo/index.js b/enatega-multivendor-admin/src/apollo/index.js new file mode 100644 index 0000000..8b6e2cc --- /dev/null +++ b/enatega-multivendor-admin/src/apollo/index.js @@ -0,0 +1,3 @@ +export * from './queries' +export * from './subscriptions' +export * from './mutations' diff --git a/enatega-multivendor-admin/src/apollo/mutations.js b/enatega-multivendor-admin/src/apollo/mutations.js new file mode 100644 index 0000000..851d871 --- /dev/null +++ b/enatega-multivendor-admin/src/apollo/mutations.js @@ -0,0 +1,817 @@ +export const createFood = ` + mutation CreateFood($foodInput:FoodInput!){ + createFood( + foodInput:$foodInput + ){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + } + createdAt + updatedAt + } + } + }` + +export const editFood = ` + mutation EditFood($foodInput:FoodInput!){ + editFood( + foodInput:$foodInput + ){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + } + createdAt + updatedAt + } + } + }` + +export const deleteFood = ` + mutation DeleteFood($id:String!,$restaurant:String!,$categoryId:String!){ + deleteFood(id:$id,restaurant:$restaurant,categoryId:$categoryId){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + } + createdAt + updatedAt + } + } + }` + +export const createCategory = ` +mutation CreateCategory($category:CategoryInput){ + createCategory(category:$category){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + createdAt + updatedAt + } + createdAt + updatedAt + } + } +}` + +export const editCategory = ` + mutation EditCategory($category:CategoryInput){ + editCategory(category:$category){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + createdAt + updatedAt + } + createdAt + updatedAt + } + } + }` + +export const deleteCategory = ` + mutation DeleteCategory($id:String!,$restaurant:String!){ + deleteCategory(id:$id,restaurant:$restaurant){ + _id + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + createdAt + updatedAt + } + createdAt + updatedAt + } + } + }` + +export const saveEmailConfiguration = `mutation SaveEmailConfiguration($configurationInput:EmailConfigurationInput!){ + saveEmailConfiguration(configurationInput:$configurationInput){ + _id + email + emailName + password + enableEmail + } +}` +export const saveFormEmailConfiguration = `mutation SaveFormEmailConfiguration($configurationInput:FormEmailConfigurationInput!){ + saveFormEmailConfiguration(configurationInput: $configurationInput) { + _id + formEmail + + } +}` +export const saveSendGridApiKey = `mutation SaveSendGridApiKey($configurationInput: SendGridConfigurationInput!) { + saveSendGridConfiguration(configurationInput: $configurationInput) { + _id + sendGridApiKey + sendGridEnabled + sendGridEmail + sendGridEmailName + sendGridPassword + } +}` + +export const saveFirebaseConfiguration = ` + mutation SaveFirebaseConfiguration( + $configurationInput:FirebaseConfigurationInput! + ) { + saveFirebaseConfiguration(configurationInput: $configurationInput) { + _id + firebaseKey + authDomain + projectId + storageBucket + msgSenderId + appId + measurementId + } + } +` + +export const saveSentryConfiguration = ` + mutation SaveSentryConfiguration($configurationInput: SentryConfigurationInput!) { + saveSentryConfiguration(configurationInput: $configurationInput) { + _id + dashboardSentryUrl + webSentryUrl + apiSentryUrl + customerAppSentryUrl + restaurantAppSentryUrl + riderAppSentryUrl + } + } +` +export const saveGoogleApiKeyConfiguration = ` + mutation SaveGoogleApiKeyConfiguration( + $configurationInput: GoogleApiKeyConfigurationInput! + ) { + saveGoogleApiKeyConfiguration(configurationInput: $configurationInput) { + _id + googleApiKey + } + } +` +export const saveCloudinaryConfiguration = `mutation SaveCloudinaryConfiguration($configurationInput: CloudinaryConfigurationInput!) { + saveCloudinaryConfiguration(configurationInput: $configurationInput) { + _id + cloudinaryUploadUrl + cloudinaryApiKey + + } +} +` +export const saveAmplitudeApiKeyConfiguration = ` + mutation SaveAmplitudeApiKeyConfiguration( + $configurationInput: AmplitudeApiKeyConfigurationInput! + ) { + saveAmplitudeApiKeyConfiguration(configurationInput: $configurationInput) { + _id + webAmplitudeApiKey + appAmplitudeApiKey + } + } +` +export const saveGoogleClientIDConfiguration = `mutation SaveGoogleClientIDConfiguration($configurationInput: GoogleClientIDConfigurationInput!) { + saveGoogleClientIDConfiguration(configurationInput: $configurationInput) { + _id + webClientID + androidClientID + iOSClientID + expoClientID + } +} +` +export const saveWebConfiguration = ` + mutation SaveWebConfiguration($configurationInput: WebConfigurationInput!) { + saveWebConfiguration(configurationInput: $configurationInput) { + _id + + googleMapLibraries + googleColor + } + } +` + +export const saveAppConfiguration = ` + mutation SaveAppConfiguration($configurationInput: AppConfigurationsInput!) { + saveAppConfigurations(configurationInput: $configurationInput) { + _id + + termsAndConditions + privacyPolicy + testOtp + } + } +` +export const saveDeliveryRateConfiguration = `mutation SaveDeliveryRateConfiguration($deliveryRate: Float!){ + saveDeliveryRateConfiguration(deliveryRate:$deliveryRate){ + _id + deliveryRate + } +}` + +export const savePaypalConfiguration = `mutation SavePaypalConfiguration($configurationInput:PaypalConfigurationInput!){ + savePaypalConfiguration(configurationInput:$configurationInput){ + _id + clientId + clientSecret + sandbox + } +}` + +export const saveStripeConfiguration = `mutation SaveStripeConfiguration($configurationInput:StripeConfigurationInput!){ + saveStripeConfiguration(configurationInput:$configurationInput){ + _id + publishableKey + secretKey + + } +}` + +export const saveTwilioConfiguration = `mutation saveTwilioConfiguration($configurationInput:TwilioConfigurationInput!){ + saveTwilioConfiguration(configurationInput:$configurationInput){ + _id + twilioAccountSid + twilioAuthToken + twilioPhoneNumber + twilioEnabled + } +}` + +export const saveVerificationToggles = `mutation SaveVerificationsToggle($configurationInput:VerificationConfigurationInput!){ + saveVerificationsToggle(configurationInput: $configurationInput) { + skipEmailVerification + skipMobileVerification + } +}` + +export const saveCurrencyConfiguration = `mutation SaveCurrencyConfiguration($configurationInput:CurrencyConfigurationInput!){ + saveCurrencyConfiguration(configurationInput:$configurationInput){ + _id + currency + currencySymbol + } +}` + +export const ownerLogin = `mutation ownerLogin($email:String!,$password:String!){ + ownerLogin(email:$email,password:$password){ + userId + token + email + userType + restaurants{ + _id + orderId + name + image + address + } + } +}` + +export const createSection = `mutation CreateSection($section:SectionInput!){ + createSection(section:$section){ + _id + name + enabled + restaurants{ + _id + name + } + } +}` +export const editSection = `mutation editSection($section:SectionInput!){ + editSection(section:$section){ + _id + name + enabled + restaurants{ + _id + name + } + } +}` + +export const deleteSection = `mutation DeleteSection($id:String!){ + deleteSection(id:$id) +}` + +export const deleteVendor = `mutation DeleteVendor($id:String!){ + deleteVendor(id:$id) +}` + +export const updateOrderStatus = `mutation UpdateOrderStatus($id:String!,$status:String!,$reason:String){ + updateOrderStatus(id:$id,status:$status,reason:$reason){ + _id + orderStatus + } +} +` +export const updateStatus = `mutation UpdateStatus($id:String!,$orderStatus:String!){ + updateStatus(id:$id,orderStatus:$orderStatus){ + _id + orderStatus + } +} +` + +export const uploadToken = `mutation UploadToken($id:String!,$pushToken:String!){ + uploadToken(id:$id,pushToken:$pushToken){ + _id + pushToken + } +}` + +export const resetPassword = `mutation ResetPassword($password:String!,$token:String!){ + resetPassword(password:$password,token:$token){ + result + } +}` + +export const createRider = ` +mutation CreateRider($riderInput:RiderInput!){ + createRider( + riderInput:$riderInput + ){ + _id + name + username + password + phone + available + zone{ + _id + } + } + }` + +export const editRider = ` + mutation EditRider($riderInput:RiderInput!){ + editRider( + riderInput:$riderInput + ){ + _id + name + username + phone + zone{ + _id + } + } + }` +export const deleteRider = ` + mutation DeleteRider($id:String!){ + deleteRider(id:$id){ + _id + } + }` + +export const toggleAvailablity = ` + mutation ToggleRider($id:String){ + toggleAvailablity(id:$id){ + _id + } +}` + +export const assignRider = ` mutation AssignRider($id:String!,$riderId:String!){ + assignRider(id:$id,riderId:$riderId){ + _id + orderStatus + rider{ + _id + name + } + } +}` + +export const updatePaymentStatus = `mutation UpdatePaymentStatus($id:String!,$status:String!){ + updatePaymentStatus(id:$id,status:$status){ + _id + paymentStatus + paidAmount + } +} +` + +export const createOffer = `mutation CreateOffer($offer:OfferInput!){ + createOffer(offer:$offer){ + _id + name + tag + restaurants{ + _id + name + address + } + } +}` + +export const editOffer = `mutation EditOffer($offer:OfferInput!){ + editOffer(offer:$offer){ + _id + name + tag + restaurants{ + _id + name + address + } + } +}` + +export const deleteOffer = `mutation DeleteOffer($id:String!){ + deleteOffer(id:$id) +}` + +export const createOptions = `mutation CreateOptions($optionInput:CreateOptionInput){ + createOptions(optionInput:$optionInput){ + _id + options{ + _id + title + description + price + } + } +}` + +export const createAddons = `mutation CreateAddons($addonInput:AddonInput){ + createAddons(addonInput:$addonInput){ + _id + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + + } +}` +export const editAddon = `mutation editAddon($addonInput:editAddonInput){ + editAddon(addonInput:$addonInput){ + _id + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + } +}` + +export const deleteAddon = ` + mutation DeleteAddon($id:String!,$restaurant:String!){ + deleteAddon(id:$id,restaurant:$restaurant){ + _id + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + } + }` + +export const deleteOption = ` + mutation DeleteOption($id:String!,$restaurant:String!){ + deleteOption(id:$id,restaurant:$restaurant){ + _id + options{ + _id + title + description + price + } + } + }` +export const editOption = `mutation editOption($optionInput:editOptionInput){ + editOption(optionInput:$optionInput){ + _id + options{ + _id + title + description + price + } + } + }` + +export const createCoupon = `mutation CreateCoupon($couponInput:CouponInput!){ + createCoupon(couponInput:$couponInput){ + _id + title + discount + enabled + } +}` +export const editCoupon = `mutation editCoupon($couponInput:CouponInput!){ + editCoupon(couponInput:$couponInput){ + _id + title + discount + enabled + } + }` +export const deleteCoupon = `mutation DeleteCoupon($id:String!){ + deleteCoupon(id:$id) + }` + +export const createCuisine = `mutation CreateCuisine($cuisineInput:CuisineInput!){ + createCuisine(cuisineInput:$cuisineInput){ + _id + name + description + } + }` +export const editCuisine = `mutation editCuisine($cuisineInput:CuisineInput!){ + editCuisine(cuisineInput:$cuisineInput){ + _id + name + description + } + }` +export const deleteCuisine = `mutation DeleteCuisine($id:String!){ + deleteCuisine(id:$id) + }` + +export const createTipping = `mutation CreateTipping($tippingInput:TippingInput!){ + createTipping(tippingInput:$tippingInput){ + _id + tipVariations + enabled + } + }` + +export const editTipping = `mutation editTipping($tippingInput:TippingInput!){ + editTipping(tippingInput:$tippingInput){ + _id + tipVariations + enabled + } + }` + +export const createTaxation = `mutation CreateTaxation($taxationInput:TaxationInput!){ + createTaxation(taxationInput:$taxationInput){ + _id + taxationCharges + enabled + } + }` + +export const editTaxation = `mutation editTaxation($taxationInput:TaxationInput!){ + editTaxation(taxationInput:$taxationInput){ + _id + taxationCharges + enabled + } + }` + +export const createVendor = `mutation CreateVendor($vendorInput:VendorInput){ + createVendor(vendorInput:$vendorInput){ + _id + email + userType + } +}` + +export const editVendor = `mutation EditVendor($vendorInput:VendorInput){ + editVendor(vendorInput:$vendorInput){ + _id + email + } +}` + +export const editRestaurant = `mutation EditRestaurant($restaurantInput:RestaurantProfileInput!){ + editRestaurant(restaurant:$restaurantInput){ + _id + orderId + orderPrefix + name + image + slug + address + username + password + location{coordinates} + isAvailable + minimumOrder + tax + openingTimes{ + day + times{ + startTime + endTime + } + } + shopType + } +}` + +export const createZone = `mutation CreateZone($zone:ZoneInput!){ + createZone(zone:$zone){ + _id + title + description + location{coordinates} + isActive + } +}` + +export const editZone = `mutation EditZone($zone:ZoneInput!){ + editZone(zone:$zone){ + _id + title + description + location{coordinates} + isActive + } +}` + +export const deleteZone = `mutation DeleteZone($id:String!){ + deleteZone(id:$id){ + _id + title + description + location{coordinates} + isActive + } +}` + +export const vendorResetPassword = `mutation VendorResetPassword($oldPassword: String!, $newPassword: String!){ + vendorResetPassword(oldPassword: $oldPassword, newPassword: $newPassword) +}` + +export const deleteRestaurant = `mutation DeltetRestaurant($id:String!){ + deleteRestaurant(id:$id){ + _id + isActive + } +}` + +export const updateTimings = `mutation UpdateTimings($id:String!,$openingTimes:[TimingsInput]){ + updateTimings(id:$id, + openingTimes:$openingTimes){ + _id + openingTimes{ + day + times{ + startTime + endTime + } + } + } +}` + +export const sendNotificationUser = `mutation SendNotificationUser($notificationTitle:String, $notificationBody: String!){ + sendNotificationUser(notificationTitle:$notificationTitle,notificationBody:$notificationBody) +} +` +export const updateCommission = `mutation UpdateCommission($id:String!,$commissionRate:Float!){ + updateCommission(id:$id,commissionRate:$commissionRate){ + _id + commissionRate + } +}` +export const createRestaurant = `mutation CreateRestaurant($restaurant:RestaurantInput!,$owner:ID!){ + createRestaurant(restaurant:$restaurant,owner:$owner){ + _id + orderId + orderPrefix + name + slug + image + address + username + password + minimumOrder + tax + location{coordinates} + shopType + cuisines + } +}` + +export const updateDeliveryBoundsAndLocation = `mutation UPDATE_DELIVERY_BOUNDS_AND_LOCATION($id:ID!,$bounds:[[[Float!]]],$location:CoordinatesInput!){ + result :updateDeliveryBoundsAndLocation(id:$id,location:$location,bounds:$bounds){ + success + message + data{ + _id + deliveryBounds{ + coordinates + } + location{ + coordinates + } + } + } +}` + +export const updateWithdrawReqStatus = `mutation UpdateWithdrawRequest($id:ID!, $status:String!){ + updateWithdrawReqStatus(id:$id,status:$status){ + success + message + data{ + rider{ + _id + currentWalletAmount + } + withdrawRequest{ + _id + status + } + } + } +}` diff --git a/enatega-multivendor-admin/src/apollo/queries.js b/enatega-multivendor-admin/src/apollo/queries.js new file mode 100644 index 0000000..a14740b --- /dev/null +++ b/enatega-multivendor-admin/src/apollo/queries.js @@ -0,0 +1,703 @@ +export const getOrders = `query Orders($page:Int){ + allOrders(page:$page){ + _id + deliveryAddress + deliveryCharges + orderAmount + paidAmount + paymentMethod + orderId + user{ + _id + name + email + phone + } + items{ + _id + food{ + _id + title + description + image + } + variation{ + _id + title + price + discounted + } + addons{ + _id + title + description + quantityMinimum + quantityMaximum + options{ + _id + title + price + } + } + specialInstructions + quantity + } + reason + status + paymentStatus + orderStatus + createdAt + review{ + _id + rating + description + } + rider{ + _id + name + } + } + }` + +export const reviews = `query Reviews($restaurant:String!){ + reviews(restaurant:$restaurant){ + _id + order{ + _id + orderId + items{ + title + } + user{ + _id + name + email + } + } + restaurant{ + _id + name + image + } + rating + description + createdAt + } + } +` + +export const getOrdersByDateRange = `query GetOrdersByDateRange($startingDate: String!, $endingDate: String!, $restaurant: String!) { + getOrdersByDateRange(startingDate: $startingDate, endingDate: $endingDate, restaurant: $restaurant) { + totalAmountCashOnDelivery + countCashOnDeliveryOrders + } + + } +` + +export const getOrdersByRestaurant = `query ordersByRestId($restaurant:String!,$page:Int,$rows:Int,$search:String){ + ordersByRestId(restaurant:$restaurant,page:$page,rows:$rows,search:$search){ + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + details + label + } + items{ + _id + title + description + image + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + description + title + quantityMinimum + quantityMaximum + } + specialInstructions + isActive + createdAt + updatedAt + } + user{ + _id + name + phone + email + } + paymentMethod + paidAmount + orderAmount + orderStatus + status + paymentStatus + reason + isActive + createdAt + deliveryCharges + tipping + taxationAmount + rider{ + _id + name + username + available + } + } + }` + +export const getDashboardTotal = `query GetDashboardTotal($startingDate: String, $endingDate: String,$restaurant:String!){ + getDashboardTotal(starting_date: $startingDate, ending_date: $endingDate,restaurant:$restaurant){ + totalOrders + totalSales + } + }` +export const getDashboardSales = `query GetDashboardSales($startingDate: String, $endingDate: String,$restaurant:String!){ + getDashboardSales(starting_date: $startingDate, ending_date: $endingDate,restaurant:$restaurant){ + orders{ + day + amount + } + } + }` +export const getDashboardOrders = `query GetDashboardOrders($startingDate: String, $endingDate: String,$restaurant:String!){ + getDashboardOrders(starting_date: $startingDate, ending_date: $endingDate,restaurant:$restaurant){ + orders{ + day + count + } + } + }` + +export const getDashboardData = `query GetDashboardData($startingDate: String, $endingDate: String){ + getDashboardData(starting_date: $startingDate, ending_date: $endingDate){ + totalOrders + totalUsers + totalSales + orders{ + day + count + amount + } + } + }` + +export const getConfiguration = `query GetConfiguration{ + configuration{ + _id + email + emailName + password + enableEmail + clientId + clientSecret + sandbox + publishableKey + secretKey + currency + currencySymbol + deliveryRate + twilioAccountSid + twilioAuthToken + twilioPhoneNumber + twilioEnabled + formEmail + sendGridApiKey + sendGridEnabled + sendGridEmail + sendGridEmailName + sendGridPassword + dashboardSentryUrl + webSentryUrl + apiSentryUrl + customerAppSentryUrl + restaurantAppSentryUrl + riderAppSentryUrl + googleApiKey + cloudinaryUploadUrl + cloudinaryApiKey + webAmplitudeApiKey + appAmplitudeApiKey + webClientID + androidClientID + iOSClientID + expoClientID + + googleMapLibraries + googleColor + termsAndConditions + privacyPolicy + testOtp + firebaseKey + authDomain + projectId + storageBucket + msgSenderId + appId + measurementId + isPaidVersion + skipEmailVerification + skipMobileVerification + } + }` + +export const orderCount = ` +query OrderCount($restaurant:String!){ + orderCount(restaurant:$restaurant) +}` + +export const getActiveOrders = `query GetActiveOrders($restaurantId:ID){ + getActiveOrders(restaurantId:$restaurantId){ + _id + zone{ + _id + } + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + details + label + } + items{ + _id + title + description + image + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + description + title + quantityMinimum + quantityMaximum + } + specialInstructions + isActive + createdAt + updatedAt + } + user{ + _id + name + phone + email + } + paymentMethod + paidAmount + orderAmount + orderStatus + isPickedUp + status + paymentStatus + reason + isActive + createdAt + deliveryCharges + rider{ + _id + name + username + available + } + } +}` + +export const getRidersByZone = `query RidersByZone($id:String!){ + ridersByZone(id:$id){ + _id + name + username + password + phone + available + zone{ + _id + title + } + } +}` + +export const getZones = `query Zones{ + zones{ + _id + title + description + location{coordinates} + isActive + } +}` + +export const getVendors = `query Vendors{ + vendors{ + _id + email + userType + restaurants{ + _id + orderId + orderPrefix + slug + name + image + address + location{coordinates} + zone{ + _id + title + } + shopType + } + } +}` + +export const getVendor = `query GetVendor($id:String!){ + getVendor(id:$id){ + _id + email + userType + restaurants{ + _id + orderId + orderPrefix + slug + name + image + address + location{coordinates} + shopType + } + } +}` + +export const getTaxation = `query Taxes{ + taxes { + _id + taxationCharges + enabled + } + }` + +export const getCoupons = `query Coupons{ + coupons { + _id + title + discount + enabled + } + }` + + export const getCuisines = `query Cuisines{ + cuisines { + _id + name + description + } + }` + +export const getTipping = `query Tips{ + tips { + _id + tipVariations + enabled + } + }` + +export const getAddons = `query Addons{ + addons{ + _id + title + description + options{ + _id + title + description + price + } + quantityMinimum + quantityMaximum + }}` + +export const getOptions = `query Options{ + options { + _id + title + description + price + } + } + ` +export const getPaymentStatuses = `query{ + getPaymentStatuses + }` + +export const restaurantByOwner = `query RestaurantByOwner($id:String){ + restaurantByOwner(id:$id){ + _id + email + userType + restaurants{ + _id + orderId + orderPrefix + name + slug + image + address + username + password + location{coordinates} + shopType + } + } +}` + +export const restaurantList = `query RestaurantList{ + restaurantList{ + _id + name + address + } +}` + +export const restaurants = `query Restaurants{ + restaurants{ + _id + name + image + orderPrefix + slug + address + deliveryTime + minimumOrder + isActive + commissionRate + tax + owner{ + _id + email + } + shopType + } +} +` + +export const getRestaurantProfile = `query Restaurant($id:String){ + restaurant(id:$id) + { + _id + orderId + orderPrefix + slug + name + image + address + location{coordinates} + deliveryBounds{ + coordinates + } + username + password + deliveryTime + minimumOrder + tax + isAvailable + stripeDetailsSubmitted + openingTimes{ + day + times{ + startTime + endTime + } + } + owner{ + _id + email + } + shopType + cuisines + } +}` + +export const getRestaurantDetail = `query Restaurant($id:String){ + restaurant(id:$id){ + _id + orderId + orderPrefix + slug + name + image + address + location{coordinates} + deliveryTime + minimumOrder + tax + categories{ + _id + title + foods{ + _id + title + description + variations{ + _id + title + price + discounted + addons + } + image + isActive + } + } + options{ + _id + title + description + price + } + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + shopType + } +}` + +export const getOffers = `query Offers{ + offers{ + _id + name + tag + restaurants{ + _id + name + } + } +}` + +export const getSections = `query Sections{ + sections{ + _id + name + enabled + restaurants{ + _id + name + } + } +}` + +export const pageCount = ` +query PageCount($restaurant:String!){ + pageCount(restaurant:$restaurant) +} +` +export const getUsers = `query{ + users{ + _id + name + email + phone + addresses{ + location{coordinates} + deliveryAddress + } + } + }` + +export const getRiders = `query{ + riders{ + _id + name + username + password + phone + available + zone{ + _id + title + } + } + }` + +export const getAvailableRiders = `query{ + availableRiders{ + _id + name + username + phone + available + zone{ + _id + } + } + }` + +export const withdrawRequestQuery = `query GetWithdrawRequests($offset:Int){ + getAllWithdrawRequests(offset:$offset){ + success + message + data{ + _id + requestId + requestAmount + requestTime + rider{ + _id + name + currentWalletAmount + } + status + } + pagination{ + total + } + } + }` diff --git a/enatega-multivendor-admin/src/apollo/subscriptions.js b/enatega-multivendor-admin/src/apollo/subscriptions.js new file mode 100644 index 0000000..c7ce9b3 --- /dev/null +++ b/enatega-multivendor-admin/src/apollo/subscriptions.js @@ -0,0 +1,85 @@ +export const subscribePlaceOrder = `subscription SubscribePaceOrder($restaurant:String!){ + subscribePlaceOrder(restaurant:$restaurant){ + userId + origin + order{ + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + details + label + } + items{ + _id + title + description + image + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + description + title + quantityMinimum + quantityMaximum + } + specialInstructions + isActive + createdAt + updatedAt + } + user{ + _id + name + phone + email + } + paymentMethod + paidAmount + orderAmount + orderStatus + status + paymentStatus + reason + isActive + createdAt + deliveryCharges + rider{ + _id + name + username + available + } + } + } + }` + +export const subscriptionOrder = `subscription SubscriptionOrder($id:String!){ + subscriptionOrder(id:$id){ + _id + orderStatus + rider{ + _id + } + } + }` diff --git a/enatega-multivendor-admin/src/app.js b/enatega-multivendor-admin/src/app.js new file mode 100644 index 0000000..bb5cc16 --- /dev/null +++ b/enatega-multivendor-admin/src/app.js @@ -0,0 +1,164 @@ +import React, { useEffect, useState } from 'react' +import { getToken, onMessage } from 'firebase/messaging' +import GoogleMapsLoader from './components/GoogleMapsLoader/GoogleMapsLoader.js' +import { Box, CircularProgress } from '@mui/material' +import AdminLayout from './layouts/Admin.jsx' +import RestaurantLayout from './layouts/Restaurant.jsx' +import AuthLayout from './layouts/Auth.jsx' +import SuperAdminLayout from './layouts/SuperAdmin.jsx' +import { PrivateRoute } from './views/PrivateRoute' +import { AdminPrivateRoute } from './views/AdminPrivateRoute' +import { HashRouter, Route, Switch, Redirect } from 'react-router-dom' +import * as Sentry from '@sentry/react' +import { isFirebaseSupported, initialize } from './firebase.js' +import { uploadToken } from './apollo' +import { gql, useApolloClient } from '@apollo/client' +import ConfigurableValues from './config/constants.js' +import TawkMessengerReact from '@tawk.to/tawk-messenger-react' + +require('./i18n') + +const UPLOAD_TOKEN = gql` + ${uploadToken} +` + +const App = () => { + const { + VAPID_KEY, + FIREBASE_KEY, + AUTH_DOMAIN, + PROJECT_ID, + STORAGE_BUCKET, + MSG_SENDER_ID, + APP_ID, + MEASUREMENT_ID, + GOOGLE_MAPS_KEY + } = ConfigurableValues() + console.log('GOOGLE_MAPS_KEY_App', GOOGLE_MAPS_KEY) + // const [mapsKey, setMapsKey] = useState(null) + // useEffect(() => { + // if (GOOGLE_MAPS_KEY) { + // setMapsKey(GOOGLE_MAPS_KEY) + // } + // }, [GOOGLE_MAPS_KEY]) + const client = useApolloClient() + const [user] = useState(localStorage.getItem('user-enatega')) + const userType = localStorage.getItem('user-enatega') + ? JSON.parse(localStorage.getItem('user-enatega')).userType + : null + useEffect(() => { + if (user) { + const initializeFirebase = async() => { + if (await isFirebaseSupported()) { + const messaging = initialize( + FIREBASE_KEY, + AUTH_DOMAIN, + PROJECT_ID, + STORAGE_BUCKET, + MSG_SENDER_ID, + APP_ID, + MEASUREMENT_ID + ) + Notification.requestPermission() + .then(() => { + getToken(messaging, { + vapidKey: VAPID_KEY + }) + .then(token => { + localStorage.setItem('messaging-token', token) + client + .mutate({ + mutation: UPLOAD_TOKEN, + variables: { + id: JSON.parse(user).userId, + pushToken: token + } + }) + .then(() => { + console.log('upload token success') + }) + .catch(error => { + console.log('upload token error', error) + }) + }) + .catch(err => { + console.log('getToken error', err) + }) + }) + .catch(console.log) + + onMessage(messaging, function(payload) { + console.log(payload) + // Customize notification here + // const { title, body } = payload.notification + // eslint-disable-next-line no-restricted-globals + var notificationTitle = 'New Order on Enatega Multivendor' + var notificationOptions = { + body: payload.data.orderid, + icon: 'https://multivendor-admin.ninjascode.com/favicon.png' + } + const nt = new Notification(notificationTitle, notificationOptions) + nt.onclick = function(event) { + event.preventDefault() // prevent the browser from focusing the Notification's tab + window.open('https://multivendor-admin.ninjascode.com/dashboard') + nt.close() + } + }) + } + } + initializeFirebase() + } + }, [user]) + const route = userType + ? userType === 'VENDOR' + ? '/restaurant/list' + : '/super_admin/vendors' + : '/auth/login' + return ( + + + {GOOGLE_MAPS_KEY ? ( + + + + } + /> + } + /> + } + /> + } + /> + + + + + ) : ( + + + + )} + + ) +} +export default Sentry.withProfiler(App) diff --git a/enatega-multivendor-admin/src/assets/img/LoginPageIcon.png b/enatega-multivendor-admin/src/assets/img/LoginPageIcon.png new file mode 100644 index 0000000..d44cee3 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/LoginPageIcon.png differ diff --git a/enatega-multivendor-admin/src/assets/img/RestStat.png b/enatega-multivendor-admin/src/assets/img/RestStat.png new file mode 100644 index 0000000..03e2821 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/RestStat.png differ diff --git a/enatega-multivendor-admin/src/assets/img/RiderStat.png b/enatega-multivendor-admin/src/assets/img/RiderStat.png new file mode 100644 index 0000000..b01f660 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/RiderStat.png differ diff --git a/enatega-multivendor-admin/src/assets/img/UserStat.png b/enatega-multivendor-admin/src/assets/img/UserStat.png new file mode 100644 index 0000000..6142ddd Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/UserStat.png differ diff --git a/enatega-multivendor-admin/src/assets/img/VendorStat.png b/enatega-multivendor-admin/src/assets/img/VendorStat.png new file mode 100644 index 0000000..cd91ee0 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/VendorStat.png differ diff --git a/enatega-multivendor-admin/src/assets/img/bell.png b/enatega-multivendor-admin/src/assets/img/bell.png new file mode 100644 index 0000000..d260be8 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/bell.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/argon-react-white.png b/enatega-multivendor-admin/src/assets/img/brand/argon-react-white.png new file mode 100644 index 0000000..bd4d91d Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/argon-react-white.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/argon-react.png b/enatega-multivendor-admin/src/assets/img/brand/argon-react.png new file mode 100644 index 0000000..964fd56 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/argon-react.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/blue.png b/enatega-multivendor-admin/src/assets/img/brand/blue.png new file mode 100644 index 0000000..88f515f Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/blue.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/favicon.png b/enatega-multivendor-admin/src/assets/img/brand/favicon.png new file mode 100644 index 0000000..53997a0 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/favicon.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/logo.png b/enatega-multivendor-admin/src/assets/img/brand/logo.png new file mode 100644 index 0000000..6bc6974 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/logo.png differ diff --git a/enatega-multivendor-admin/src/assets/img/brand/white.png b/enatega-multivendor-admin/src/assets/img/brand/white.png new file mode 100644 index 0000000..df2708f Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/brand/white.png differ diff --git a/enatega-multivendor-admin/src/assets/img/icons/common/github.svg b/enatega-multivendor-admin/src/assets/img/icons/common/github.svg new file mode 100644 index 0000000..2227d5e --- /dev/null +++ b/enatega-multivendor-admin/src/assets/img/icons/common/github.svg @@ -0,0 +1,12 @@ + + + + UI/icons/dark/github + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/enatega-multivendor-admin/src/assets/img/icons/common/google.svg b/enatega-multivendor-admin/src/assets/img/icons/common/google.svg new file mode 100644 index 0000000..999a208 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/img/icons/common/google.svg @@ -0,0 +1,17 @@ + + + + UI/icons/color/google + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/enatega-multivendor-admin/src/assets/img/loginBg.png b/enatega-multivendor-admin/src/assets/img/loginBg.png new file mode 100644 index 0000000..6fe0cc0 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/loginBg.png differ diff --git a/enatega-multivendor-admin/src/assets/img/stats.png b/enatega-multivendor-admin/src/assets/img/stats.png new file mode 100644 index 0000000..3220214 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/stats.png differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/angular.jpg b/enatega-multivendor-admin/src/assets/img/theme/angular.jpg new file mode 100644 index 0000000..3fdc331 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/angular.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/bootstrap.jpg b/enatega-multivendor-admin/src/assets/img/theme/bootstrap.jpg new file mode 100644 index 0000000..183db14 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/bootstrap.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/profile-cover.jpg b/enatega-multivendor-admin/src/assets/img/theme/profile-cover.jpg new file mode 100644 index 0000000..7f58de1 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/profile-cover.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/react.jpg b/enatega-multivendor-admin/src/assets/img/theme/react.jpg new file mode 100644 index 0000000..a05c8e6 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/react.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/sketch.jpg b/enatega-multivendor-admin/src/assets/img/theme/sketch.jpg new file mode 100644 index 0000000..8486f4f Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/sketch.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/team-1-800x800.jpg b/enatega-multivendor-admin/src/assets/img/theme/team-1-800x800.jpg new file mode 100644 index 0000000..7fb81de Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/team-1-800x800.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/team-2-800x800.jpg b/enatega-multivendor-admin/src/assets/img/theme/team-2-800x800.jpg new file mode 100644 index 0000000..181e370 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/team-2-800x800.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/team-3-800x800.jpg b/enatega-multivendor-admin/src/assets/img/theme/team-3-800x800.jpg new file mode 100644 index 0000000..0876acd Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/team-3-800x800.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/team-4-800x800.jpg b/enatega-multivendor-admin/src/assets/img/theme/team-4-800x800.jpg new file mode 100644 index 0000000..8aa9ce2 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/team-4-800x800.jpg differ diff --git a/enatega-multivendor-admin/src/assets/img/theme/vue.jpg b/enatega-multivendor-admin/src/assets/img/theme/vue.jpg new file mode 100644 index 0000000..9b5946e Binary files /dev/null and b/enatega-multivendor-admin/src/assets/img/theme/vue.jpg differ diff --git a/enatega-multivendor-admin/src/assets/svg/addons.svg b/enatega-multivendor-admin/src/assets/svg/addons.svg new file mode 100644 index 0000000..92db313 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/addons.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/back.svg b/enatega-multivendor-admin/src/assets/svg/back.svg new file mode 100644 index 0000000..3850ebf --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/category.svg b/enatega-multivendor-admin/src/assets/svg/category.svg new file mode 100644 index 0000000..43d97d4 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/category.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/commission.svg b/enatega-multivendor-admin/src/assets/svg/commission.svg new file mode 100644 index 0000000..1981822 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/commission.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/configuration.svg b/enatega-multivendor-admin/src/assets/svg/configuration.svg new file mode 100644 index 0000000..abea708 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/configuration.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/coupons.svg b/enatega-multivendor-admin/src/assets/svg/coupons.svg new file mode 100644 index 0000000..7f26682 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/coupons.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/dashboard.svg b/enatega-multivendor-admin/src/assets/svg/dashboard.svg new file mode 100644 index 0000000..96156d8 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/delivery.svg b/enatega-multivendor-admin/src/assets/svg/delivery.svg new file mode 100644 index 0000000..e43360b --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/delivery.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/food.svg b/enatega-multivendor-admin/src/assets/svg/food.svg new file mode 100644 index 0000000..61f38a6 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/food.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/header.svg b/enatega-multivendor-admin/src/assets/svg/header.svg new file mode 100644 index 0000000..4ba9766 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/header.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/header1.png b/enatega-multivendor-admin/src/assets/svg/header1.png new file mode 100644 index 0000000..5f81969 Binary files /dev/null and b/enatega-multivendor-admin/src/assets/svg/header1.png differ diff --git a/enatega-multivendor-admin/src/assets/svg/home.svg b/enatega-multivendor-admin/src/assets/svg/home.svg new file mode 100644 index 0000000..838ceeb --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/location.svg b/enatega-multivendor-admin/src/assets/svg/location.svg new file mode 100644 index 0000000..0d66a32 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/location.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/logo.svg b/enatega-multivendor-admin/src/assets/svg/logo.svg new file mode 100644 index 0000000..009750d --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/notifications.svg b/enatega-multivendor-admin/src/assets/svg/notifications.svg new file mode 100644 index 0000000..a8d25e9 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/notifications.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/option.svg b/enatega-multivendor-admin/src/assets/svg/option.svg new file mode 100644 index 0000000..fa4fe41 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/option.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/order.svg b/enatega-multivendor-admin/src/assets/svg/order.svg new file mode 100644 index 0000000..2ec7519 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/order.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/payment.svg b/enatega-multivendor-admin/src/assets/svg/payment.svg new file mode 100644 index 0000000..75da37c --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/payment.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/rating.svg b/enatega-multivendor-admin/src/assets/svg/rating.svg new file mode 100644 index 0000000..879feab --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/rating.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/request.svg b/enatega-multivendor-admin/src/assets/svg/request.svg new file mode 100644 index 0000000..0e86bff --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/request.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/restSection.svg b/enatega-multivendor-admin/src/assets/svg/restSection.svg new file mode 100644 index 0000000..a30970a --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/restSection.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/restaurant.svg b/enatega-multivendor-admin/src/assets/svg/restaurant.svg new file mode 100644 index 0000000..c6b4e88 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/restaurant.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/riders.svg b/enatega-multivendor-admin/src/assets/svg/riders.svg new file mode 100644 index 0000000..72dc0ba --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/riders.svg @@ -0,0 +1,4 @@ + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/CommisionRate.svg b/enatega-multivendor-admin/src/assets/svg/svg/CommisionRate.svg new file mode 100644 index 0000000..e8352f6 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/CommisionRate.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Configuration.svg b/enatega-multivendor-admin/src/assets/svg/svg/Configuration.svg new file mode 100644 index 0000000..e5dc416 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Configuration.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Coupons.svg b/enatega-multivendor-admin/src/assets/svg/svg/Coupons.svg new file mode 100644 index 0000000..d5d1ba1 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Coupons.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Dispatch.svg b/enatega-multivendor-admin/src/assets/svg/svg/Dispatch.svg new file mode 100644 index 0000000..ad5bd03 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Dispatch.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Home.svg b/enatega-multivendor-admin/src/assets/svg/svg/Home.svg new file mode 100644 index 0000000..4df34cc --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Home.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Notification.svg b/enatega-multivendor-admin/src/assets/svg/svg/Notification.svg new file mode 100644 index 0000000..47bb5fc --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Notification.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Request.svg b/enatega-multivendor-admin/src/assets/svg/svg/Request.svg new file mode 100644 index 0000000..6e919c6 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Request.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Restaurant.svg b/enatega-multivendor-admin/src/assets/svg/svg/Restaurant.svg new file mode 100644 index 0000000..0dbc675 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Restaurant.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/RestaurantSection.svg b/enatega-multivendor-admin/src/assets/svg/svg/RestaurantSection.svg new file mode 100644 index 0000000..fcff06a --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/RestaurantSection.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Rider.svg b/enatega-multivendor-admin/src/assets/svg/svg/Rider.svg new file mode 100644 index 0000000..156767d --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Rider.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Tipping.svg b/enatega-multivendor-admin/src/assets/svg/svg/Tipping.svg new file mode 100644 index 0000000..fae4bbf --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Tipping.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/User.svg b/enatega-multivendor-admin/src/assets/svg/svg/User.svg new file mode 100644 index 0000000..2393f01 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/User.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/Vendors.svg b/enatega-multivendor-admin/src/assets/svg/svg/Vendors.svg new file mode 100644 index 0000000..ec17b96 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/Vendors.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/svg/dashboard.svg b/enatega-multivendor-admin/src/assets/svg/svg/dashboard.svg new file mode 100644 index 0000000..4df34cc --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/svg/dashboard.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-admin/src/assets/svg/timings.svg b/enatega-multivendor-admin/src/assets/svg/timings.svg new file mode 100644 index 0000000..ad02434 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/timings.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/tipping.svg b/enatega-multivendor-admin/src/assets/svg/tipping.svg new file mode 100644 index 0000000..f495430 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/tipping.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/user.svg b/enatega-multivendor-admin/src/assets/svg/user.svg new file mode 100644 index 0000000..e855b21 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/user.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/vendor.svg b/enatega-multivendor-admin/src/assets/svg/vendor.svg new file mode 100644 index 0000000..e5962cc --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/vendor.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/vendorsIcon.svg b/enatega-multivendor-admin/src/assets/svg/vendorsIcon.svg new file mode 100644 index 0000000..c2bc8e8 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/vendorsIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/assets/svg/zones.svg b/enatega-multivendor-admin/src/assets/svg/zones.svg new file mode 100644 index 0000000..9f58c84 --- /dev/null +++ b/enatega-multivendor-admin/src/assets/svg/zones.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-admin/src/components/Addon/Addon.jsx b/enatega-multivendor-admin/src/components/Addon/Addon.jsx new file mode 100644 index 0000000..ce6f806 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Addon/Addon.jsx @@ -0,0 +1,466 @@ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useQuery, useMutation, gql } from '@apollo/client' +import { getRestaurantDetail, createAddons, editAddon } from '../../apollo' +import OptionsComponent from '../Option/Option' +import { validateFunc } from '../../constraints/constraints' +import { + Box, + Typography, + Input, + Alert, + Modal, + Button, + Grid, + Checkbox, + FormControlLabel, + useTheme +} from '@mui/material' +import AddIcon from '@mui/icons-material/Add' +import RemoveIcon from '@mui/icons-material/Remove' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' + +const GET_OPTIONS = gql` + ${getRestaurantDetail} +` +const CREATE_ADDONS = gql` + ${createAddons} +` +const EDIT_ADDON = gql` + ${editAddon} +` + +function Addon(props) { + const theme = useTheme() + const { t } = props + const restaurantId = localStorage.getItem('restaurantId') + const onCompleted = ({ createAddons, editAddon }) => { + if (createAddons) { + addonSetter([ + { + title: '', + description: '', + quantityMinimum: 0, + quantityMaximum: 1, + options: [], + titleError: false, + optionsError: false, + quantityMinimumError: false, + quantityMaximumError: false + } + ]) + successSetter(t('Saved')) + mainErrorSetter('') + } + if (editAddon) { + successSetter(t('Saved')) + mainErrorSetter('') + } + setTimeout(onDismiss, 3000) + } + const onError = error => { + mainErrorSetter(` ${t('errorWhileSaving')} ${error}`) + successSetter('') + setTimeout(onDismiss, 3000) + } + const [addon, addonSetter] = useState( + props.addon + ? [ + { + ...props.addon, + options: props.addon.options, + titleError: false, + optionsError: false, + quantityMinimumError: false, + quantityMaximumError: false + } + ] + : [ + { + title: '', + description: '', + quantityMinimum: 0, + quantityMaximum: 1, + options: [], + titleError: false, + optionsError: false, + quantityMinimumError: false, + quantityMaximumError: false + } + ] + ) + const [modal, modalSetter] = useState(false) + const [addonIndex, addonIndexSetter] = useState(0) + const [success, successSetter] = useState('') + const [mainError, mainErrorSetter] = useState('') + + const onChange = (event, index, state) => { + const addons = addon + addons[index][state] = event.target.value + addonSetter([...addons]) + } + const mutation = props.addon ? EDIT_ADDON : CREATE_ADDONS + + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_OPTIONS, + { + variables: { id: restaurantId } + } + ) + const [mutate, { loading }] = useMutation(mutation, { onError, onCompleted }) + const onBlur = (index, state) => { + const addons = addon + if (state === 'title') { + addons[index].titleError = !!validateFunc( + { addonTitle: addons[index][state] }, + 'addonTitle' + ) + } + if (state === 'quantityMinimum') { + addons[index].quantityMinimumError = !!validateFunc( + { addonQuantityMinimum: addons[index][state] }, + 'addonQuantityMinimum' + ) + addons[index].quantityMinimumError = + addons[index].quantityMinimumError || + addons[index].quantityMinimum > addons[index].quantityMaximum + addons[index].quantityMinimumError = + addons[index].options.length < addons[index][state] + } + if (state === 'quantityMaximum') { + addons[index].quantityMaximumError = !!validateFunc( + { addonQuantityMaximum: addons[index][state] }, + 'addonQuantityMaximum' + ) + addons[index].quantityMaximumError = + addons[index].quantityMaximumError || + addons[index].quantityMaximum < addons[index].quantityMinimum + } + if (state === 'options') { + addons[index].optionsError = addons[index].options.length === 0 + } + addonSetter([...addons]) + } + const onSelectOption = (index, id) => { + const addons = addon + const option = addons[index].options.indexOf(id) + if (option < 0) addons[index].options.push(id) + else addons[index].options.splice(option, 1) + addonSetter([...addons]) + } + const updateOptions = ids => { + const addons = addon + addons[addonIndex].options = addons[addonIndex].options.concat(ids) + addonSetter([...addons]) + } + const onAdd = index => { + const addons = addon + if (index === addons.length - 1) { + addons.push({ + title: '', + description: '', + quantityMinimum: 0, + quantityMaximum: 1, + options: [] + }) + } else { + addons.splice(index + 1, 0, { + title: '', + description: '', + quantityMinimum: 0, + quantityMaximum: 1, + options: [] + }) + } + addonSetter([...addons]) + } + const onRemove = index => { + if (addon.length === 1 && index === 0) { + return + } + const addons = addon + addons.splice(index, 1) + addonSetter([...addons]) + } + const toggleModal = index => { + modalSetter(prev => !prev) + addonIndexSetter(index) + } + const validate = () => { + const addons = addon + addons.map((addon, index) => { + onBlur(index, 'title') + onBlur(index, 'description') + onBlur(index, 'quantityMinimum') + onBlur(index, 'quantityMaximum') + onBlur(index, 'options') + return addon + }) + const error = addons.filter( + addon => + addon.titleError || + addon.quantityMinimumError || + addon.quantityMaximumError || + addon.optionsError + ) + if (!error.length) return true + return false + } + + const onDismiss = () => { + mainErrorSetter('') + successSetter('') + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + + {t('Addons')} + + + + + + {addon.map((addonItem, index) => ( + + + + { + onRemove(index) + }} + /> + { + onAdd(index) + }} + /> + + {t('Title')} + { + onChange(event, index, 'title') + }} + disableUnderline + className={[ + globalClasses.input, + addonItem.titleError === true ? globalClasses.inputError : '' + ]} + /> + + {t('Description')} + + { + onChange(event, index, 'description') + }} + disableUnderline + className={[ + globalClasses.input, + addonItem.descriptionError === true + ? globalClasses.inputError + : '' + ]} + /> + + {t('MinQuantity')} + + { + onChange(event, index, 'quantityMinimum') + }} + disableUnderline + className={[ + globalClasses.input, + addonItem.quantityMinimumError === true + ? globalClasses.inputError + : '' + ]} + /> + + {t('MaxQuantity')} + + { + onChange(event, index, 'quantityMaximum') + }} + disableUnderline + className={[ + globalClasses.input, + addonItem.quantityMaximumError === true + ? globalClasses.inputError + : '' + ]} + /> + + + + + {t('Options')} + + + + + + {loadingQuery ? Loading ... : null} + {errorQuery ? ( + + Error! {errorQuery.message} + + ) : null} + {data && + data.restaurant.options.map(option => ( + + onSelectOption(index, option._id)} + /> + } + label={`${option.title} (Description: ${option.description})(Price: ${option.price})`} + /> + + ))} + + + + + ))} + + + + + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + + + { + toggleModal() + }}> + + + + ) +} +export default withTranslation()(Addon) diff --git a/enatega-multivendor-admin/src/components/Addon/styles.js b/enatega-multivendor-admin/src/components/Addon/styles.js new file mode 100644 index 0000000..c6e71c0 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Addon/styles.js @@ -0,0 +1,65 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + width60: { + width: '65%', + alignSelf: 'center' + }, + heading: { + backgroundColor: theme.palette.primary.main3, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + form: { + margin: 25, + alignItems: 'center' + }, + text: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + button: { + backgroundColor: theme.palette.common.black, + height: 35, + borderRadius: 15, + color: theme.palette.primary.main2, + fontWeight: 'bold', + border: 'none', + margin: '20px 0 20px 0', + '&:hover': { + backgroundColor: theme.palette.primary.main, + color: theme.palette.common.white + } + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Alert/index.jsx b/enatega-multivendor-admin/src/components/Alert/index.jsx new file mode 100644 index 0000000..4c2119e --- /dev/null +++ b/enatega-multivendor-admin/src/components/Alert/index.jsx @@ -0,0 +1,23 @@ +import React from 'react' +import Alert from '@material-ui/lab/Alert' + +const styles = { + alert: { + left: '0', + pointerEvents: 'none', + position: 'fixed', + top: 0, + width: '100%', + zIndex: '1500' + } +} + +const AlertMessage = props => { + return ( + + {props.message} + + ) +} + +export default AlertMessage diff --git a/enatega-multivendor-admin/src/components/Category/Category.jsx b/enatega-multivendor-admin/src/components/Category/Category.jsx new file mode 100644 index 0000000..86fb88f --- /dev/null +++ b/enatega-multivendor-admin/src/components/Category/Category.jsx @@ -0,0 +1,128 @@ +import React, { useState } from 'react' +import { useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' + +import { Box, Typography, Input, Button, Alert } from '@mui/material' + +import { editCategory, createCategory } from '../../apollo' +import useGlobalStyles from '../../utils/globalStyles' +import useStyles from '../styles' + +const CREATE_CATEGORY = gql` + ${createCategory} +` +const EDIT_CATEGORY = gql` + ${editCategory} +` + +function Category(props) { + const mutation = props.category ? EDIT_CATEGORY : CREATE_CATEGORY + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [category, setCategory] = useState( + props.category ? props.category.title : '' + ) + const restaurantId = localStorage.getItem('restaurantId') + const onCompleted = data => { + const message = props.category + ? t('CategoryUpdatedSuccessfully') + : t('CategoryAddedSuccessfully') + successSetter(message) + mainErrorSetter('') + setCategory('') + setTimeout(hideAlert, 3000) + } + const onError = error => { + const message = `${t('ActionFailedTryAgain')} ${error}` + successSetter('') + mainErrorSetter(message) + setTimeout(hideAlert, 3000) + } + const [mutate, { loading }] = useMutation(mutation, { onError, onCompleted }) + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + const { t } = props + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.category ? t('Edit Category') : t('Add Category')} + + + + +
+ + {t('Name')} + { + setCategory(e.target.value) + }} + disableUnderline + className={globalClasses.input} + /> + + + + + + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+
+ ) +} + +export default withTranslation()(Category) diff --git a/enatega-multivendor-admin/src/components/Configuration/Amplitude/Amplitude.jsx b/enatega-multivendor-admin/src/components/Configuration/Amplitude/Amplitude.jsx new file mode 100644 index 0000000..879214b --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Amplitude/Amplitude.jsx @@ -0,0 +1,150 @@ +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveAmplitudeApiKeyConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_AMPLITUDE_API_KEY_CONFIGURATION = gql` + ${saveAmplitudeApiKeyConfiguration} +` + +function AmplitudeApiKeyConfiguration(props) { + const formRef = useRef() + const [webAmplitudeApiKey] = useState(props.webAmplitudeApiKey || '') + const [appAmplitudeApiKey] = useState(props.appAmplitudeApiKey || '') + + const [webAmplitudeApiKeyError, setWebAmplitudeApiKeyError] = useState(null) + const [appAmplitudeApiKeyError, setAppAmplitudeApiKeyError] = useState(null) + + const [mutate, { loading }] = useMutation( + SAVE_AMPLITUDE_API_KEY_CONFIGURATION + ) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let webAmplitudeApiKeyResult = true + let appAmplitudeApiKeyResult = true + + webAmplitudeApiKeyResult = !validateFunc( + { webAmplitudeApiKey: formRef.current['input-webAmplitudeApiKey'].value }, + 'webAmplitudeApiKey' + ) + appAmplitudeApiKeyResult = !validateFunc( + { appAmplitudeApiKey: formRef.current['input-appAmplitudeApiKey'].value }, + 'appAmplitudeApiKey' + ) + + setWebAmplitudeApiKeyError(webAmplitudeApiKeyResult) + setAppAmplitudeApiKeyError(appAmplitudeApiKeyResult) + + return webAmplitudeApiKeyResult && appAmplitudeApiKeyResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Amplitude API Key + + + + + +
+ + + Web Amplitude API Key + + + onBlur( + setWebAmplitudeApiKeyError, + 'webAmplitudeApiKey', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + webAmplitudeApiKeyError === false + ? globalClasses.inputError + : webAmplitudeApiKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + App Amplitude API Key + + + onBlur( + setAppAmplitudeApiKeyError, + 'appAmplitudeApiKey', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + appAmplitudeApiKeyError === false + ? globalClasses.inputError + : appAmplitudeApiKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(AmplitudeApiKeyConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/App/App.jsx b/enatega-multivendor-admin/src/components/Configuration/App/App.jsx new file mode 100644 index 0000000..5070b90 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/App/App.jsx @@ -0,0 +1,187 @@ +// AppConfigurations.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveAppConfiguration } from '../../../apollo' // Update with the correct import path +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_APP_CONFIGURATION = gql` + ${saveAppConfiguration} +` + +function AppConfigurations(props) { + const formRef = useRef() + + const [termsAndConditions] = useState(props.termsAndConditions || '') + const [privacyPolicy] = useState(props.privacyPolicy || '') + const [testOtp] = useState(props.testOtp || '') + + const [termsAndConditionsError, setTermsAndConditionsError] = useState(null) + const [privacyPolicyError, setPrivacyPolicyError] = useState(null) + const [testOtpError, setTestOtpError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_APP_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let termsAndConditionsResult = true + let privacyPolicyResult = true + let testOtpResult = true + + termsAndConditionsResult = !validateFunc( + { termsAndConditions: formRef.current['input-termsAndConditions'].value }, + 'termsAndConditions' + ) + privacyPolicyResult = !validateFunc( + { privacyPolicy: formRef.current['input-privacyPolicy'].value }, + 'privacyPolicy' + ) + testOtpResult = !validateFunc( + { testOtp: formRef.current['input-testOtp'].value }, + 'testOtp' + ) + + setTermsAndConditionsError(termsAndConditionsResult) + setPrivacyPolicyError(privacyPolicyResult) + setTestOtpError(testOtpResult) + + return termsAndConditionsResult && privacyPolicyResult && testOtpResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + APP Configuration + + + + +
+ + + Terms and Conditions + + + onBlur( + setTermsAndConditionsError, + 'termsAndConditions', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + termsAndConditionsError === false + ? globalClasses.inputError + : termsAndConditionsError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Privacy Policy + + + onBlur( + setPrivacyPolicyError, + 'privacyPolicy', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + privacyPolicyError === false + ? globalClasses.inputError + : privacyPolicyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + Test OTP + + onBlur(setTestOtpError, 'testOtp', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + testOtpError === false + ? globalClasses.inputError + : testOtpError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + +
+
+
+ ) +} + +export default withTranslation()(AppConfigurations) diff --git a/enatega-multivendor-admin/src/components/Configuration/Cloudinary/Cloudinary.jsx b/enatega-multivendor-admin/src/components/Configuration/Cloudinary/Cloudinary.jsx new file mode 100644 index 0000000..e06f4bc --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Cloudinary/Cloudinary.jsx @@ -0,0 +1,153 @@ +// CloudinaryConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveCloudinaryConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_CLOUDINARY_CONFIGURATION = gql` + ${saveCloudinaryConfiguration} +` + +function CloudinaryConfiguration(props) { + const formRef = useRef() + + const [cloudinaryUploadUrl] = useState(props.cloudinaryUploadUrl || '') + const [cloudinaryApiKey] = useState(props.cloudinaryApiKey || '') + + const [cloudinaryUploadUrlError, setCloudinaryUploadUrlError] = useState(null) + const [cloudinaryApiKeyError, setCloudinaryApiKeyError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_CLOUDINARY_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let cloudinaryUploadUrlResult = true + let cloudinaryApiKeyResult = true + + cloudinaryUploadUrlResult = !validateFunc( + { + cloudinaryUploadUrl: formRef.current['input-cloudinaryUploadUrl'].value + }, + 'cloudinaryUploadUrl' + ) + cloudinaryApiKeyResult = !validateFunc( + { cloudinaryApiKey: formRef.current['input-cloudinaryApiKey'].value }, + 'cloudinaryApiKey' + ) + + setCloudinaryUploadUrlError(cloudinaryUploadUrlResult) + setCloudinaryApiKeyError(cloudinaryApiKeyResult) + + return cloudinaryUploadUrlResult && cloudinaryApiKeyResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Cloudinary + + + + + +
+ + + Cloudinary Upload URL + + + onBlur( + setCloudinaryUploadUrlError, + 'cloudinaryUploadUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + cloudinaryUploadUrlError === false + ? globalClasses.inputError + : cloudinaryUploadUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + Cloudinary Key + + + onBlur( + setCloudinaryApiKeyError, + 'cloudinaryApiKey', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + cloudinaryApiKeyError === false + ? globalClasses.inputError + : cloudinaryApiKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(CloudinaryConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Currency/Currency.jsx b/enatega-multivendor-admin/src/components/Configuration/Currency/Currency.jsx new file mode 100644 index 0000000..8e1e904 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Currency/Currency.jsx @@ -0,0 +1,198 @@ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { stripeCurrencies } from '../../../config/currencies' +import { saveCurrencyConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Button, Select, MenuItem, Alert } from '@mui/material' + +const SAVE_CURRENCY_CONFIGURATION = gql` + ${saveCurrencyConfiguration} +` + +function Currency(props) { + const { t } = props + const [currencyCode, currencyCodeSetter] = useState(props.currencyCode || '') + const [currencySymbol, currencySymbolSetter] = useState( + props.currencySymbol || '' + ) + const onCompleted = data => { + console.log(data) + } + const onError = error => { + console.log(error) + } + const [currencyCodeError, currencyCodeErrorSetter] = useState(null) + const [currencySymbolError, currencySymbolErrorSetter] = useState(null) + const [mutate, { loading }] = useMutation(SAVE_CURRENCY_CONFIGURATION, { + onError, + onCompleted + }) + + const validateInput = () => { + const currencyCodeError = !validateFunc( + { currencyCode: currencyCode }, + 'currencyCode' + ) + const currencySymbolError = !validateFunc( + { currencySymbol: currencySymbol }, + 'currencySymbol' + ) + currencyCodeErrorSetter(currencyCodeError) + currencySymbolErrorSetter(currencySymbolError) + return currencyCodeError && currencySymbolError + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + const [successMessage, setSuccessMessage] = useState('') + const handleSuccess = message => { + setSuccessMessage(message) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setSuccessMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [successMessage, setSuccessMessage]) + const [errorMessage, setErrorMessage] = useState('') + const handleError = error => { + setErrorMessage('An error occurred while saving configuration.') + console.error('Mutation error:', error) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setErrorMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [errorMessage, setErrorMessage]) + + return ( + + + + + {t('Currency')} + + + + + +
+ + + {t('ChooseCurrency')} + + + + + + {t('ChooseSymbol')} + + + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + +
+
+
+ ) +} + +export default withTranslation()(Currency) diff --git a/enatega-multivendor-admin/src/components/Configuration/DeliveryRate/DeliveryRate.jsx b/enatega-multivendor-admin/src/components/Configuration/DeliveryRate/DeliveryRate.jsx new file mode 100644 index 0000000..63b6814 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/DeliveryRate/DeliveryRate.jsx @@ -0,0 +1,143 @@ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveDeliveryRateConfiguration } from '../../../apollo' +import { Box, Typography, Input, Button, Alert } from '@mui/material' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +const SAVE_DELIVERY_RATE_CONFIGURATION = gql` + ${saveDeliveryRateConfiguration} +` + +function Currency(props) { + const { t } = props + const [deliveryRate, setDeliveryRate] = useState(props.deliveryRate || 0) + + const [deliveryRateError, setDeliveryRateError] = useState(null) + const [mutate, { loading }] = useMutation(SAVE_DELIVERY_RATE_CONFIGURATION) + + const validateInput = () => { + const deliveryRateErrors = !validateFunc( + { deliveryRate: deliveryRate }, + 'deliveryRate' + ) + + setDeliveryRateError(deliveryRateErrors) + return deliveryRateErrors + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + const [successMessage, setSuccessMessage] = useState('') + const handleSuccess = message => { + setSuccessMessage(message) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setSuccessMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [successMessage, setSuccessMessage]) + const [errorMessage, setErrorMessage] = useState('') + const handleError = error => { + setErrorMessage('An error occurred while saving configuration.') + console.error('Mutation error:', error) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setErrorMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [errorMessage, setErrorMessage]) + + return ( + + + + + {t('Delivery Rate')} + + + + + +
+ + + {t('Delivery Rate')} + + { + setDeliveryRate(e.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + deliveryRateError === false + ? globalClasses.inputError + : deliveryRateError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + +
+
+
+ ) +} + +export default withTranslation()(Currency) diff --git a/enatega-multivendor-admin/src/components/Configuration/Email/Email.jsx b/enatega-multivendor-admin/src/components/Configuration/Email/Email.jsx new file mode 100644 index 0000000..3050f8f --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Email/Email.jsx @@ -0,0 +1,264 @@ +import React, { useRef, useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveEmailConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { + Box, + Switch, + Typography, + Input, + Button, + Grid, + Alert, + Checkbox +} from '@mui/material' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' +const SAVE_EMAIL_CONFIGURATION = gql` + ${saveEmailConfiguration} +` + +function Email(props) { + const { t } = props + const formRef = useRef() + const email = props.email || '' + const password = props.password || '' + const emailName = props.emailName || '' + const [emailError, emailErrorSetter] = useState(null) + const [passwordError, passwordErrorSetter] = useState(null) + const [emailNameError, emailNameErrorSetter] = useState(null) + const [enableEmail, setEnabaleEmail] = useState(!!props.enabled) + const [showPassword, setShowPassword] = useState(false) + //const [isEndAdornmentEnabled, setIsEndAdornmentEnabled] = useState(false); + const [mutate, { loading }] = useMutation(SAVE_EMAIL_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const validateInput = () => { + let emailResult = true + let passwordResult = true + let emailNameResult = true + emailResult = !validateFunc( + { email: formRef.current['input-email'].value }, + 'email' + ) + emailNameResult = !validateFunc( + { email: formRef.current['input-emailName'].value }, + 'emailName' + ) + passwordResult = !validateFunc( + { password: formRef.current['input-password'].value }, + 'password' + ) + emailErrorSetter(emailResult) + passwordErrorSetter(passwordResult) + emailNameErrorSetter(emailNameResult) + return emailResult && passwordResult && emailNameResult + } + const classes = useStyles() + const globalClasses = useGlobalStyles() + const [successMessage, setSuccessMessage] = useState('') + const handleSuccess = message => { + setSuccessMessage(message) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setSuccessMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [successMessage, setSuccessMessage]) + const [errorMessage, setErrorMessage] = useState('') + const handleError = error => { + setErrorMessage('An error occurred while saving configuration.') + console.error('Mutation error:', error) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setErrorMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [errorMessage, setErrorMessage]) + + return ( + + + + + NodeMailer Email + + + + + setEnabaleEmail(e.target.checked)} + id="input-available" + name="input-available" + style={{ color: 'black' }} + /> + + + + +
+ + {/* First Row */} + + + + {t('Email')} + + + onBlur(emailErrorSetter, 'email', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + emailError === false + ? globalClasses.inputError + : emailError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('EmailName')} + + + onBlur( + emailNameErrorSetter, + 'emailName', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + emailNameError === false + ? globalClasses.inputError + : emailNameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('Password')} + + + onBlur(passwordErrorSetter, 'password', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + passwordError === false + ? globalClasses.inputError + : passwordError === true + ? globalClasses.inputSuccess + : '' + ]} + endAdornment={ + + {false && ( + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + )} + + } + /> + + + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + +
+
+
+ ) +} +export default withTranslation()(Email) diff --git a/enatega-multivendor-admin/src/components/Configuration/FireBase/FireBase.jsx b/enatega-multivendor-admin/src/components/Configuration/FireBase/FireBase.jsx new file mode 100644 index 0000000..c5d713f --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/FireBase/FireBase.jsx @@ -0,0 +1,322 @@ +// FirebaseConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveFirebaseConfiguration } from '../../../apollo' // Assuming you have a corresponding Apollo mutation +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_FIREBASE_CONFIGURATION = gql` + ${saveFirebaseConfiguration} +` + +function FirebaseConfiguration(props) { + const formRef = useRef() + const [firebaseKey] = useState(props.firebaseKey || '') + const [authDomain] = useState(props.authDomain || '') + const [projectId] = useState(props.projectId || '') + const [storageBucket] = useState(props.storageBucket || '') + const [msgSenderId] = useState(props.msgSenderId || '') + const [appId] = useState(props.appId || '') + const [measurementId] = useState(props.measurementId || '') + + const [firebaseKeyError, setFirebaseKeyError] = useState(null) + const [authDomainError, setAuthDomainError] = useState(null) + const [projectIdError, setProjectIdError] = useState(null) + const [storageBucketError, setStorageBucketError] = useState(null) + const [msgSenderIdError, setMsgSenderIdError] = useState(null) + const [appIdError, setAppIdError] = useState(null) + const [measurementIdError, setMeasurementIdError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_FIREBASE_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let firebaseKeyResult = true + let authDomainResult = true + let projectIdResult = true + let storageBucketResult = true + let msgSenderIdResult = true + let appIdResult = true + let measurementIdResult = true + + firebaseKeyResult = !validateFunc( + { firebaseKey: formRef.current['input-firebaseKey'].value }, + 'firebaseKey' + ) + authDomainResult = !validateFunc( + { authDomain: formRef.current['input-authDomain'].value }, + 'authDomain' + ) + projectIdResult = !validateFunc( + { projectId: formRef.current['input-projectId'].value }, + 'projectId' + ) + storageBucketResult = !validateFunc( + { storageBucket: formRef.current['input-storageBucket'].value }, + 'storageBucket' + ) + msgSenderIdResult = !validateFunc( + { msgSenderId: formRef.current['input-msgSenderId'].value }, + 'msgSenderId' + ) + appIdResult = !validateFunc( + { appId: formRef.current['input-appId'].value }, + 'appId' + ) + measurementIdResult = !validateFunc( + { measurementId: formRef.current['input-measurementId'].value }, + 'measurementId' + ) + + setFirebaseKeyError(firebaseKeyResult) + setAuthDomainError(authDomainResult) + setProjectIdError(projectIdResult) + setStorageBucketError(storageBucketResult) + setMsgSenderIdError(msgSenderIdResult) + setAppIdError(appIdResult) + setMeasurementIdError(measurementIdResult) + + return ( + firebaseKeyResult && + authDomainResult && + projectIdResult && + storageBucketResult && + msgSenderIdResult && + appIdResult && + measurementIdResult + ) + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + FireBase Admin + + + + +
+ + + + Firebase Key + + + onBlur(setFirebaseKeyError, 'firebaseKey', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + firebaseKeyError === false + ? globalClasses.inputError + : firebaseKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + Auth Domain + + onBlur(setAuthDomainError, 'authDomain', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + authDomainError === false + ? globalClasses.inputError + : authDomainError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + Project ID + + onBlur(setProjectIdError, 'projectId', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + projectIdError === false + ? globalClasses.inputError + : projectIdError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + Storage Bucket + + + onBlur( + setStorageBucketError, + 'storageBucket', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + storageBucketError === false + ? globalClasses.inputError + : storageBucketError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + Message Sender ID + + + onBlur(setMsgSenderIdError, 'msgSenderId', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + msgSenderIdError === false + ? globalClasses.inputError + : msgSenderIdError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + App ID + + onBlur(setAppIdError, 'appId', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + appIdError === false + ? globalClasses.inputError + : appIdError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Measurement ID + + + onBlur( + setMeasurementIdError, + 'measurementId', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + measurementIdError === false + ? globalClasses.inputError + : measurementIdError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + +
+
+
+ ) +} + +export default withTranslation()(FirebaseConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/FormEmail/FormEmail.js b/enatega-multivendor-admin/src/components/Configuration/FormEmail/FormEmail.js new file mode 100644 index 0000000..c61d288 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/FormEmail/FormEmail.js @@ -0,0 +1,104 @@ +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveFormEmailConfiguration } from '../../../apollo' +import { Box, Typography, Input, Button, CircularProgress } from '@mui/material' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' + +const SAVE_EMAIL_CONFIGURATION = gql` + ${saveFormEmailConfiguration} +` + +function EmailConfiguration(props) { + const formRef = useRef() + const [email, setEmail] = useState(props.formEmail || '') + const [emailError, setEmailError] = useState(null) + const [mutate, { loading }] = useMutation(SAVE_EMAIL_CONFIGURATION) + + const validateInput = () => { + const emailErrors = !validateFunc({ email: email }, 'email') + + setEmailError(emailErrors) + return emailErrors + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Form Submission Email + + + + + +
+ + + Form Submission Email + + { + setEmail(e.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + emailError === false + ? globalClasses.inputError + : emailError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(EmailConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/GoogleApi/GoogleApi.jsx b/enatega-multivendor-admin/src/components/Configuration/GoogleApi/GoogleApi.jsx new file mode 100644 index 0000000..57ca0d5 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/GoogleApi/GoogleApi.jsx @@ -0,0 +1,108 @@ +// GoogleApiKeyConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveGoogleApiKeyConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_GOOGLE_API_KEY_CONFIGURATION = gql` + ${saveGoogleApiKeyConfiguration} +` + +function GoogleApiKeyConfiguration(props) { + const formRef = useRef() + + const [googleApiKey] = useState(props.googleApiKey || '') + + const [googleApiKeyError, setGoogleApiKeyError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_GOOGLE_API_KEY_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let googleApiKeyResult = true + + googleApiKeyResult = !validateFunc( + { googleApiKey: formRef.current['input-googleApiKey'].value }, + 'googleApiKey' + ) + + setGoogleApiKeyError(googleApiKeyResult) + + return googleApiKeyResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Google API Key + + + + + +
+ + + Google API Key + + + onBlur(setGoogleApiKeyError, 'googleApiKey', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + googleApiKeyError === false + ? globalClasses.inputError + : googleApiKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(GoogleApiKeyConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/GoogleClient/GoogleClient.jsx b/enatega-multivendor-admin/src/components/Configuration/GoogleClient/GoogleClient.jsx new file mode 100644 index 0000000..b11418c --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/GoogleClient/GoogleClient.jsx @@ -0,0 +1,218 @@ +// GoogleClientIDConfiguration.jsx +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveGoogleClientIDConfiguration } from '../../../apollo' // Update with the correct import path +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_GOOGLE_CLIENT_ID_CONFIGURATION = gql` + ${saveGoogleClientIDConfiguration} +` + +function GoogleClientIDConfiguration(props) { + const formRef = useRef() + const [webClientID] = useState(props.webClientID || '') + const [androidClientID] = useState(props.androidClientID || '') + const [iOSClientID] = useState(props.iOSClientID || '') + const [expoClientID] = useState(props.expoClientID || '') + + const [webClientIDError, setWebClientIDError] = useState(null) + const [androidClientIDError, setAndroidClientIDError] = useState(null) + const [iOSClientIDError, setIOSClientIDError] = useState(null) + const [expoClientIDError, setExpoClientIDError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_GOOGLE_CLIENT_ID_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let webClientIDResult = true + let androidClientIDResult = true + let iOSClientIDResult = true + let expoClientIDResult = true + + webClientIDResult = !validateFunc( + { webClientID: formRef.current['input-webClientID'].value }, + 'webClientID' + ) + androidClientIDResult = !validateFunc( + { androidClientID: formRef.current['input-androidClientID'].value }, + 'androidClientID' + ) + iOSClientIDResult = !validateFunc( + { iOSClientID: formRef.current['input-iOSClientID'].value }, + 'iOSClientID' + ) + expoClientIDResult = !validateFunc( + { expoClientID: formRef.current['input-expoClientID'].value }, + 'expoClientID' + ) + + setWebClientIDError(webClientIDResult) + setAndroidClientIDError(androidClientIDResult) + setIOSClientIDError(iOSClientIDResult) + setExpoClientIDError(expoClientIDResult) + + return ( + webClientIDResult && + androidClientIDResult && + iOSClientIDResult && + expoClientIDResult + ) + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Google Client IDs + + + + + +
+ + Web Client ID + + onBlur(setWebClientIDError, 'webClientID', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + webClientIDError === false + ? globalClasses.inputError + : webClientIDError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Android Client ID + + + onBlur( + setAndroidClientIDError, + 'androidClientID', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + androidClientIDError === false + ? globalClasses.inputError + : androidClientIDError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + iOS Client ID + + + onBlur(setIOSClientIDError, 'iOSClientID', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + iOSClientIDError === false + ? globalClasses.inputError + : iOSClientIDError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Expo Client ID + + + onBlur(setExpoClientIDError, 'expoClientID', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + expoClientIDError === false + ? globalClasses.inputError + : expoClientIDError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(GoogleClientIDConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Paypal/Paypal.jsx b/enatega-multivendor-admin/src/components/Configuration/Paypal/Paypal.jsx new file mode 100644 index 0000000..ea84c80 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Paypal/Paypal.jsx @@ -0,0 +1,192 @@ +import React, { useRef, useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { savePaypalConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Switch, Typography, Input, Button, Alert } from '@mui/material' + +const SAVE_PAYPAL_CONFIGURATION = gql` + ${savePaypalConfiguration} +` + +function Paypal(props) { + const { t } = props + const formRef = useRef() + const clientId = props.clientId || '' + const clientSecret = props.clientSecret || '' + const [clientIdError, clientIdErrorSetter] = useState(null) + const [sandbox, setSandbox] = useState(!!props.sandbox) + const [clientSecretError, clientSecretErrorSetter] = useState(null) + const [mutate, { loading }] = useMutation(SAVE_PAYPAL_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const validateInput = () => { + let clientIdResult = true + let clientSecretResult = true + clientIdResult = !!formRef.current['input-clientid'].value + clientSecretResult = !!formRef.current['input-clientsecret'].value + clientIdErrorSetter(clientIdResult) + clientIdErrorSetter(clientSecretResult) + return clientIdResult && clientSecretResult + } + const classes = useStyles() + const globalClasses = useGlobalStyles() + const [successMessage, setSuccessMessage] = useState('') + const handleSuccess = message => { + setSuccessMessage(message) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setSuccessMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [successMessage, setSuccessMessage]) + const [errorMessage, setErrorMessage] = useState('') + const handleError = error => { + setErrorMessage('An error occurred while saving configuration.') + console.error('Mutation error:', error) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setErrorMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [errorMessage, setErrorMessage]) + + return ( + + + + + {t('Paypal')} + + + + + setSandbox(e.target.checked)} + id="input-sandbox" + name="input-sandbox" + style={{ color: 'black' }} + /> + + + + +
+ + + {t('Client ID')} + + + onBlur(clientIdErrorSetter, 'clientId', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + clientIdError === false + ? globalClasses.inputError + : clientIdError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + {t('ClientSecretKey')} + + { + onBlur( + clientSecretErrorSetter, + 'clientSecret', + event.target.value + ) + }} + disableUnderline + className={[ + globalClasses.input, + clientSecretError === false + ? globalClasses.inputError + : clientSecretError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + +
+
+
+ ) +} + +export default withTranslation()(Paypal) diff --git a/enatega-multivendor-admin/src/components/Configuration/SendGrid/SendGrid.js b/enatega-multivendor-admin/src/components/Configuration/SendGrid/SendGrid.js new file mode 100644 index 0000000..4e3409f --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/SendGrid/SendGrid.js @@ -0,0 +1,255 @@ +// SendGridConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveSendGridApiKey } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Switch, Typography, Input, Button, Grid } from '@mui/material' + +const SAVE_SENDGRID_API_KEY = gql` + ${saveSendGridApiKey} +` + +function SendGridConfiguration(props) { + const formRef = useRef() + const [sendGridEnabled, setSendGridEnabled] = useState( + !!props.sendGridEnabled + ) + const [sendGridApiKey] = useState(props.sendGridApiKey || '') + const [apiKeyError, setApiKeyError] = useState(null) + const [sendGridEmail] = useState(props.sendGridEmail || '') + const [sendGridEmailError, setSendGridEmailError] = useState(null) + const [sendGridEmailName] = useState(props.sendGridEmailName || '') + const [sendGridEmailNameError, setSendGridEmailNameError] = useState(null) + const [sendGridPassword] = useState(props.sendGridPassword || '') + const [sendGridPasswordError, setSendGridPasswordError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_SENDGRID_API_KEY) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const onBlurEmail = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const onBlurEmailName = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const onBlurPassword = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let apiKeyResult = true + let emailResult = true + let emailNameResult = true + let passwordResult = true + + apiKeyResult = !validateFunc( + { sendGridApiKey: formRef.current['input-apiKey'].value }, + 'sendGridApiKey' + ) + emailResult = !validateFunc( + { sendGridEmail: formRef.current['input-sendGridEmail'].value }, + 'sendGridEmail' + ) + emailNameResult = !validateFunc( + { sendGridEmailName: formRef.current['input-sendGridEmailName'].value }, + 'sendGridEmailName' + ) + passwordResult = !validateFunc( + { sendGridPassword: formRef.current['input-sendGridPassword'].value }, + 'sendGridPassword' + ) + + setApiKeyError(apiKeyResult) + setSendGridEmailError(emailResult) + setSendGridEmailNameError(emailNameResult) + setSendGridPasswordError(passwordResult) + + return apiKeyResult && emailResult && emailNameResult && passwordResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + SendGrid + + + + + setSendGridEnabled(e.target.checked)} + id="input-sendGridEnabled" + name="input-sendGridEnabled" + style={{ color: 'black' }} + /> + + + + +
+ + + SendGrid API Key + + + onBlur(setApiKeyError, 'sendGridApiKey', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + apiKeyError === false + ? globalClasses.inputError + : apiKeyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + SendGrid Email + + + onBlurEmail( + setSendGridEmailError, + 'sendGridEmail', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + sendGridEmailError === false + ? globalClasses.inputError + : sendGridEmailError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + SendGrid Email Name + + + onBlurEmailName( + setSendGridEmailNameError, + 'sendGridEmailName', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + sendGridEmailNameError === false + ? globalClasses.inputError + : sendGridEmailNameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + + SendGrid Password + + + onBlurPassword( + setSendGridPasswordError, + 'sendGridPassword', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + sendGridPasswordError === false + ? globalClasses.inputError + : sendGridPasswordError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + +
+
+
+ ) +} + +export default withTranslation()(SendGridConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Sentry/Sentry.jsx b/enatega-multivendor-admin/src/components/Configuration/Sentry/Sentry.jsx new file mode 100644 index 0000000..bf18061 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Sentry/Sentry.jsx @@ -0,0 +1,329 @@ +// SentryConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveSentryConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_SENTRY_CONFIGURATION = gql` + ${saveSentryConfiguration} +` + +function SentryConfiguration(props) { + const formRef = useRef() + + const [dashboardSentryUrl] = useState(props.dashboardSentryUrl || '') + const [webSentryUrl] = useState(props.webSentryUrl || '') + const [apiSentryUrl] = useState(props.apiSentryUrl || '') + const [customerAppSentryUrl] = useState(props.customerAppSentryUrl || '') + const [restaurantAppSentryUrl] = useState(props.restaurantAppSentryUrl || '') + const [riderAppSentryUrl] = useState(props.riderAppSentryUrl || '') + + const [dashboardSentryUrlError, setDashboardSentryUrlError] = useState(null) + const [webSentryUrlError, setWebSentryUrlError] = useState(null) + const [apiSentryUrlError, setApiSentryUrlError] = useState(null) + const [customerAppSentryUrlError, setCustomerAppSentryUrlError] = useState( + null + ) + const [ + restaurantAppSentryUrlError, + setRestaurantAppSentryUrlError + ] = useState(null) + const [riderAppSentryUrlError, setRiderAppSentryUrlError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_SENTRY_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let dashboardSentryUrlResult = true + let webSentryUrlResult = true + let apiSentryUrlResult = true + let customerAppSentryUrlResult = true + let restaurantAppSentryUrlResult = true + let riderAppSentryUrlResult = true + + dashboardSentryUrlResult = !validateFunc( + { dashboardSentryUrl: formRef.current['input-dashboardSentryUrl'].value }, + 'dashboardSentryUrl' + ) + webSentryUrlResult = !validateFunc( + { webSentryUrl: formRef.current['input-webSentryUrl'].value }, + 'webSentryUrl' + ) + apiSentryUrlResult = !validateFunc( + { apiSentryUrl: formRef.current['input-apiSentryUrl'].value }, + 'apiSentryUrl' + ) + customerAppSentryUrlResult = !validateFunc( + { + customerAppSentryUrl: + formRef.current['input-customerAppSentryUrl'].value + }, + 'customerAppSentryUrl' + ) + restaurantAppSentryUrlResult = !validateFunc( + { + restaurantAppSentryUrl: + formRef.current['input-restaurantAppSentryUrl'].value + }, + 'restaurantAppSentryUrl' + ) + riderAppSentryUrlResult = !validateFunc( + { riderAppSentryUrl: formRef.current['input-riderAppSentryUrl'].value }, + 'riderAppSentryUrl' + ) + + setDashboardSentryUrlError(dashboardSentryUrlResult) + setWebSentryUrlError(webSentryUrlResult) + setApiSentryUrlError(apiSentryUrlResult) + setCustomerAppSentryUrlError(customerAppSentryUrlResult) + setRestaurantAppSentryUrlError(restaurantAppSentryUrlResult) + setRiderAppSentryUrlError(riderAppSentryUrlResult) + + return ( + dashboardSentryUrlResult && + webSentryUrlResult && + apiSentryUrlResult && + customerAppSentryUrlResult && + restaurantAppSentryUrlResult && + riderAppSentryUrlResult + ) + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Sentry Configuration + + + + + +
+ + + Dashboard Sentry URL + + + onBlur( + setDashboardSentryUrlError, + 'dashboardSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + dashboardSentryUrlError === false + ? globalClasses.inputError + : dashboardSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Web Sentry URL + + + onBlur( + setWebSentryUrlError, + 'webSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + webSentryUrlError === false + ? globalClasses.inputError + : webSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + API Sentry URL + + + onBlur( + setApiSentryUrlError, + 'apiSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + apiSentryUrlError === false + ? globalClasses.inputError + : apiSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + Customer App Sentry URL + + + onBlur( + setCustomerAppSentryUrlError, + 'customerAppSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + customerAppSentryUrlError === false + ? globalClasses.inputError + : customerAppSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + Restaurant App Sentry URL + + + onBlur( + setRestaurantAppSentryUrlError, + 'restaurantAppSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + restaurantAppSentryUrlError === false + ? globalClasses.inputError + : restaurantAppSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Rider App Sentry URL + + + onBlur( + setRiderAppSentryUrlError, + 'riderAppSentryUrl', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + riderAppSentryUrlError === false + ? globalClasses.inputError + : riderAppSentryUrlError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(SentryConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Stripe/Stripe.jsx b/enatega-multivendor-admin/src/components/Configuration/Stripe/Stripe.jsx new file mode 100644 index 0000000..0290ce3 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Stripe/Stripe.jsx @@ -0,0 +1,182 @@ +import React, { useRef, useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveStripeConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button, Alert } from '@mui/material' + +const SAVE_STRIPE_CONFIGURATION = gql` + ${saveStripeConfiguration} +` + +function Stripe(props) { + const { t } = props + const formRef = useRef() + const publishableKey = props.publishableKey || '' + const secretKey = props.secretKey || '' + const [publishError, publishErrorSetter] = useState(null) + const [secretError, secretErrorSetter] = useState(null) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const [mutate, { loading }] = useMutation(SAVE_STRIPE_CONFIGURATION) + + const validateInput = () => { + let publishableKeyResult = true + let secretKeyResult = true + publishableKeyResult = !!formRef.current['input-publishablekey'].value + secretKeyResult = !!formRef.current['input-secretkey'].value + publishErrorSetter(publishableKeyResult) + secretErrorSetter(secretKeyResult) + return publishableKeyResult && secretKeyResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + const [successMessage, setSuccessMessage] = useState('') + const handleSuccess = message => { + setSuccessMessage(message) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setSuccessMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [successMessage, setSuccessMessage]) + const [errorMessage, setErrorMessage] = useState('') + const handleError = error => { + setErrorMessage('An error occurred while saving configuration.') + console.error('Mutation error:', error) + } + useEffect(() => { + const timeoutId = setTimeout(() => { + setErrorMessage('') + }, 3000) + + return () => clearTimeout(timeoutId) + }, [errorMessage, setErrorMessage]) + + return ( + + + + + {t('Stripe')} + + + + + +
+ + + {t('PublishKey')} + + { + onBlur( + publishErrorSetter, + 'publishableKey', + event.target.value.trim() + ) + }} + disableUnderline + className={[ + globalClasses.input, + publishError === false + ? globalClasses.inputError + : publishError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + {t('Secret Key')} + + + onBlur( + secretErrorSetter, + 'secretKey', + event.target.value.trim() + ) + } + disableUnderline + className={[ + globalClasses.input, + secretError === false + ? globalClasses.inputError + : secretError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + +
+
+
+ ) +} +export default withTranslation()(Stripe) diff --git a/enatega-multivendor-admin/src/components/Configuration/Twilio/Twilio.js b/enatega-multivendor-admin/src/components/Configuration/Twilio/Twilio.js new file mode 100644 index 0000000..39b07f8 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Twilio/Twilio.js @@ -0,0 +1,204 @@ +// TwilioConfiguration.jsx + +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveTwilioConfiguration } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Switch, Typography, Input, Button } from '@mui/material' + +const SAVE_TWILIO_CONFIGURATION = gql` + ${saveTwilioConfiguration} +` + +function TwilioConfiguration(props) { + const formRef = useRef() + const [twilioEnabled, setTwilioEnabled] = useState(!!props.twilioEnabled) + const [twilioAccountSid] = useState(props.twilioAccountSid || '') + const [twilioAuthToken] = useState(props.twilioAuthToken || '') + const [twilioPhoneNumber] = useState(props.twilioPhoneNumber || '') + + const [accountSidError, setAccountSidError] = useState(null) + const [authTokenError, setAuthTokenError] = useState(null) + const [phoneNumberError, setPhoneNumberError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_TWILIO_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let accountSidResult = true + let authTokenResult = true + let phoneNumberResult = true + + accountSidResult = !validateFunc( + { twilioAccountSid: formRef.current['input-accountSid'].value }, + 'twilioAccountSid' + ) + authTokenResult = !validateFunc( + { twilioAuthToken: formRef.current['input-authToken'].value }, + 'twilioAuthToken' + ) + phoneNumberResult = !validateFunc( + { twilioPhoneNumber: formRef.current['input-phoneNumber'].value }, + 'twilioPhoneNumber' + ) + + setAccountSidError(accountSidResult) + setAuthTokenError(authTokenResult) + setPhoneNumberError(phoneNumberResult) + + return accountSidResult && authTokenResult && phoneNumberResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Twilio + + + + + setTwilioEnabled(e.target.checked)} + id="input-twilioEnabled" + name="input-twilioEnabled" + style={{ color: 'black' }} + /> + + + + +
+ + + + Twilio Account SID + + + onBlur( + setAccountSidError, + 'twilioAccountSid', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + accountSidError === false + ? globalClasses.inputError + : accountSidError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + Twilio Auth Token + + + onBlur( + setAuthTokenError, + 'twilioAuthToken', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + authTokenError === false + ? globalClasses.inputError + : authTokenError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + Twilio Phone Number + + + onBlur( + setPhoneNumberError, + 'twilioPhoneNumber', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + phoneNumberError === false + ? globalClasses.inputError + : phoneNumberError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(TwilioConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Verification/Verification.jsx b/enatega-multivendor-admin/src/components/Configuration/Verification/Verification.jsx new file mode 100644 index 0000000..a5741c5 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Verification/Verification.jsx @@ -0,0 +1,89 @@ +import React, { useRef } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { saveVerificationToggles } from '../../../apollo' +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Switch, Typography, Button } from '@mui/material' + +const SAVE_VERIFICATION_CONFIGURATION = gql` + ${saveVerificationToggles} +` + +function VerificationConfiguration(props) { + const formRef = useRef() + + + const [mutate, { loading }] = useMutation(SAVE_VERIFICATION_CONFIGURATION) + + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Skip Verifications + + + + + + +
+ + + + + + Skip Mobile Verification + + + + + + Skip Email Verification + + + + + + +
+
+
+ ) +} + +export default withTranslation()(VerificationConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/Web/Web.jsx b/enatega-multivendor-admin/src/components/Configuration/Web/Web.jsx new file mode 100644 index 0000000..98b9116 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/Web/Web.jsx @@ -0,0 +1,144 @@ +import React, { useRef, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../../constraints/constraints' +import { saveWebConfiguration } from '../../../apollo' // Update with the correct import path +import useStyles from '../styles' +import useGlobalStyles from '../../../utils/globalStyles' +import { Box, Typography, Input, Button } from '@mui/material' + +const SAVE_WEB_CONFIGURATION = gql` + ${saveWebConfiguration} +` + +function WebConfiguration(props) { + const formRef = useRef() + + const [googleMapLibraries] = useState(props.googleMapLibraries || '') + const [googleColor] = useState(props.googleColor || '') + + const [googleMapLibrariesError, setGoogleMapLibrariesError] = useState(null) + const [googleColorError, setGoogleColorError] = useState(null) + + const [mutate, { loading }] = useMutation(SAVE_WEB_CONFIGURATION) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const validateInput = () => { + let googleMapLibrariesResult = true + let googleColorResult = true + + googleMapLibrariesResult = !validateFunc( + { googleMapLibraries: formRef.current['input-googleMapLibraries'].value }, + 'googleMapLibraries' + ) + googleColorResult = !validateFunc( + { googleColor: formRef.current['input-googleColor'].value }, + 'googleColor' + ) + + setGoogleMapLibrariesError(googleMapLibrariesResult) + setGoogleColorError(googleColorResult) + + return googleMapLibrariesResult && googleColorResult + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + Web Configuration + + + + + +
+ + + Google Map Libraries + + + onBlur( + setGoogleMapLibrariesError, + 'googleMapLibraries', + event.target.value + ) + } + disableUnderline + className={[ + globalClasses.input, + googleMapLibrariesError === false + ? globalClasses.inputError + : googleMapLibrariesError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + Google Color + + onBlur(setGoogleColorError, 'googleColor', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + googleColorError === false + ? globalClasses.inputError + : googleColorError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+
+
+ ) +} + +export default withTranslation()(WebConfiguration) diff --git a/enatega-multivendor-admin/src/components/Configuration/styles.js b/enatega-multivendor-admin/src/components/Configuration/styles.js new file mode 100644 index 0000000..c3bb2f6 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Configuration/styles.js @@ -0,0 +1,40 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + form: { + margin: 25, + alignItems: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Coupon/Coupon.jsx b/enatega-multivendor-admin/src/components/Coupon/Coupon.jsx new file mode 100644 index 0000000..5f49d97 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Coupon/Coupon.jsx @@ -0,0 +1,216 @@ +import React, { useRef, useState } from 'react' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { editCoupon, createCoupon, getCoupons } from '../../apollo' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Switch, + Typography, + Input, + Button, + Alert, + Grid +} from '@mui/material' + +const CREATE_COUPON = gql` + ${createCoupon} +` +const EDIT_COUPON = gql` + ${editCoupon} +` +const GET_COUPONS = gql` + ${getCoupons} +` + +function Category(props) { + const formRef = useRef() + const title = props.coupon ? props.coupon.title : '' + const discount = props.coupon ? props.coupon.discount : '' + const [enabled, setEnabled] = useState( + props.coupon ? props.coupon.enabled : false + ) + const mutation = props.coupon ? EDIT_COUPON : CREATE_COUPON + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [titleError, titleErrorSetter] = useState(null) + const [discountError, discountErrorSetter] = useState(null) + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const onCompleted = data => { + const message = props.coupon ? t('CouponUpdated') : t('CouponAdded') + successSetter(message) + mainErrorSetter('') + if (!props.coupon) clearFields() + } + const onError = error => { + let message = '' + try { + message = error.graphQLErrors[0].message + } catch (err) { + message = t('ActionFailedTryAgain') + } + successSetter('') + mainErrorSetter(message) + } + const [mutate, { loading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_COUPONS }], + onError, + onCompleted + }) + + const onSubmitValidaiton = () => { + const titleError = !validateFunc( + { title: formRef.current['input-code'].value }, + 'title' + ) + const discountError = !validateFunc( + { discount: formRef.current['input-discount'].value }, + 'discount' + ) + titleErrorSetter(titleError) + discountErrorSetter(discountError) + return titleError && discountError + } + const clearFields = () => { + formRef.current.reset() + titleErrorSetter(null) + discountErrorSetter(null) + } + + const { t } = props + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.coupon ? t('EditCoupon') : t('AddCoupon')} + + + + + setEnabled(e.target.checked)} + id="input-enabled" + name="input-enabled" + style={{ color: 'black' }} + /> + + + +
+ + + + + {t('Code')} + + + onBlur(titleErrorSetter, 'title', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + titleError === false + ? globalClasses.inputError + : titleError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + {t('Discount')} + + { + onBlur(discountErrorSetter, 'discount', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + discountError === false + ? globalClasses.inputError + : discountError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + {loading ? t('Loading') : null} + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ ) +} + +export default withTranslation()(Category) diff --git a/enatega-multivendor-admin/src/components/Coupon/styles.js b/enatega-multivendor-admin/src/components/Coupon/styles.js new file mode 100644 index 0000000..c1fbd42 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Coupon/styles.js @@ -0,0 +1,51 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Cuisine/Cuisine.jsx b/enatega-multivendor-admin/src/components/Cuisine/Cuisine.jsx new file mode 100644 index 0000000..68042ef --- /dev/null +++ b/enatega-multivendor-admin/src/components/Cuisine/Cuisine.jsx @@ -0,0 +1,206 @@ +import React, { useRef, useState } from 'react' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { createCuisine, editCuisine, getCuisines } from '../../apollo' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Typography, + Input, + Button, + Alert, + Grid +} from '@mui/material' + +const CREATE_CUISINE = gql` + ${createCuisine} +` +const EDIT_CUISINE = gql` + ${editCuisine} +` +const GET_CUISINES = gql` + ${getCuisines} +` + +function Category(props) { + const formRef = useRef() + const name = props.cuisine ? props.cuisine.name : '' + const description = props.cuisine ? props.cuisine.description : '' + const mutation = props.cuisine ? EDIT_CUISINE : CREATE_CUISINE + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [nameError, setNameError] = useState(null) + const [descriptionError, setDescriptionError] = useState(null) + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const onCompleted = data => { + console.log('Data => ', data) + const message = props.cuisine ? t('CuisineUpdated') : t('CuisineAdded') + successSetter(message) + mainErrorSetter('') + if (!props.cuisine) clearFields() + } + const onError = error => { + console.log('Error => ', error) + let message = '' + try { + message = error.graphQLErrors[0].message + } catch (err) { + message = t('ActionFailedTryAgain') + } + successSetter('') + mainErrorSetter(message) + } + const [mutate, { loading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_CUISINES }], + onError, + onCompleted + }) + + const onSubmitValidaiton = () => { + const nameError = !validateFunc( + { name: formRef.current['input-name'].value }, + 'name' + ) + const descriptionError = !validateFunc( + { description: formRef.current['input-description'].value }, + 'description' + ) + setNameError(nameError) + setDescriptionError(descriptionError) + return nameError && descriptionError + } + const clearFields = () => { + formRef.current.reset() + setNameError(null) + setDescriptionError(null) + } + + const { t } = props + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.cuisine ? t('EditCuisine') : t('AddCuisine')} + + + + +
+ + + + + {t('Name')} + + + onBlur(setNameError, 'name', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + nameError === false + ? globalClasses.inputError + : nameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + {t('Description')} + + { + onBlur( + setDescriptionError, + 'description', + event.target.value + ) + }} + disableUnderline + className={[ + globalClasses.input, + descriptionError === false + ? globalClasses.inputError + : descriptionError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + {loading ? t('Loading') : null} + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ ) +} + +export default withTranslation()(Category) diff --git a/enatega-multivendor-admin/src/components/Cuisine/styles.js b/enatega-multivendor-admin/src/components/Cuisine/styles.js new file mode 100644 index 0000000..c1fbd42 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Cuisine/styles.js @@ -0,0 +1,51 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Dropdown/index.jsx b/enatega-multivendor-admin/src/components/Dropdown/index.jsx new file mode 100644 index 0000000..0b827f7 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Dropdown/index.jsx @@ -0,0 +1,36 @@ +import React from 'react' +import { Box, MenuItem, Select, Typography } from '@mui/material' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' + +function Dropdown({ + defaultValue = '', + values, + title, + name, + id, + displayEmpty = true +}) { + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + {title} + + + ) +} + +export default Dropdown diff --git a/enatega-multivendor-admin/src/components/Dropdown/styles.js b/enatega-multivendor-admin/src/components/Dropdown/styles.js new file mode 100644 index 0000000..d564e99 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Dropdown/styles.js @@ -0,0 +1,13 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Food/Food.jsx b/enatega-multivendor-admin/src/components/Food/Food.jsx new file mode 100644 index 0000000..7654ef6 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Food/Food.jsx @@ -0,0 +1,676 @@ +import React, { useState, useRef } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import ConfigurableValues from '../../config/constants' +import { getRestaurantDetail, createFood, editFood } from '../../apollo' +import AddonComponent from '../Addon/Addon' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Typography, + Input, + Alert, + Modal, + Button, + Select, + MenuItem, + Grid, + Checkbox, + FormControlLabel, + useTheme +} from '@mui/material' +import AddIcon from '@mui/icons-material/Add' +import RemoveIcon from '@mui/icons-material/Remove' +const CREATE_FOOD = gql` + ${createFood} +` +const EDIT_FOOD = gql` + ${editFood} +` +const GET_CATEGORIES = gql` + ${getRestaurantDetail} +` +const GET_ADDONS = gql` + ${getRestaurantDetail} +` + +function Food(props) { + const theme = useTheme() + + const { CLOUDINARY_UPLOAD_URL, CLOUDINARY_FOOD } = ConfigurableValues() + const formRef = useRef() + const mutation = props.food ? EDIT_FOOD : CREATE_FOOD + const [title, setTitle] = useState(props.food ? props.food.title : '') + const [description, setDescription] = useState( + props.food ? props.food.description : '' + ) + const [category, setCategory] = useState( + props.food ? props.food.categoryId : '' + ) + const [imgMenu, imgMenuSetter] = useState(props.food ? props.food.image : '') + const [variationIndex, variationIndexSetter] = useState(0) + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [titleError, titleErrorSetter] = useState(null) + const [categoryError, categoryErrorSetter] = useState(null) + const [addonModal, addonModalSetter] = useState(false) + const restaurantId = localStorage.getItem('restaurantId') + + const onError = error => { + mainErrorSetter(`${t('ActionFailedTryAgain')} ${error}`) + successSetter('') + setTimeout(onDismiss, 3000) + } + const onCompleted = data => { + if (!props.food) clearFields() + const message = props.food + ? t('FoodUpdatedSuccessfully') + : t('FoodAddedSuccessfully') + mainErrorSetter('') + successSetter(message) + setTitle('') + setDescription('') + setTimeout(onDismiss, 3000) + } + const [mutate, { loading: mutateLoading }] = useMutation(mutation, { + onError, + onCompleted + }) + const { + data: dataCategories, + error: errorCategories, + loading: loadingCategories + } = useQuery(GET_CATEGORIES, { + variables: { + id: restaurantId + } + }) + + const { + data: dataAddons, + error: errorAddons, + loading: loadingAddons + } = useQuery(GET_ADDONS, { + variables: { + id: restaurantId + } + }) + const [variation, variationSetter] = useState( + props.food + ? props.food.variations.map(({ title, price, discounted, addons }) => { + return { + title, + price, + discounted, + addons, + titleError: null, + priceError: null + } + }) + : [ + { + title: '', + price: '', + discounted: '', + addons: [], + titleError: null, + priceError: null + } + ] + ) + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const filterImage = event => { + let images = [] + for (var i = 0; i < event.target.files.length; i++) { + images[i] = event.target.files.item(i) + } + images = images.filter(image => image.name.match(/\.(jpg|jpeg|png|gif)$/)) + return images.length ? images[0] : undefined + } + const selectImage = (event, state) => { + const result = filterImage(event) + if (result) imageToBase64(result) + } + + const onAdd = index => { + const variations = variation + if (index === variations.length - 1) { + variations.push({ + title: '', + price: '', + discounted: '', + addons: [], + titleError: null, + priceError: null + }) + } else { + variations.splice(index + 1, 0, { + title: '', + price: '', + discounted: '', + addons: [], + titleError: null, + priceError: null + }) + } + variationSetter([...variations]) + } + const onRemove = index => { + if (variation.length === 1 && index === 0) { + return + } + const variations = variation + variations.splice(index, 1) + variationSetter([...variations]) + } + const handleVariationChange = (event, index, type) => { + const variations = variation + + if (type === 'title') { + variations[index][type] = + event.target.value.length === 1 + ? event.target.value.toUpperCase() + : event.target.value + variationSetter([...variations]) + } else { + variations[index][type] = event.target.value + variationSetter([...variations]) + } + } + const onSubmitValidaiton = () => { + const titleError = !validateFunc( + { title: formRef.current['input-title'].value }, + 'title' + ) + const categoryError = !validateFunc( + { category: formRef.current['input-category'].value }, + 'category' + ) + const variations = variation + variations.map(variationItem => { + variationItem.priceError = !validateFunc( + { price: variationItem.price }, + 'price' + ) + let error = false + const occ = variation.filter(v => v.title === variationItem.title) + if (occ.length > 1) error = true + variationItem.titleError = error + ? !error + : variations.length > 1 + ? !validateFunc({ title: variationItem.title }, 'title') + : true + + return variationItem + }) + const variationsError = !variation.filter( + variationItem => !variationItem.priceError || !variationItem.titleError + ).length + titleErrorSetter(titleError) + categoryErrorSetter(categoryError) + variationSetter([...variations]) + return titleError && categoryError && variationsError + } + const clearFields = () => { + // formRef.current.reset() + variationSetter([ + { + title: '', + price: '', + discounted: '', + addons: [], + titleError: null, + priceError: null + } + ]) + imgMenuSetter('') + titleErrorSetter(null) + categoryErrorSetter(null) + } + const onBlurVariation = (index, type) => { + const variations = [...variation] + if (type === 'title') { + const occ = variations.filter(v => v.title === variations[index][type]) + if (occ.length > 1) { + variations[index][type + 'Error'] = false + } else { + variations[index][type + 'Error'] = + variations.length > 1 + ? !validateFunc({ [type]: variations[index][type] }, type) + : true + } + } + + if (type === 'price') { + variations[index][type + 'Error'] = !validateFunc( + { [type]: variations[index][type] }, + type + ) + } + variationSetter([...variations]) + } + + const updateAddonsList = ids => { + const variations = variation + variations[variationIndex].addons = variations[ + variationIndex + ].addons.concat(ids) + variationSetter([...variations]) + } + + // show Create Addon modal + const toggleModal = index => { + addonModalSetter(prev => !prev) + variationIndexSetter(index) + } + const onSelectAddon = (index, id) => { + const variations = variation + const addon = variations[index].addons.indexOf(id) + if (addon < 0) variations[index].addons.push(id) + else variations[index].addons.splice(addon, 1) + variationSetter([...variations]) + } + const onDismiss = () => { + successSetter('') + mainErrorSetter('') + } + const imageToBase64 = imgUrl => { + const fileReader = new FileReader() + fileReader.onloadend = () => { + imgMenuSetter(fileReader.result) + } + fileReader.readAsDataURL(imgUrl) + } + const uploadImageToCloudinary = async() => { + if (imgMenu === '') return imgMenu + if (props.food && props.food.image === imgMenu) return imgMenu + + const apiUrl = CLOUDINARY_UPLOAD_URL + const data = { + file: imgMenu, + upload_preset: CLOUDINARY_FOOD + } + try { + const result = await fetch(apiUrl, { + body: JSON.stringify(data), + headers: { + 'content-type': 'application/json' + }, + method: 'POST' + }) + const imageData = await result.json() + return imageData.secure_url + } catch (e) { + console.log(e) + } + } + const { t } = props + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + + {props.food ? t('Edit Food') : t('Add Food')} + + + + +
+ + {t('Title')} + setTitle(e.target.value)} + onBlur={event => + onBlur(titleErrorSetter, 'title', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + titleError === false + ? globalClasses.inputError + : titleError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + {t('Description')} + + setDescription(e.target.value)} + disableUnderline + className={[globalClasses.input]} + /> + {loadingCategories &&
Loading...
} + {errorCategories &&
Error {errorCategories.message}
} + + + + + + ... + + { + selectImage(event, 'imgMenu') + }} + /> + + + + + + + {t('Variations')} + + + + + {variation.map((variationItem, index) => ( + + + + + + + {t('UniqueTitle')} + + { + handleVariationChange( + event, + index, + 'title', + 'variations' + ) + }} + onBlur={event => { + onBlurVariation(index, 'title') + }} + disableUnderline + className={[ + globalClasses.input, + variationItem.titleError === false + ? globalClasses.inputError + : variationItem.titleError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('Price')} + + { + handleVariationChange( + event, + index, + 'price', + 'variations' + ) + }} + onBlur={event => { + onBlurVariation(index, 'price') + }} + disableUnderline + className={[ + globalClasses.input, + variationItem.priceError === false + ? globalClasses.inputError + : variationItem.priceError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('Discounted')} + + { + handleVariationChange( + event, + index, + 'discounted', + 'variations' + ) + }} + onBlur={event => { + onBlurVariation(index, 'discounted') + }} + disableUnderline + className={[globalClasses.input]} + /> + + + + + + + { + onRemove(index) + }} + /> + { + onAdd(index) + }} + /> + + + {loadingAddons && t('LoadingDots')} + {errorAddons && t('ErrorDots')} + {dataAddons && + dataAddons.restaurant.addons.map(addon => ( + + + onSelectAddon(index, addon._id) + } + /> + } + label={`${addon.title} (Description: ${addon.description})(Min: ${addon.quantityMinimum})(Max: ${addon.quantityMaximum})`} + /> + + ))} + + + + ))} + + +
+ + + + + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ { + toggleModal() + }}> + + +
+ ) +} +export default withTranslation()(Food) diff --git a/enatega-multivendor-admin/src/components/Food/styles.js b/enatega-multivendor-admin/src/components/Food/styles.js new file mode 100644 index 0000000..2516bd7 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Food/styles.js @@ -0,0 +1,142 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + width60: { + width: '75%', + alignSelf: 'center' + }, + innerContainer: { + padding: 12, + backgroundColor: theme.palette.common.white, + borderRadius: 20, + textAlign: 'left' + }, + heading: { + backgroundColor: theme.palette.primary.main3, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + }, + fileUpload: { + marginTop: 10, + backgroundColor: theme.palette.primary.main2, + display: 'inlineBlock', + padding: '3px 6px', + cursor: 'pointer', + color: theme.palette.common.white, + borderRadius: 10, + fontSize: 12 + }, + file: { + display: 'none' + }, + image: { + width: 120, + height: 120, + borderRadius: 30 + }, + button: { + backgroundColor: theme.palette.common.black, + height: 35, + borderRadius: 15, + color: theme.palette.primary.main2, + fontWeight: 'bold', + border: 'none', + margin: '20px 0 20px 0', + '&:hover': { + backgroundColor: theme.palette.primary.main, + color: theme.palette.common.white + } + }, + space: { + display: 'flex', + justifyContent: 'space-between' + }, + itemHeader: { + textAlign: 'left', + marginLeft: 20, + fontWeight: 'bold' + }, + quantity: { + padding: 2, + border: '1px solid grey', + borderRadius: 5 + }, + items: {}, + price: { + backgroundColor: theme.palette.common.black, + borderRadius: 20, + alignItems: 'center', + textAlign: 'center' + }, + textBlack: { + color: theme.palette.common.black + }, + textPrimary: { + color: theme.palette.primary.main2 + }, + pd: { + paddingTop: 10, + paddingBottom: 10, + marginBottom: 10 + }, + pb: { + paddingBottom: 20 + }, + btnBox: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center' + }, + inputLength: { + width: '50%' + }, + bgPrimary: { + backgroundColor: theme.palette.primary.main2, + width: '70%', + marginLeft: '15%' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Footers/AdminFooter.jsx b/enatega-multivendor-admin/src/components/Footers/AdminFooter.jsx new file mode 100644 index 0000000..e6d04b7 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Footers/AdminFooter.jsx @@ -0,0 +1,61 @@ +import * as React from 'react' +import { + Box, + Link, + BottomNavigation, + Typography, + useTheme +} from '@mui/material' +import useStyles from './styles' +import { withTranslation } from 'react-i18next' + +function AdminFooter(props) { + const theme = useTheme() + const { t } = props + const [value, setValue] = React.useState(0) + const classes = useStyles() + + return ( + + { + setValue(newValue) + }}> + ©2022 + + + {t('EnategaMultivendor')} + + + {t('About Us')} + + + {t('Blog')} + + + + ) +} + +export default withTranslation()(AdminFooter) diff --git a/enatega-multivendor-admin/src/components/Footers/AuthFooter.jsx b/enatega-multivendor-admin/src/components/Footers/AuthFooter.jsx new file mode 100644 index 0000000..386a19e --- /dev/null +++ b/enatega-multivendor-admin/src/components/Footers/AuthFooter.jsx @@ -0,0 +1,45 @@ +import * as React from 'react' +import { Box, Link, BottomNavigation, Typography } from '@mui/material' +import useStyles from './styles' + +export default function AuthFooter(props) { + const classes = useStyles() + + return ( + + + ©2022 + + + Enatega Multivendor + + + About Us + + + Blog + + + + ) +} diff --git a/enatega-multivendor-admin/src/components/Footers/styles.js b/enatega-multivendor-admin/src/components/Footers/styles.js new file mode 100644 index 0000000..d3a0441 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Footers/styles.js @@ -0,0 +1,20 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + footer: { + marginTop: '20%', + width: '100%', + padding: 3, + background: `linear-gradient(237.49deg, ${theme.palette.success.lightest} 0.63%, ${theme.palette.success.darkest} 85.49%)` + }, + link: { + padding: 10, + color: theme.palette.secondary.dark, + '&:hover': { color: theme.palette.primary.main2 } + }, + text: { + padding: 10 + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/GoogleMapsLoader/GoogleMapsLoader.js b/enatega-multivendor-admin/src/components/GoogleMapsLoader/GoogleMapsLoader.js new file mode 100644 index 0000000..57dd537 --- /dev/null +++ b/enatega-multivendor-admin/src/components/GoogleMapsLoader/GoogleMapsLoader.js @@ -0,0 +1,34 @@ +import React from 'react' +import { Box, CircularProgress } from '@mui/material' +import { useJsApiLoader } from '@react-google-maps/api' + +const GoogleMapsLoader = ({ children, GOOGLE_MAPS_KEY }) => { + const { isLoaded } = useJsApiLoader({ + id: 'google-map-script', + googleMapsApiKey: GOOGLE_MAPS_KEY, + libraries: [ + 'drawing', + 'places', + 'geometry', + 'localContext', + 'visualization' + ] + }) + console.log('isLoaded ', isLoaded) + if (!isLoaded) { + return ( + + + + ) + } + + return <>{children} +} +export default GoogleMapsLoader diff --git a/enatega-multivendor-admin/src/components/Headers/Header.jsx b/enatega-multivendor-admin/src/components/Headers/Header.jsx new file mode 100644 index 0000000..c84e2d7 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Headers/Header.jsx @@ -0,0 +1,29 @@ +import React from 'react' +import { Box, useMediaQuery, useTheme } from '@mui/material' +import HeaderIcon from '../../assets/svg/header.svg' +function Header() { + const theme = useTheme() + const matches = useMediaQuery('(min-width:1350px)') + return ( + <> + + + ) +} + +export default Header diff --git a/enatega-multivendor-admin/src/components/Loader/CustomLoader.jsx b/enatega-multivendor-admin/src/components/Loader/CustomLoader.jsx new file mode 100644 index 0000000..45a6e11 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Loader/CustomLoader.jsx @@ -0,0 +1,20 @@ +import React from 'react' +import Loader from 'react-loader-spinner' +import { useTheme } from '@mui/material' + +const CustomLoader = () => { + const theme = useTheme() + + return ( +
+ +
+ ) +} + +export default CustomLoader diff --git a/enatega-multivendor-admin/src/components/Navbars/AdminNavbar.jsx b/enatega-multivendor-admin/src/components/Navbars/AdminNavbar.jsx new file mode 100644 index 0000000..d36be4a --- /dev/null +++ b/enatega-multivendor-admin/src/components/Navbars/AdminNavbar.jsx @@ -0,0 +1,208 @@ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import ResetPassword from '../ResetPassword/ResetPassword' +import { useApolloClient } from '@apollo/client' +import { + IconButton, + Menu, + MenuItem, + Modal, + Typography, + AppBar, + Box, + Toolbar, + Divider, + FormControl, + Select, + useTheme +} from '@mui/material' + +function AdminNavbar(props) { + const theme = useTheme() + const client = useApolloClient() + const [modal, setModal] = useState(false) + const [language, setLanguage] = useState( + localStorage.getItem('enatega-language') || 'en' + ) + const [anchorEl, setAnchorEl] = useState(null) // Define anchorEl state + + const { t, i18n } = props + + const toggleModal = () => { + setModal(prev => !prev) + } + + const handleMenu = event => { + setAnchorEl(event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + const handleChangeLanguage = event => { + const newLanguage = event.target.value + setLanguage(newLanguage) + localStorage.setItem('enatega-language', newLanguage) + i18n.changeLanguage(newLanguage) + handleClose() + } + + const vendor = localStorage.getItem('user-enatega') + ? JSON.parse(localStorage.getItem('user-enatega')).userType === 'VENDOR' + : false + + return ( + + + + + {props.match.path === '/restaurant' ? '' : t(props.brandText)} + + +
+ + + ... + + + Ninja + + + + + + + + + + {t('Welcome')} + + + {vendor ? ( + { + e.preventDefault() + toggleModal() + }}> + {t('ResetPassword')} + + ) : null} + { + e.preventDefault() + localStorage.removeItem('user-enatega') + localStorage.removeItem('restaurant_id') + client.clearStore() + props.history.push('/auth/login') + }}> + {t('Logout')} + + +
+
+
+ { + toggleModal() + }}> + + +
+ ) +} + +export default withTranslation()(AdminNavbar) diff --git a/enatega-multivendor-admin/src/components/Navbars/AuthNavbar.jsx b/enatega-multivendor-admin/src/components/Navbars/AuthNavbar.jsx new file mode 100644 index 0000000..c3d63c5 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Navbars/AuthNavbar.jsx @@ -0,0 +1,23 @@ +import React from 'react' +import { withTranslation } from 'react-i18next' +import { Typography, AppBar, Box, Toolbar } from '@mui/material' + +function AdminNavbar(props) { + return ( + + + + + {t('EnategaDashboard')} + + + + + ) +} + +export default withTranslation()(AdminNavbar) diff --git a/enatega-multivendor-admin/src/components/Option/Option.jsx b/enatega-multivendor-admin/src/components/Option/Option.jsx new file mode 100644 index 0000000..52592b3 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Option/Option.jsx @@ -0,0 +1,327 @@ +import React, { useState } from 'react' +import { + Box, + Typography, + Input, + Alert, + Button, + Grid, + useTheme +} from '@mui/material' +import { withTranslation } from 'react-i18next' +import { useMutation, gql } from '@apollo/client' +import { createOptions, editOption } from '../../apollo' +import { validateFunc } from '../../constraints/constraints' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import AddIcon from '@mui/icons-material/Add' +import RemoveIcon from '@mui/icons-material/Remove' + +const CREATE_OPTIONS = gql` + ${createOptions} +` + +const EDIT_OPTION = gql` + ${editOption} +` + +function Option(props) { + const theme = useTheme() + const { t } = props + const [option, optionSetter] = useState( + props.option + ? [{ ...props.option, titleError: false, priceError: false }] + : [ + { + title: '', + description: '', + price: 0, + titleError: false, + priceError: false + } + ] + ) + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const mutation = props.option ? EDIT_OPTION : CREATE_OPTIONS + const onCompleted = ({ createOptions, editOption }) => { + if (createOptions) { + optionSetter([ + { + title: '', + description: '', + price: 0, + titleError: false, + priceError: false + } + ]) + successSetter(t('Saved')) + mainErrorSetter('') + setTimeout(hideAlert, 3000) + } + if (editOption) { + successSetter(t('Saved')) + mainErrorSetter('') + } + } + const onError = error => { + mainErrorSetter(`${t('errorWhileSaving')} ${error}`) + successSetter('') + setTimeout(hideAlert, 3000) + } + const [mutate, { loading }] = useMutation(mutation, { onError, onCompleted }) + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + const onBlur = (index, state) => { + const options = option + if (state === 'title') { + options[index].titleError = !!validateFunc( + { optionTitle: options[index][state] }, + 'optionTitle' + ) + } + if (state === 'price') { + options[index].priceError = !!validateFunc( + { optionPrice: options[index][state] }, + 'optionPrice' + ) + } + optionSetter([...options]) + } + const onAdd = index => { + const options = option + if (index === options.length - 1) { + options.push({ title: '', description: '', price: 0 }) + } else { + options.splice(index + 1, 0, { title: '', description: '', price: 0 }) + } + optionSetter([...options]) + } + const onRemove = index => { + if (option.length === 1 && index === 0) { + return + } + const options = option + options.splice(index, 1) + optionSetter([...options]) + } + const onChange = (event, index, state) => { + const options = option + options[index][state] = event.target.value + optionSetter([...options]) + } + const validate = () => { + const options = option + options.map((option, index) => { + onBlur(index, 'title') + onBlur(index, 'description') + onBlur(index, 'price') + return option + }) + const error = options.filter( + option => option.titleError || option.priceError + ) + if (!error.length) return true + return false + } + + const restaurantId = localStorage.getItem('restaurantId') + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.option ? t('UpdateOption') : t('AddOption')} + + + + + +
+ {option.map((optionItem, index) => ( + + +
+ + {t('Title')} + + { + onChange(event, index, 'title') + }} + disableUnderline + className={[ + globalClasses.input, + optionItem.titleError === true + ? globalClasses.inputError + : '' + ]} + /> +
+
+ +
+ + {t('Description')} + + { + onChange(event, index, 'description') + }} + disableUnderline + className={[ + globalClasses.input, + optionItem.descriptionError === true + ? globalClasses.inputError + : '' + ]} + /> +
+
+ +
+ + {t('Price')} + + { + onChange(event, index, 'price') + }} + disableUnderline + className={[ + globalClasses.input, + optionItem.priceError === true + ? globalClasses.inputError + : '' + ]} + /> +
+
+ + {!props.option && ( +
+ { + onRemove(index) + }} + /> + { + onAdd(index) + }} + /> +
+ )} +
+
+ ))} + + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ ) +} +export default withTranslation()(Option) diff --git a/enatega-multivendor-admin/src/components/Option/styles.js b/enatega-multivendor-admin/src/components/Option/styles.js new file mode 100644 index 0000000..61dcd30 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Option/styles.js @@ -0,0 +1,70 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main3, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + form: { + margin: 25, + alignItems: 'center' + }, + btn: { + // height: 20, + // width: 20, + // padding: 0, + // borderRadius: '50%', + // marginTop: 20 + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + addIcon: { + backgroundColor: theme.palette.primary.main2, + color: theme.palette.common.black, + borderRadius: '50%', + margin: '0 10px 0 0' + }, + removeIcon: { + backgroundColor: theme.palette.common.black, + color: theme.palette.primary.main2, + borderRadius: '50%', + margin: '0 10px 0 0' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Order/Order.jsx b/enatega-multivendor-admin/src/components/Order/Order.jsx new file mode 100644 index 0000000..9579f5a --- /dev/null +++ b/enatega-multivendor-admin/src/components/Order/Order.jsx @@ -0,0 +1,291 @@ +import React, { useState } from 'react' +import { useMutation, useQuery, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import { validateFunc } from '../../constraints/constraints' +import { updateOrderStatus, getConfiguration } from '../../apollo' +import Loader from 'react-loader-spinner' +import { + Box, + Divider, + Grid, + Typography, + Alert, + Input, + Button, + useTheme +} from '@mui/material' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' + +// constants +const UPDATE_STATUS = gql` + ${updateOrderStatus} +` + +const GET_CONFIGURATION = gql` + ${getConfiguration} +` + +function Order(props) { + const theme = useTheme() + const { order, t } = props + const [reason, reasonSetter] = useState('') + const [reasonError, reasonErrorSetter] = useState(null) + const [error, errorSetter] = useState('') + const [success, successSetter] = useState('') + + const onCompleted = ({ updateOrderStatus }) => { + if (updateOrderStatus) { + successSetter(t('OrderStatusUpdated')) + } + setTimeout(onDismiss, 5000) + } + const onError = error => { + errorSetter(error.message) + setTimeout(onDismiss, 5000) + } + const { data } = useQuery(GET_CONFIGURATION) + const [mutate, { loading }] = useMutation(UPDATE_STATUS, { + onError, + onCompleted + }) + + const validateReason = () => { + const reasonError = !validateFunc({ reason }, 'reason') + reasonErrorSetter(reasonError) + return reasonError + } + + const onDismiss = () => { + errorSetter('') + successSetter('') + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + if (!props.order) return null + return ( + + + + + {t('Order')} # {order.orderId} + + + + + + {t('Items')} + + + {order && + order.items.map(item => ( + <> + + + + {item.quantity} + + + + {`${item.title}${ + item.variation.title ? `(${item.variation.title})` : '' + }`} + + + {data && data.configuration.currencySymbol}{' '} + {(item.variation.price * item.quantity).toFixed(2)} + + + {item.specialInstructions.length > 0 && ( + + {t('SpecialInstructions')} + + )} + + + ))} + + + + + {t('Charges')} + + + + + {t('Subtotal')} + + + {data && data.configuration.currencySymbol}{' '} + {( + order.orderAmount - + order.deliveryCharges - + order.tipping - + order.taxationAmount + ).toFixed(2)} + + + + + + {t('DeliveryFee')} + + + {data && data.configuration.currencySymbol}{' '} + {order && order.deliveryCharges.toFixed(2)} + + + + + + {t('TaxCharges')} + + + {data && data.configuration.currencySymbol}{' '} + {order && order.taxationAmount.toFixed(2)} + + + + + + {t('Tip')} + + + {data && data.configuration.currencySymbol}{' '} + {order && order.tipping.toFixed(2)} + + + + + + {t('Total')} + + + {data && data.configuration.currencySymbol}{' '} + {order && order.orderAmount.toFixed(2)} + + + + + + + + {t('PaymentMethod')} + + + + + + {order.paymentMethod} + + + + + + + + {t('PaidAmount')} + + + + {data && data.configuration.currencySymbol}{' '} + {order && order.paidAmount ? order.paidAmount.toFixed(2) : 0} + + + + + {order.orderStatus !== 'CANCELLED' && order.orderStatus !== 'DELIVERED' && ( + <> + {loading && ( + + )} + + + + { + reasonSetter(event.target.value) + }} + className={[globalClasses.input, classes.inputLength]} + /> + + {reasonError ? null : null} + + )} + + {success && ( + + {success} + + )} + {error && ( + + {error} + + )} + + + ) +} +export default withTranslation()(Order) diff --git a/enatega-multivendor-admin/src/components/Order/OrdersData.jsx b/enatega-multivendor-admin/src/components/Order/OrdersData.jsx new file mode 100644 index 0000000..89850df --- /dev/null +++ b/enatega-multivendor-admin/src/components/Order/OrdersData.jsx @@ -0,0 +1,188 @@ +/* eslint-disable react/display-name */ +import React, { useEffect, useState } from 'react' +import { withTranslation } from 'react-i18next' +import { transformToNewline } from '../../utils/stringManipulations' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import CustomLoader from '../Loader/CustomLoader' +import { subscribePlaceOrder, orderCount } from '../../apollo' +import { useQuery, gql } from '@apollo/client' +import SearchBar from '../TableHeader/SearchBar' +import { customStyles } from '../../utils/tableCustomStyles' +import TableHeader from '../TableHeader' +import { useTheme } from '@mui/material' + +const ORDERCOUNT = gql` + ${orderCount} +` +const ORDER_PLACED = gql` + ${subscribePlaceOrder} +` + +const OrdersData = props => { + const theme = useTheme() + const { t } = props + const { selected, updateSelected } = props + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const getItems = items => { + return items + .map( + item => + `${item.quantity}x${item.title}${ + item.variation.title ? `(${item.variation.title})` : '' + }` + ) + .join('\n') + } + const restaurantId = localStorage.getItem('restaurantId') + + const { data, loading: loadingQuery } = useQuery(ORDERCOUNT, { + variables: { restaurant: restaurantId } + }) + + const propExists = (obj, path) => { + return path.split('.').reduce((obj, prop) => { + return obj && obj[prop] ? obj[prop] : '' + }, obj) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (field && isNaN(propExists(row, field))) { + return propExists(row, field).toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const handlePerRowsChange = (perPage, page) => { + props.page(page) + props.rows(perPage) + } + + const handlePageChange = async page => { + props.page(page) + } + + const columns = [ + { + name: t('OrderID'), + sortable: true, + selector: 'orderId' + }, + { + name: t('Items'), + cell: row => <>{getItems(row.items)} + }, + { + name: t('Payment'), + selector: 'paymentMethod', + sortable: true + }, + { + name: t('Status'), + selector: 'orderStatus', + sortable: true + }, + { + name: t('Datetime'), + cell: row => ( + <>{new Date(row.createdAt).toLocaleString().replace(/ /g, '\n')} + ) + }, + { + name: t('Address'), + cell: row => ( + <>{transformToNewline(row.deliveryAddress.deliveryAddress, 3)} + ) + } + ] + + const conditionalRowStyles = [ + { + when: row => + row.orderStatus !== 'DELIVERED' && row.orderStatus !== 'CANCELLED', + style: { + backgroundColor: theme.palette.warning.lightest + } + } + ] + useEffect(() => { + props.subscribeToMore({ + document: ORDER_PLACED, + variables: { id: restaurantId }, + updateQuery: (prev, { subscriptionData }) => { + if (!subscriptionData.data) return prev + if (subscriptionData.data.subscribePlaceOrder.origin === 'new') { + return { + ordersByRestId: [ + subscriptionData.data.subscribePlaceOrder.order, + ...prev.ordersByRestId + ] + } + } else { + const orderIndex = prev.ordersByRestId.findIndex( + o => subscriptionData.data.subscribePlaceOrder.order._id === o._id + ) + prev.ordersByRestId[orderIndex] = + subscriptionData.data.subscribePlaceOrder.order + return { ordersByRestId: [...prev.ordersByRestId] } + } + }, + onError: error => { + console.log('onError', error) + } + }) + }, []) + useEffect(() => { + if (selected) { + const order = props.orders.find(o => o._id === selected._id) + updateSelected(order) + } + }, [props.orders]) + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? props && props.orders + : props.orders && + props.orders.filter(order => { + return order.orderId.toLowerCase().search(regex) > -1 + }) + + return ( + <> + } + columns={columns} + data={filtered} + onRowClicked={props.toggleModal} + progressPending={props.loading || loadingQuery} + pointerOnHover + progressComponent={} + sortFunction={customSort} + subHeader + subHeaderComponent={ + + } + pagination + paginationServer + paginationTotalRows={data && data.orderCount} + onChangeRowsPerPage={handlePerRowsChange} + onChangePage={handlePageChange} + conditionalRowStyles={conditionalRowStyles} + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + + ) +} +export default withTranslation()(OrdersData) diff --git a/enatega-multivendor-admin/src/components/Order/styles.js b/enatega-multivendor-admin/src/components/Order/styles.js new file mode 100644 index 0000000..29db4e1 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Order/styles.js @@ -0,0 +1,86 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + color: 'red', + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + marginLeft: '15%', + marginRight: '15%' + // paddingBottom: 5 + }, + bgPrimary: { + backgroundColor: theme.palette.primary.main2 + }, + innerContainer: { + padding: 12, + backgroundColor: theme.palette.common.white, + borderRadius: 20, + textAlign: 'left' + }, + heading: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + form: { + margin: 25, + alignItems: 'center' + }, + text: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + itemHeader: { + textAlign: 'left', + marginLeft: 20, + fontWeight: 'bold', + color: 'black' + }, + quantity: { + padding: 2, + border: '1px solid grey', + borderRadius: 5 + }, + items: {}, + price: { + backgroundColor: theme.palette.common.black, + borderRadius: 20, + alignItems: 'center', + textAlign: 'center' + }, + textBlack: { + color: theme.palette.common.black + }, + textPrimary: { + color: theme.palette.primary.main2 + }, + pd: { + paddingTop: 10, + paddingBottom: 10, + marginBottom: 10 + }, + pb: { + paddingBottom: 20 + }, + btnBox: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center' + }, + inputLength: { + width: '50%' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/ResetPassword/ResetPassword.jsx b/enatega-multivendor-admin/src/components/ResetPassword/ResetPassword.jsx new file mode 100644 index 0000000..16ea6eb --- /dev/null +++ b/enatega-multivendor-admin/src/components/ResetPassword/ResetPassword.jsx @@ -0,0 +1,164 @@ +import React, { useState, useRef } from 'react' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { vendorResetPassword } from '../../apollo' +import { Box, Typography, Input, Alert, Button } from '@mui/material' +import useStyles from '../Configuration/styles' +import useGlobalStyles from '../../utils/globalStyles' +const CHANGE_PASSWORD = gql` + ${vendorResetPassword} +` + +function ResetPassword(props) { + const { t } = props + const formRef = useRef() + const [passError, passErrorSetter] = useState(null) + const [confirmPassError, confirmPassErrorSetter] = useState(null) + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const onSubmitValidaiton = () => { + const oldPassword = !validateFunc( + { password: formRef.current['input-oldPassword'].value }, + 'password' + ) + const newPassword = !validateFunc( + { password: formRef.current['input-newPassword'].value }, + 'password' + ) + passErrorSetter(oldPassword) + confirmPassErrorSetter(newPassword) + + return oldPassword && newPassword + } + const onCompleted = data => { + const message = t('PasswordChangedSuccessfully') + mainErrorSetter('') + successSetter(message) + setTimeout(hideAlert, 5000) + } + const onError = ({ graphQLErrors, networkError }) => { + if (graphQLErrors) { + mainErrorSetter(graphQLErrors[0].message) + } + if (networkError) { + mainErrorSetter(networkError.result.errors[0].message) + } + successSetter('') + setTimeout(hideAlert, 5000) + } + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + const [mutate] = useMutation(CHANGE_PASSWORD, { + onError, + onCompleted + }) + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {t('ResetPassword')} + + + + + +
+ + { + onBlur(passErrorSetter, 'password', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + passError === false + ? globalClasses.inputError + : passError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + { + onBlur(confirmPassErrorSetter, 'password', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + confirmPassError === false + ? globalClasses.inputError + : confirmPassError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + +
+ + {success && ( + + Success + + )} + {mainError && ( + + Error + + )} + +
+
+ ) +} + +export default withTranslation()(ResetPassword) diff --git a/enatega-multivendor-admin/src/components/Restaurant/Card.jsx b/enatega-multivendor-admin/src/components/Restaurant/Card.jsx new file mode 100644 index 0000000..c48ebac --- /dev/null +++ b/enatega-multivendor-admin/src/components/Restaurant/Card.jsx @@ -0,0 +1,59 @@ +import * as React from 'react' +import Card from '@mui/material/Card' +import CardContent from '@mui/material/CardContent' +import CardMedia from '@mui/material/CardMedia' +import Typography from '@mui/material/Typography' +import { CardActionArea, useTheme } from '@mui/material' + +export default function RestaurantCard(props) { + const theme = useTheme() + return ( + + + + + + + {props.rest.name} + + + {props.rest.address} + + + + + ) +} diff --git a/enatega-multivendor-admin/src/components/Restaurant/CreateRestaurant.jsx b/enatega-multivendor-admin/src/components/Restaurant/CreateRestaurant.jsx new file mode 100644 index 0000000..84ede30 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Restaurant/CreateRestaurant.jsx @@ -0,0 +1,590 @@ +import React, { useState, useRef, useMemo } from 'react' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { useMutation, gql, useQuery } from '@apollo/client' +import { createRestaurant, getCuisines, restaurantByOwner } from '../../apollo' + +import { + Box, + Alert, + Typography, + Button, + Input, + Switch, + Grid, + Checkbox, + InputLabel, + Select, + OutlinedInput, + MenuItem, + ListItemText +} from '@mui/material' + +import ConfigurableValues from '../../config/constants' + +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' +import { SHOP_TYPE } from '../../utils/enums' +import Dropdown from '../Dropdown' + +const CREATE_RESTAURANT = gql` + ${createRestaurant} +` +const RESTAURANT_BY_OWNER = gql` + ${restaurantByOwner} +` +const CUISINES = gql` + ${getCuisines} +` +const ITEM_HEIGHT = 48 +const ITEM_PADDING_TOP = 8 +const MenuProps = { + PaperProps: { + style: { + maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, + width: 250 + } + } +} + +const CreateRestaurant = props => { + const { CLOUDINARY_UPLOAD_URL, CLOUDINARY_FOOD } = ConfigurableValues() + + const { t } = props + + const owner = props.owner + const [showPassword, setShowPassword] = useState(false) + const [imgUrl, setImgUrl] = useState('') + const [nameError, setNameError] = useState(null) + const [usernameError, setUsernameError] = useState(null) + const [passwordError, setPasswordError] = useState(null) + const [addressError, setAddressError] = useState(null) + const [deliveryTimeError, setDeliveryTimeError] = useState(null) + const [minimumOrderError, setMinimumOrderError] = useState(null) + const [salesTaxError, setSalesTaxError] = useState(null) + const [restaurantCuisines, setRestaurantCuisines] = React.useState([]) + + // const [shopType, setShopType] = useState(SHOP_TYPE.RESTAURANT) + const [errors, setErrors] = useState('') + const [success, setSuccess] = useState('') + const onCompleted = data => { + console.log('on complete here') + setNameError(null) + setAddressError(null) + setUsernameError(null) + setPasswordError(null) + setDeliveryTimeError(null) + setMinimumOrderError(null) + setErrors('') + setSalesTaxError(null) + setSuccess(t('RestaurantAdded')) + clearFormValues() + setTimeout(hideAlert, 5000) + } + const onError = ({ graphQLErrors, networkError }) => { + console.log('graphQLErrors', graphQLErrors) + console.log('networkErrors', networkError) + setNameError(null) + setAddressError(null) + setUsernameError(null) + setPasswordError(null) + setDeliveryTimeError(null) + setMinimumOrderError(null) + setSalesTaxError(null) + setSuccess('') + if (graphQLErrors && graphQLErrors.length) { + setErrors(graphQLErrors[0].message) + } + if (networkError) { + setErrors(t('NetworkError')) + } + setTimeout(hideAlert, 5000) + } + const hideAlert = () => { + setErrors('') + setSuccess('') + } + + const { data: cuisines } = useQuery(CUISINES) + const cuisinesInDropdown = useMemo( + () => cuisines?.cuisines?.map(item => item.name), + [cuisines] + ) + console.log('cuisines => ', cuisinesInDropdown) + + const [mutate, { loading }] = useMutation(CREATE_RESTAURANT, { + onError, + onCompleted, + update + }) + + const formRef = useRef(null) + + const selectImage = (event, state) => { + const result = filterImage(event) + if (result) imageToBase64(result) + } + + const filterImage = event => { + let images = [] + for (var i = 0; i < event.target.files.length; i++) { + images[i] = event.target.files.item(i) + } + images = images.filter(image => image.name.match(/\.(jpg|jpeg|png|gif)$/)) + return images.length ? images[0] : undefined + } + const imageToBase64 = imgUrl => { + const fileReader = new FileReader() + fileReader.onloadend = () => { + setImgUrl(fileReader.result) + } + fileReader.readAsDataURL(imgUrl) + } + const uploadImageToCloudinary = async() => { + if (imgUrl === '') return imgUrl + + const apiUrl = CLOUDINARY_UPLOAD_URL + const data = { + file: imgUrl, + upload_preset: CLOUDINARY_FOOD + } + try { + const result = await fetch(apiUrl, { + body: JSON.stringify(data), + headers: { + 'content-type': 'application/json' + }, + method: 'POST' + }) + const imageData = await result.json() + return imageData.secure_url + } catch (e) { + console.log(e) + } + } + + const onSubmitValidaiton = data => { + const form = formRef.current + const name = form.name.value + const address = form.address.value + const username = form.username.value + const password = form.password.value + // IMPORTANT!!!! + const deliveryTime = form.deliveryTime.value + const minimumOrder = form.minimumOrder.value + const salesTax = +form.salesTax.value + + const nameError = !validateFunc({ name }, 'name') + const addressError = !validateFunc({ address }, 'address') + + const deliveryTimeError = !validateFunc( + { deliveryTime: deliveryTime }, + 'deliveryTime' + ) + const minimumOrderError = !validateFunc( + { minimumOrder: minimumOrder }, + 'minimumOrder' + ) + const usernameError = !validateFunc({ name: username }, 'name') + const passwordError = !validateFunc({ password }, 'password') + const salesTaxError = !validateFunc({ salesTax }, 'salesTax') + setNameError(nameError) + setAddressError(addressError) + setUsernameError(usernameError) + setPasswordError(passwordError) + setDeliveryTimeError(deliveryTimeError) + setMinimumOrderError(minimumOrderError) + setSalesTaxError(salesTaxError) + if ( + !( + nameError && + addressError && + usernameError && + passwordError && + deliveryTimeError && + minimumOrderError && + salesTaxError + ) + ) { + setErrors(t('FieldsRequired')) + } + return ( + nameError && + addressError && + usernameError && + passwordError && + deliveryTimeError && + minimumOrderError && + salesTaxError + ) + } + function update(cache, { data: { createRestaurant } }) { + const { restaurantByOwner } = cache.readQuery({ + query: RESTAURANT_BY_OWNER, + variables: { id: owner } + }) + cache.writeQuery({ + query: RESTAURANT_BY_OWNER, + variables: { id: owner }, + data: { + restaurantByOwner: { + ...restaurantByOwner, + restaurants: [...restaurantByOwner.restaurants, createRestaurant] + } + } + }) + } + const clearFormValues = () => { + const form = formRef.current + form.name.value = '' + form.address.value = '' + form.username.value = '' + form.password.value = '' + form.deliveryTime.value = 20 + form.minimumOrder.value = 0 + setImgUrl('') + } + + const handleCuisineChange = event => { + const { + target: { value } + } = event + setRestaurantCuisines( + typeof value === 'string' ? value.split(',') : value + ) + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + + return ( + + + + + {t('AddRestaurant')} + + + + + + + + + +
+ + + + + {t('Username')} + + { + event.target.value = event.target.value + .trim() + .replace(/\s/g, '') + }} + /> + + + + + + {t('Password')} + + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + + + + + {t('Name')} + + + + + + + + {t('Address')} + + + + + + + + {t('DeliveryTime')} + + + + + + + + {t('MinOrder')} + + + + + + + + {t('SalesTax')} + + + + + + + + + + + {t('Cuisines')} + + + + + + + + ... + + { + selectImage(event, 'image_url') + }} + /> + + + + +
+ + {success && ( + + {success} + + )} + {errors && ( + + {errors} + + )} + +
+
+ ) +} +export default withTranslation()(CreateRestaurant) diff --git a/enatega-multivendor-admin/src/components/Restaurant/styles.js b/enatega-multivendor-admin/src/components/Restaurant/styles.js new file mode 100644 index 0000000..dad1869 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Restaurant/styles.js @@ -0,0 +1,69 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade})`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + heading2: { + backgroundColor: theme.palette.primary.main3, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + }, + image: { + width: 120, + height: 120, + borderRadius: 30 + }, + file: { + display: 'none' + }, + fileUpload: { + marginTop: 10, + backgroundColor: theme.palette.primary.main2, + display: 'inlineBlock', + padding: '3px 6px', + cursor: 'pointer', + color: theme.palette.common.white, + borderRadius: 10, + fontSize: 12 + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Rider/Rider.jsx b/enatega-multivendor-admin/src/components/Rider/Rider.jsx new file mode 100644 index 0000000..2999785 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Rider/Rider.jsx @@ -0,0 +1,405 @@ +import React, { useState, useRef } from 'react' +import { useMutation, useQuery, gql } from '@apollo/client' +import { validateFuncForRider } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +// core components +import { + createRider, + editRider, + getRiders, + getZones, + getAvailableRiders +} from '../../apollo' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Switch, + Typography, + Input, + Alert, + Select, + MenuItem, + Button, + Grid, + Checkbox +} from '@mui/material' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' + +const CREATE_RIDER = gql` + ${createRider} +` +const EDIT_RIDER = gql` + ${editRider} +` +const GET_RIDERS = gql` + ${getRiders} +` +const GET_ZONES = gql` + ${getZones} +` +const GET_AVAILABLE_RIDERS = gql` + ${getAvailableRiders} +` + +function Rider(props) { + const formRef = useRef() + const mutation = props.rider ? EDIT_RIDER : CREATE_RIDER + const name = props.rider ? props.rider.name : '' + const userName = props.rider ? props.rider.username : '' + const password = props.rider ? props.rider.password : '' + const phone = props.rider ? props.rider.phone : '' + const zone = props.rider ? props.rider.zone._id : '' + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [nameError, nameErrorSetter] = useState(null) + const [usernameError, usernameErrorSetter] = useState(null) + const [passwordError, passwordErrorSetter] = useState(null) + const [phoneError, phoneErrorSetter] = useState(null) + const [userNameErrorMessage, setUserNameErrorMessage] = useState('') + const [zoneError, zoneErrorSetter] = useState(null) + const [showPassword, setShowPassword] = useState(false) + const [riderAvailable, setRiderAvailable] = useState( + props.rider ? props.rider.available : true + ) + const [riderZone, setRiderZone] = useState( + props.rider ? props.rider.zone._id : '' + ) + + const onCompleted = data => { + if (!props.rider) clearFields() + const message = props.rider + ? t('RiderUpdatedSuccessfully') + : t('RiderAddedSuccessfully') + mainErrorSetter('') + successSetter(message) + setTimeout(hideAlert, 3000) + } + const onError = ({ graphQLErrors, networkError }) => { + if (graphQLErrors) { + mainErrorSetter(graphQLErrors[0].message) + } + if (networkError) { + mainErrorSetter(networkError.result.errors[0].message) + } + successSetter('') + setTimeout(hideAlert, 3000) + } + const [mutate, { loading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_RIDERS }, { query: GET_AVAILABLE_RIDERS }], + onError, + onCompleted + }) + const { data } = useQuery(GET_ZONES) + + const onBlur = (setter, field, state) => { + const validationResult = validateFuncForRider({ [field]: state }, field) + setter(validationResult.isValid) + } + const onSubmitValidaiton = () => { + const nameError = validateFuncForRider( + { name: formRef.current['input-name'].value }, + 'name' + ) + const usernameError = validateFuncForRider( + { username: formRef.current['input-userName'].value }, + 'username' + ) + const passwordError = validateFuncForRider( + { password: formRef.current['input-password'].value }, + 'password' + ) + const phoneError = validateFuncForRider( + { phone: formRef.current['input-phone'].value }, + 'phone' + ) + const zoneError = validateFuncForRider( + { zone: formRef.current['input-zone'].value }, + 'zone' + ) + + nameErrorSetter(nameError.isValid) + usernameErrorSetter(usernameError.isValid) + setUserNameErrorMessage(usernameError.errorMessage) + phoneErrorSetter(phoneError.isValid) + passwordErrorSetter(passwordError.isValid) + zoneErrorSetter(zoneError.isValid) + return ( + nameError.isValid && + usernameError.isValid && + phoneError.isValid && + passwordError.isValid && + zoneError.isValid + ) + } + const clearFields = () => { + formRef.current.reset() + nameErrorSetter(null) + usernameErrorSetter(null) + passwordErrorSetter(null) + phoneErrorSetter(null) + zoneErrorSetter(null) + } + + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + const { t } = props + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + + {props.rider ? t('EditRider') : t('AddRider')} + + + + + setRiderAvailable(e.target.checked)} + id="input-available" + name="input-available" + style={{ color: 'black' }} + /> + + + + {/* */} +
+ + + + {/* */} + {t('Name')} + { + onBlur(nameErrorSetter, 'name', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + nameError === false + ? globalClasses.inputError + : nameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + {/* */} + + + {/* */} + + {t('Username')} + + + onBlur(usernameErrorSetter, 'username', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + usernameError === false + ? globalClasses.inputError + : usernameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + {usernameError === false && ( + + {t(userNameErrorMessage)} + + )} + {/* */} + + + {/* */} + + {t('Password')} + + + onBlur(passwordErrorSetter, 'password', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + passwordError === false + ? globalClasses.inputError + : passwordError === true + ? globalClasses.inputSuccess + : '' + ]} + endAdornment={ + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + {/* */} + + + {/* */} + + {t('Number')} + + + onBlur(phoneErrorSetter, 'phone', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + phoneError === false + ? globalClasses.inputError + : phoneError === true + ? globalClasses.inputSuccess + : '' + ]} + pattern="[0-9]*" + /> + {/* */} + + + + + + + + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + + {/*
*/} +
+ ) +} +export default withTranslation()(Rider) diff --git a/enatega-multivendor-admin/src/components/Rider/styles.js b/enatega-multivendor-admin/src/components/Rider/styles.js new file mode 100644 index 0000000..f9e9a2f --- /dev/null +++ b/enatega-multivendor-admin/src/components/Rider/styles.js @@ -0,0 +1,55 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + }, + customNotification: { + borderRadius: '8px', // Use camelCase + boxShadow: 'none' // Use camelCase + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Section/Section.jsx b/enatega-multivendor-admin/src/components/Section/Section.jsx new file mode 100644 index 0000000..eaaaee6 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Section/Section.jsx @@ -0,0 +1,233 @@ +import React, { useState, useRef } from 'react' +import { useMutation, useQuery, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { + editSection, + restaurantList, + createSection, + getSections +} from '../../apollo' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Switch, + Typography, + Input, + Alert, + Button, + FormControlLabel, + Checkbox, + Grid +} from '@mui/material' + +const CREATE_SECTION = gql` + ${createSection} +` +const EDIT_SECTION = gql` + ${editSection} +` +const GET_SECTIONS = gql` + ${getSections} +` +const GET_RESTAURANT = gql` + ${restaurantList} +` + +function Section(props) { + const formRef = useRef() + const name = props.section ? props.section.name : '' + const mutation = props.section ? EDIT_SECTION : CREATE_SECTION + const [sectionEnable, setSectionEnable] = useState( + props.section ? props.section.enabled : false + ) + const [restaurant, restaurantSetter] = useState( + props.section ? props.section.restaurants.map(r => r._id) : [] + ) + const [error, errorSetter] = useState('') + const [success, successSetter] = useState('') + const [nameError, nameErrorSetter] = useState(null) + + const onCompleted = data => { + const message = props.section + ? t('SectionUpdatedSuccessfully') + : t('SectionAddeduccessfully') + successSetter(message) + errorSetter('') + if (!props.section) clearFields() + } + function onError(error) { + const message = `${t('ActionFailedTryAgain')} ${error}` + successSetter('') + errorSetter(message) + } + const [mutate, { loading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_SECTIONS }], + onCompleted, + onError + }) + + const { + data, + error: errorQuery, + loading: loadingQuery + } = useQuery(GET_RESTAURANT, { onError }) + + const onChange = event => { + // added this to keep default checked on editing + const value = event.target.value + const ids = restaurant + if (event.target.checked) { + ids.push(value) + } else { + const index = ids.indexOf(value) + if (index > -1) ids.splice(index, 1) + } + restaurantSetter([...ids]) + } + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const onSubmitValidation = () => { + const nameErrors = !validateFunc( + { name: formRef.current['input-name'].value }, + 'name' + ) + nameErrorSetter(nameErrors) + return nameErrors + } + const clearFields = () => { + formRef.current.reset() + nameErrorSetter(null) + } + + const { t } = props + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + + {props.section ? t('EditSection') : t('AddSection')} + + + + + setSectionEnable(e.target.checked)} + id="input-enable" + name="input-enable" + style={{ color: 'black' }} + /> + + + + +
+ + { + onBlur(nameErrorSetter, 'name', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + nameError === false + ? globalClasses.inputError + : nameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + {loadingQuery ?
{t('LoadingDots')}
: null} + {errorQuery ? ( +
+ {t('ErrorDots')} {JSON.stringify(error)} +
+ ) : null} + {data && + data.restaurantList.map(restaurantItem => ( + + + } + label={`${restaurantItem.name} (${restaurantItem.address})`} + /> + + ))} +
+ + + +
+ + {success && ( + + {success} + + )} + {error && ( + + {error} + + )} + +
+
+ ) +} + +export default withTranslation()(Section) diff --git a/enatega-multivendor-admin/src/components/Section/styles.js b/enatega-multivendor-admin/src/components/Section/styles.js new file mode 100644 index 0000000..8571b10 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Section/styles.js @@ -0,0 +1,56 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + }, + section: { + textAlign: 'left', + height: '300px', + overflowY: 'scroll' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Sidebar/AdminSidebar.jsx b/enatega-multivendor-admin/src/components/Sidebar/AdminSidebar.jsx new file mode 100644 index 0000000..52e9eaf --- /dev/null +++ b/enatega-multivendor-admin/src/components/Sidebar/AdminSidebar.jsx @@ -0,0 +1,159 @@ +import * as React from 'react' +import { + AppBar, + Box, + Drawer, + IconButton, + Toolbar, + Typography, + Link, + SvgIcon, + useTheme +} from '@mui/material' +import MenuIcon from '@mui/icons-material/Menu' +import routes from '../../routes' +import useStyles from './styles' +import { ReactComponent as Logo } from '../../assets/svg/logo.svg' +import { useLocation } from 'react-router-dom' +import { useTranslation, withTranslation } from 'react-i18next' + +const drawerWidth = 240 +function AdminSidebar(props) { + const theme = useTheme() + const { t } = useTranslation() + const location = useLocation() + const classes = useStyles() + const { window } = props + console.log('Admin Sidebarprops are here: ', props) + const [mobileOpen, setMobileOpen] = React.useState(false) + + const handleDrawerToggle = () => { + setMobileOpen(!mobileOpen) + } + + const createLinks = ( + // + + + + + ENATEGA + + + + {routes.map((prop, key) => { + console.log(key) + return prop.appearInSidebar && prop.admin ? ( + <> + {key === 1 ? ( + + {t('GENERAL')} + + ) : null} + {key === 6 ? ( + + {t('MANAGEMENT')} + + ) : null} + + + + {t(prop.name)} + + + + ) : null + })} + + + // + ) + + const container = + window !== undefined ? () => window().document.body : undefined + + return ( + <> + {/* */} + + + + + + + + + {/* The implementation can be swapped with js to avoid SEO duplication of links. */} + + {createLinks} + + + {createLinks} + + + + ) +} + +export default withTranslation()(AdminSidebar) diff --git a/enatega-multivendor-admin/src/components/Sidebar/Sidebar.jsx b/enatega-multivendor-admin/src/components/Sidebar/Sidebar.jsx new file mode 100644 index 0000000..b440753 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Sidebar/Sidebar.jsx @@ -0,0 +1,206 @@ +/*eslint-disable*/ +import React from 'react' +import { withTranslation } from 'react-i18next' +// nodejs library to set properties for components + +import { + AppBar, + Box, + Drawer, + IconButton, + Toolbar, + Typography, + Link, + SvgIcon, + useTheme +} from '@mui/material' +import MenuIcon from '@mui/icons-material/Menu' +import routes from '../../routes' +import useStyles from './styles' +import { ReactComponent as Logo } from '../../assets/svg/logo.svg' +import { useLocation } from 'react-router-dom' + +const drawerWidth = 240 +function Sidebar(props) { + const theme = useTheme() + const location = useLocation() + const classes = useStyles() + const restaurantId = localStorage.getItem('restaurantId') + const restaurantImage = localStorage.getItem('restaurantImage') + const restaurantName = localStorage.getItem('restaurantName') + const [mobileOpen, setMobileOpen] = React.useState(false) + const { window, t } = props + console.log('SideBar props are here: ', props) + const handleDrawerToggle = () => { + setMobileOpen(!mobileOpen) + } + const container = + window !== undefined ? () => window().document.body : undefined + + const createLinks = ( + + + + + ENATEGA + + + {restaurantName && restaurantImage ? ( + + + + {restaurantName} + + + ) : null} + + + {routes.map((prop, key) => { + console.log(key, prop.name) + if ( + JSON.parse(localStorage.getItem('user-enatega')).userType === + 'ADMIN' + ) { + return prop.appearInSidebar && !prop.admin ? ( + <> + {key === 14 ? ( + + {t('RESTAURANT')} + + ) : null} + {key === 19 ? ( + + {t('MANAGEMENT')} + + ) : null} + + + + {t(prop.name)} + + + + ) : null + } else { + return prop.appearInSidebar && + !prop.admin && + prop.name != t('BackToAdmin') ? ( + <> + + + + {prop.name} + + + + ) : null + } + })} + + + ) + + return ( + <> + + + + + + + + + {/* The implementation can be swapped with js to avoid SEO duplication of links. */} + + {createLinks} + + + {createLinks} + + + + ) +} + +export default withTranslation()(Sidebar) diff --git a/enatega-multivendor-admin/src/components/Sidebar/styles.js b/enatega-multivendor-admin/src/components/Sidebar/styles.js new file mode 100644 index 0000000..4aeb1c7 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Sidebar/styles.js @@ -0,0 +1,85 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + rowDisplay: { display: 'flex', flexDirection: 'row' }, + logo: { + marginLeft: -10 + }, + sidebarContainer: { + backgroundColor: theme.palette.primary.main2, + overflowY: 'auto', + '&::-webkit-scrollbar': { + width: 0 + } + }, + sidebarBox: { + backgroundColor: theme.palette.common.white, + padding: '5px 15px 5px 5px', + borderRadius: '0px 35px 35px 0px', + overflowY: 'auto', + '&::-webkit-scrollbar': { + width: 0 + }, + height: '100%' + }, + sidebarList: { padding: '5px 5px 20px 10px' }, + sidebarLink: { + height: '18px', + backgroundColor: theme.palette.background.primary, + marginTop: 8, + padding: '7px 10px', + borderRadius: 10, + + '&:hover': { + backgroundColor: theme.palette.primary.main2, + boxShadow: `0px 0px 5px ${theme.palette.warning.darkest}` + } + }, + active: { + backgroundColor: theme.palette.primary.main2, + boxShadow: `0px 0px 5px ${theme.palette.warning.darkest}` + }, + blackText: { + color: 'black', + fontWeight: 400 + }, + whiteText: { + color: 'white', + fontWeight: 400 + }, + linkText: { + fontSize: 13, + fontWeight: 400, + paddingLeft: 12, + marginTop: -2 + }, + headingText: { + marginTop: 10, + marginBottom: 10, + fontSize: 15, + color: theme.palette.common.black + }, + logoText: { + fontWeight: 'bold', + paddingLeft: 10, + fontSize: 21 + }, + restContainer: { + marginLeft: 10, + padding: 10, + backgroundColor: theme.palette.background.primary, + borderRadius: 10, + marginRight: 7 + }, + restText: { + fontSize: 16, + fontWeight: 'bold', + color: theme.palette.common.black + }, + restImage: { + borderRadius: 5, + marginRight: 10 + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/TableHeader.jsx b/enatega-multivendor-admin/src/components/TableHeader.jsx new file mode 100644 index 0000000..5fcc459 --- /dev/null +++ b/enatega-multivendor-admin/src/components/TableHeader.jsx @@ -0,0 +1,6 @@ +import React from 'react' +const TableHeader = ({ title }) => ( +

{title}

+) + +export default TableHeader diff --git a/enatega-multivendor-admin/src/components/TableHeader/SearchBar.jsx b/enatega-multivendor-admin/src/components/TableHeader/SearchBar.jsx new file mode 100644 index 0000000..f0c88d5 --- /dev/null +++ b/enatega-multivendor-admin/src/components/TableHeader/SearchBar.jsx @@ -0,0 +1,51 @@ +import React from 'react' +import { Input, InputAdornment, IconButton, Box, useTheme } from '@mui/material' +import SearchIcon from '@mui/icons-material/Search' +import RefreshIcon from '@mui/icons-material/Refresh' +import useStyles from './styles' +import { withTranslation, useTranslation } from 'react-i18next' + +function SearchBar(props) { + const theme = useTheme() + const { t } = useTranslation() + const classes = useStyles() + + return ( + + + + + + + + } + disableUnderline + id="basic-input" + /> + + ) +} + +export default withTranslation()(SearchBar) diff --git a/enatega-multivendor-admin/src/components/TableHeader/styles.js b/enatega-multivendor-admin/src/components/TableHeader/styles.js new file mode 100644 index 0000000..ebc8eb3 --- /dev/null +++ b/enatega-multivendor-admin/src/components/TableHeader/styles.js @@ -0,0 +1,8 @@ +import { makeStyles } from '@mui/styles' +const useStyles = makeStyles(theme => ({ + container: { + marginTop: -40 + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Tipping/Tipping.jsx b/enatega-multivendor-admin/src/components/Tipping/Tipping.jsx new file mode 100644 index 0000000..57eb801 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Tipping/Tipping.jsx @@ -0,0 +1,239 @@ +import React, { useRef, useState } from 'react' +import { useMutation, useQuery, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { Box, Typography, Input, Button, Alert, Grid } from '@mui/material' +import { editTipping, getTipping, createTipping } from '../../apollo' + +const GET_TIPPING = gql` + ${getTipping} +` +const EDIT_TIPPING = gql` + ${editTipping} +` + +const CREATE_TIPPING = gql` + ${createTipping} +` + +function Tipping(props) { + const { t } = props + const formRef = useRef() + // const mutation = props.coupon ? EDIT_COUPON : CREATE_COUPON + const [tip1Error, setTip1Error] = useState(null) + const [tip2Error, setTip2Error] = useState(null) + const [tip3Error, setTip3Error] = useState(null) + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const onCompleted = data => { + const message = t('TippingUpdated') + successSetter(message) + setTip1Error(null) + setTip2Error(null) + setTip3Error(null) + mainErrorSetter('') + clearFields() + setTimeout(hideAlert, 3000) + } + const onError = error => { + let message = '' + try { + message = error.graphQLErrors[0].message + } catch (err) { + message = t('ActionFailedTryAgain') + } + successSetter('') + mainErrorSetter(message) + setTimeout(hideAlert, 3000) + } + const onSubmitValidaiton = () => { + const form = formRef.current + const tip1 = form.tip1.value + const tip2 = form.tip2.value + const tip3 = form.tip3.value + + const tip1Errors = !validateFunc({ tip: tip1 }, 'tip') + const tip2Errors = !validateFunc({ tip: tip2 }, 'tip') + const tip3Errors = !validateFunc({ tip: tip3 }, 'tip') + + setTip1Error(tip1Errors) + setTip2Error(tip2Errors) + setTip3Error(tip3Errors) + + if (!(tip1Errors && tip2Errors && tip3Errors)) { + mainErrorSetter(t('FieldsRequired')) + } + return tip1Errors && tip2Errors && tip3Errors + // setTimeout(hideAlert, 3000) + } + const { data } = useQuery(GET_TIPPING, onError, onCompleted) + const mutation = data && data.tips._id ? EDIT_TIPPING : CREATE_TIPPING + + const [mutate, { loading }] = useMutation(mutation, { onError, onCompleted }) + + const clearFields = () => { + formRef.current.reset() + } + + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.coupon ? t('EditTipping') : t('AddTipping')} + + + + + +
+ + + + + {t('Tip1')} + + + + + + + + {t('Tip2')} + + + + + + + + + + + {t('Tip3')} + + + + + + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ ) +} + +export default withTranslation()(Tipping) diff --git a/enatega-multivendor-admin/src/components/Tipping/styles.js b/enatega-multivendor-admin/src/components/Tipping/styles.js new file mode 100644 index 0000000..c1fbd42 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Tipping/styles.js @@ -0,0 +1,51 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/Vendor/Vendor.jsx b/enatega-multivendor-admin/src/components/Vendor/Vendor.jsx new file mode 100644 index 0000000..40ad660 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Vendor/Vendor.jsx @@ -0,0 +1,211 @@ +import React, { useRef, useState } from 'react' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +import { createVendor, editVendor, getVendors } from '../../apollo' +import { Input, Button, Alert, Box, Typography, Checkbox } from '@mui/material' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' + +const CREATE_VENDOR = gql` + ${createVendor} +` +const EDIT_VENDOR = gql` + ${editVendor} +` +const GET_VENDORS = gql` + ${getVendors} +` + +function Vendor(props) { + const formRef = useRef() + const [showPassword, setShowPassword] = useState(false) + const mutation = props.vendor ? EDIT_VENDOR : CREATE_VENDOR + const email = props.vendor ? props.vendor.email : '' + const [error, errorSetter] = useState('') + const [success, successSetter] = useState('') + const [emailError, emailErrorSetter] = useState(null) + const [passError, passErrorSetter] = useState(null) + const { t } = props + console.log('vendor props: ', props) + const onCompleted = data => { + if (!props.vendor) clearFields() + const message = props.vendor + ? t('VendorUpdatedSuccessfully') + : t('VendorAddedSuccessfully') + errorSetter('') + successSetter(message) + setTimeout(hideAlert, 3000) + } + + const onError = ({ graphQLErrors, networkError }) => { + successSetter('') + if (graphQLErrors) errorSetter(graphQLErrors[0].message) + else if (networkError) errorSetter(networkError.result.errors[0].message) + else errorSetter('Something went wrong!') + setTimeout(hideAlert, 3000) + } + const [mutate, { loading: mutateLoading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_VENDORS }], + onError, + onCompleted + }) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + + const onSubmitValidaiton = () => { + const emailError = !validateFunc( + { email: formRef.current['input-email'].value }, + 'email' + ) + const passwordError = props.vendor + ? true + : !validateFunc( + { password: formRef.current['input-password'].value }, + 'password' + ) + + emailErrorSetter(emailError) + passErrorSetter(passwordError) + return emailError && passwordError + } + const clearFields = () => { + formRef.current.reset() + emailErrorSetter('') + passErrorSetter('') + } + + const hideAlert = () => { + errorSetter('') + successSetter('') + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + {props.vendor ? t('EditVendor') : t('AddVendor')} + + + {/* */} + +
+ {/* */} + {t('Email')} + + onBlur(emailErrorSetter, 'email', event.target.value) + } + /> + {/* */} + {!props.vendor ? ( + <> + + {t('Password')} + + { + onBlur(passErrorSetter, 'password', event.target.value) + }} + endAdornment={ + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + ) : null} + +
+ + {success && ( + + {success} + + )} + {error && ( + + {error} + + )} + +
+
+ ) +} +export default withTranslation()(Vendor) diff --git a/enatega-multivendor-admin/src/components/Vendor/styles.js b/enatega-multivendor-admin/src/components/Vendor/styles.js new file mode 100644 index 0000000..9f1a26a --- /dev/null +++ b/enatega-multivendor-admin/src/components/Vendor/styles.js @@ -0,0 +1,47 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/WithdrawRequest/WithdrawRequest.jsx b/enatega-multivendor-admin/src/components/WithdrawRequest/WithdrawRequest.jsx new file mode 100644 index 0000000..9361d6e --- /dev/null +++ b/enatega-multivendor-admin/src/components/WithdrawRequest/WithdrawRequest.jsx @@ -0,0 +1,326 @@ +import React, { useState, useRef } from 'react' +import { useMutation, useQuery, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' +// core components +import { + createRider, + editRider, + getRiders, + getZones, + getAvailableRiders +} from '../../apollo' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { + Box, + Switch, + Typography, + Input, + Alert, + Select, + MenuItem, + Button +} from '@mui/material' + +const CREATE_RIDER = gql` + ${createRider} +` +const EDIT_RIDER = gql` + ${editRider} +` +const GET_RIDERS = gql` + ${getRiders} +` +const GET_ZONES = gql` + ${getZones} +` +const GET_AVAILABLE_RIDERS = gql` + ${getAvailableRiders} +` + +function WithdrawRequest(props) { + const formRef = useRef() + const mutation = props.rider ? EDIT_RIDER : CREATE_RIDER + const name = props.rider ? props.rider.name : '' + const userName = props.rider ? props.rider.username : '' + const password = props.rider ? props.rider.password : '' + const phone = props.rider ? props.rider.phone : '' + const zone = props.rider ? props.rider.zone._id : '' + const [mainError, mainErrorSetter] = useState('') + const [success, successSetter] = useState('') + const [nameError, nameErrorSetter] = useState(null) + const [usernameError, usernameErrorSetter] = useState(null) + const [passwordError, passwordErrorSetter] = useState(null) + const [phoneError, phoneErrorSetter] = useState(null) + const [zoneError, zoneErrorSetter] = useState(null) + const [riderAvailable, setRiderAvailable] = useState( + props.rider ? props.rider.available : true + ) + const [riderZone, setRiderZone] = useState( + props.rider ? props.rider.zone._id : '' + ) + + const onCompleted = data => { + if (!props.rider) clearFields() + const message = props.rider + ? t('RiderUpdatedSuccessfully') + : t('RiderAddedSuccessfully') + mainErrorSetter('') + successSetter(message) + setTimeout(hideAlert, 5000) + } + const onError = ({ graphQLErrors, networkError }) => { + if (graphQLErrors) { + mainErrorSetter(graphQLErrors[0].message) + } + if (networkError) { + mainErrorSetter(networkError.result.errors[0].message) + } + successSetter('') + setTimeout(hideAlert, 5000) + } + const [mutate, { loading }] = useMutation(mutation, { + refetchQueries: [{ query: GET_RIDERS }, { query: GET_AVAILABLE_RIDERS }], + onError, + onCompleted + }) + const { data } = useQuery(GET_ZONES) + + const onBlur = (setter, field, state) => { + setter(!validateFunc({ [field]: state }, field)) + } + const onSubmitValidaiton = () => { + const nameError = !validateFunc( + { name: formRef.current['input-name'].value }, + 'name' + ) + const usernameError = !validateFunc( + { username: formRef.current['input-userName'].value }, + 'username' + ) + const passwordError = !validateFunc( + { password: formRef.current['input-password'].value }, + 'password' + ) + const phoneError = !validateFunc( + { phone: formRef.current['input-phone'].value }, + 'phone' + ) + const zoneError = !validateFunc( + { zone: formRef.current['input-zone'].value }, + 'zone' + ) + + nameErrorSetter(nameError) + usernameErrorSetter(usernameError) + phoneErrorSetter(phoneError) + passwordErrorSetter(passwordError) + zoneErrorSetter(zoneError) + return ( + nameError && usernameError && phoneError && passwordError && zoneError + ) + } + const clearFields = () => { + formRef.current.reset() + nameErrorSetter(null) + usernameErrorSetter(null) + passwordErrorSetter(null) + phoneErrorSetter(null) + zoneErrorSetter(null) + } + + const hideAlert = () => { + mainErrorSetter('') + successSetter('') + } + const { t } = props + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + + + + + {props.rider ? t('EditRider') : t('AddRider')} + + + + + setRiderAvailable(e.target.checked)} + id="input-available" + name="input-available" + style={{ color: 'black' }} + /> + + + + +
+ + { + onBlur(nameErrorSetter, 'name', event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + nameError === false + ? globalClasses.inputError + : nameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + onBlur(usernameErrorSetter, 'username', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + usernameError === false + ? globalClasses.inputError + : usernameError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + onBlur(phoneErrorSetter, 'phone', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + phoneError === false + ? globalClasses.inputError + : phoneError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + onBlur(passwordErrorSetter, 'password', event.target.value) + } + disableUnderline + className={[ + globalClasses.input, + passwordError === false + ? globalClasses.inputError + : passwordError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + + +
+ + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+ ) +} +export default withTranslation()(WithdrawRequest) diff --git a/enatega-multivendor-admin/src/components/Zone/Zone.jsx b/enatega-multivendor-admin/src/components/Zone/Zone.jsx new file mode 100644 index 0000000..dacdbbd --- /dev/null +++ b/enatega-multivendor-admin/src/components/Zone/Zone.jsx @@ -0,0 +1,292 @@ +import React, { useState, useRef, useCallback } from 'react' +import { useMutation, gql } from '@apollo/client' +import { validateFunc } from '../../constraints/constraints' +import { withTranslation } from 'react-i18next' + +import { GoogleMap, Polygon } from '@react-google-maps/api' +import useStyles from './styles' +import useGlobalStyles from '../../utils/globalStyles' +import { Box, Typography, Input, Button, Alert, Grid } from '@mui/material' + +// core components +import { createZone, editZone, getZones } from '../../apollo' +import { transformPath, transformPolygon } from '../../utils/coordinates' +import ConfigurableValues from '../../config/constants' + +const CREATE_ZONE = gql` + ${createZone} +` +const EDIT_ZONE = gql` + ${editZone} +` +const GET_ZONE = gql` + ${getZones} +` + +const Zone = props => { + const [path, setPath] = useState( + props.zone ? transformPolygon(props.zone.location.coordinates[0]) : [] + ) + const {PAID_VERSION}=ConfigurableValues() + const [mutation] = useState(props.zone ? EDIT_ZONE : CREATE_ZONE) + const [title, setTitle] = useState(props.zone ? props.zone.title : '') + const [description, setDescription] = useState( + props.zone ? props.zone.description : '' + ) + const listenersRef = useRef([]) + const [errors, setErrors] = useState('') + const [success, setSuccess] = useState('') + const [titleError, setTitleError] = useState(null) + const [descriptionError, setDescriptionError] = useState(null) + + const onCompleted = data => { + if (!props.zone) clearFields() + const message = props.zone + ? t('ZoneUpdatedSuccessfully') + : t('ZoneAddedSuccessfully') + setErrors('') + setSuccess(message) + setTimeout(hideAlert, 3000) + } + + const onError = error => { + setErrors(error.message) + setSuccess('') + setTimeout(hideAlert, 3000) + } + + const [mutate /*{ loading }*/] = useMutation(mutation, { + refetchQueries: [{ query: GET_ZONE }], + onError, + onCompleted + }) + + const [center] = useState( + props.zone + ? setCenter(props.zone.location.coordinates[0]) + : { lat: 33.684422, lng: 73.047882 } + ) + + const polygonRef = useRef() + + const onClick = e => { + setPath([...path, { lat: e.latLng.lat(), lng: e.latLng.lng() }]) + } + + // Call setPath with new edited path + const onEdit = useCallback(() => { + if (polygonRef.current) { + const nextPath = polygonRef.current + .getPath() + .getArray() + .map(latLng => { + return { lat: latLng.lat(), lng: latLng.lng() } + }) + setPath(nextPath) + } + }, [setPath]) + + const onLoadPolygon = useCallback( + polygon => { + polygonRef.current = polygon + const path = polygon.getPath() + listenersRef.current.push( + path.addListener('set_at', onEdit), + path.addListener('insert_at', onEdit), + path.addListener('remove_at', onEdit) + ) + }, + [onEdit] + ) + + const onUnmount = useCallback(() => { + listenersRef.current.forEach(lis => lis.remove()) + polygonRef.current = null + }, []) + + function setCenter(coordinates) { + return { lat: coordinates[0][1], lng: coordinates[0][0] } + } + + const onSubmitValidation = () => { + setErrors('') + const titleErrors = !validateFunc({ title: title }, 'title') + const descriptionErrors = !validateFunc( + { description: description }, + 'description' + ) + let zoneErrors = true + if (path.length < 3) { + zoneErrors = false + setErrors(t('SetZoneOnMap')) + return false + } + + setTitleError(titleErrors) + setDescriptionError(descriptionErrors) + return titleErrors && descriptionErrors && zoneErrors + } + + const clearFields = () => { + setTitle('') + setDescription('') + setTitleError(null) + setDescriptionError(null) + setPath([]) + } + + const hideAlert = () => { + setErrors('') + setSuccess('') + } + + const { t } = props + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + {props.zone ? t('EditZone') : t('AddZone')} + + + + + +
+ + + + + {t('Title')} + + { + setTitle(event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + titleError === false + ? globalClasses.inputError + : titleError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('Description')} + + { + setDescription(event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + descriptionError === false + ? globalClasses.inputError + : descriptionError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + + + + + + +
+ + {success && ( + + {success} + + )} + {errors && ( + + {errors} + + )} + +
+
+ ) +} + +export default withTranslation()(Zone) diff --git a/enatega-multivendor-admin/src/components/Zone/styles.js b/enatega-multivendor-admin/src/components/Zone/styles.js new file mode 100644 index 0000000..c1fbd42 --- /dev/null +++ b/enatega-multivendor-admin/src/components/Zone/styles.js @@ -0,0 +1,51 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/components/styles.js b/enatega-multivendor-admin/src/components/styles.js new file mode 100644 index 0000000..2335e72 --- /dev/null +++ b/enatega-multivendor-admin/src/components/styles.js @@ -0,0 +1,58 @@ +import { makeStyles } from '@mui/styles' + +const useStyles = makeStyles(theme => ({ + flexRow: { + display: 'flex', + flexDirection: 'row' + }, + container: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center', + paddingBottom: 5 + }, + heading: { + backgroundColor: theme.palette.primary.main2, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + heading2: { + backgroundColor: theme.palette.primary.main3, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + headingBlack: { + backgroundColor: theme.palette.common.black, + width: '50%', + padding: 10, + borderRadius: '20px 20px 20px 0', + textAlign: 'center' + }, + text: { + color: theme.palette.common.black, + fontWeight: 'bold' + }, + textWhite: { + color: theme.palette.common.white, + fontWeight: 'bold' + }, + form: { + margin: 25, + alignItems: 'center' + }, + labelText: { + textAlign: 'left', + marginLeft: '4%', + fontSize: '15px', + fontWeight: '500', + marginTop: '10px' + } +})) + +export default useStyles diff --git a/enatega-multivendor-admin/src/config/constants.js b/enatega-multivendor-admin/src/config/constants.js new file mode 100644 index 0000000..ff38daa --- /dev/null +++ b/enatega-multivendor-admin/src/config/constants.js @@ -0,0 +1,45 @@ +import { useContext } from 'react' +import ConfigurationContext from '../context/Configuration' + +const ConfigurableValues = () => { + const configuration = useContext(ConfigurationContext) + console.log('configuration', configuration) + const SERVER_URL = 'https://enatega-multivendor.up.railway.app' + const WS_SERVER_URL = 'wss://enatega-multivendor.up.railway.app' + // const SERVER_URL = 'http://10.97.17.9:8001' + // const WS_SERVER_URL = 'wss://10.97.17.9:8001' + const GOOGLE_MAPS_KEY = configuration.googleApiKey + const FIREBASE_KEY = configuration.firebaseKey + const APP_ID = configuration.appId + const AUTH_DOMAIN = configuration.authDomain + const STORAGE_BUCKET = configuration.storageBucket + const MSG_SENDER_ID = configuration.msgSenderId + const MEASUREMENT_ID = configuration.measurementId + const PROJECT_ID = configuration.projectId + const SENTRY_DSN = configuration.dashboardSentryUrl + const CLOUDINARY_UPLOAD_URL = configuration.cloudinaryUploadUrl + const CLOUDINARY_FOOD = configuration.cloudinaryApiKey + const VAPID_KEY = + 'BOpVOtmawD0hzOR0F5NQTz_7oTlNVwgKX_EgElDnFuILsaE_jWYPIExAMIIGS-nYmy1lhf2QWFHQnDEFWNG_Z5w' + const PAID_VERSION = configuration.isPaidVersion + + return { + GOOGLE_MAPS_KEY, + FIREBASE_KEY, + APP_ID, + AUTH_DOMAIN, + STORAGE_BUCKET, + MSG_SENDER_ID, + MEASUREMENT_ID, + PROJECT_ID, + SERVER_URL, + WS_SERVER_URL, + SENTRY_DSN, + CLOUDINARY_UPLOAD_URL, + CLOUDINARY_FOOD, + VAPID_KEY, + PAID_VERSION + } +} + +export default ConfigurableValues diff --git a/enatega-multivendor-admin/src/config/currencies.js b/enatega-multivendor-admin/src/config/currencies.js new file mode 100644 index 0000000..4dfb2c3 --- /dev/null +++ b/enatega-multivendor-admin/src/config/currencies.js @@ -0,0 +1,165 @@ +export const stripeCurrencies = [ + { currency: 'USD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AED', currencySymbol: 'د.إ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AFN', currencySymbol: '؋', multiplier: 100, type: 'STRIPE' }, + { currency: 'ALL', currencySymbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'AMD', currencySymbol: '֏', multiplier: 100, type: 'STRIPE' }, + { currency: 'ANG', currencySymbol: 'ƒ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AOA', currencySymbol: 'Kz', multiplier: 100, type: 'STRIPE' }, + { currency: 'ARS', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AUD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AWG', currencySymbol: 'ƒ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AZN', currencySymbol: '₼', multiplier: 100, type: 'STRIPE' }, + { currency: 'BAM', currencySymbol: 'BAM', multiplier: 100, type: 'STRIPE' }, + { currency: 'BBD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BDT', currencySymbol: '৳', multiplier: 100, type: 'STRIPE' }, + { currency: 'BGN', currencySymbol: 'лв', multiplier: 100, type: 'STRIPE' }, + { currency: 'BIF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'BMD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BND', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BOB', currencySymbol: 'Bs.', multiplier: 100, type: 'STRIPE' }, + { currency: 'BRL', currencySymbol: 'R$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BSD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BWP', currencySymbol: 'P', multiplier: 100, type: 'STRIPE' }, + { currency: 'BZD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CAD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CDF', currencySymbol: 'Fr', multiplier: 100, type: 'STRIPE' }, + { currency: 'CHF', currencySymbol: 'Fr', multiplier: 100, type: 'STRIPE' }, + { currency: 'CLP', currencySymbol: '$', multiplier: 1, type: 'STRIPE' }, + { currency: 'CNY', currencySymbol: '¥', multiplier: 100, type: 'STRIPE' }, + { currency: 'COP', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CRC', currencySymbol: '₡', multiplier: 100, type: 'STRIPE' }, + { currency: 'CVE', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CZK', currencySymbol: 'Kč', multiplier: 100, type: 'STRIPE' }, + { currency: 'DJF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'DKK', currencySymbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'DOP', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'DZD', currencySymbol: 'د.ج', multiplier: 100, type: 'STRIPE' }, + { currency: 'EGP', currencySymbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'ETB', currencySymbol: 'Br', multiplier: 100, type: 'STRIPE' }, + { currency: 'EUR', currencySymbol: '€', multiplier: 100, type: 'STRIPE' }, + { currency: 'FJD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'FKP', currencySymbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GBP', currencySymbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GEL', currencySymbol: '₾', multiplier: 100, type: 'STRIPE' }, + { currency: 'GIP', currencySymbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GMD', currencySymbol: 'D', multiplier: 100, type: 'STRIPE' }, + { currency: 'GNF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'GTQ', currencySymbol: 'Q', multiplier: 100, type: 'STRIPE' }, + { currency: 'GYD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'HKD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'HNL', currencySymbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'HRK', currencySymbol: 'kn', multiplier: 100, type: 'STRIPE' }, + { currency: 'HTG', currencySymbol: 'G', multiplier: 100, type: 'STRIPE' }, + { currency: 'HUF', currencySymbol: 'Ft', multiplier: 100, type: 'STRIPE' }, + { currency: 'IDR', currencySymbol: 'Rp', multiplier: 100, type: 'STRIPE' }, + { currency: 'ILS', currencySymbol: 'ع.د', multiplier: 100, type: 'STRIPE' }, + { currency: 'INR', currencySymbol: '₹', multiplier: 100, type: 'STRIPE' }, + { currency: 'ISK', currencySymbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'JMD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'JPY', currencySymbol: '¥', multiplier: 1, type: 'STRIPE' }, + { currency: 'KES', currencySymbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'KGS', currencySymbol: 'с', multiplier: 100, type: 'STRIPE' }, + { currency: 'KHR', currencySymbol: '៛', multiplier: 100, type: 'STRIPE' }, + { currency: 'KMF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'KRW', currencySymbol: '₩', multiplier: 1, type: 'STRIPE' }, + { currency: 'KYD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'KZT', currencySymbol: '₸', multiplier: 100, type: 'STRIPE' }, + { currency: 'LAK', currencySymbol: '₭', multiplier: 100, type: 'STRIPE' }, + { currency: 'LBP', currencySymbol: 'ل.ل', multiplier: 100, type: 'STRIPE' }, + { currency: 'LKR', currencySymbol: 'Rs', multiplier: 100, type: 'STRIPE' }, + { currency: 'LRD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'LSL', currencySymbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'MAD', currencySymbol: 'د.م.', multiplier: 100, type: 'STRIPE' }, + { currency: 'MDL', currencySymbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'MGA', currencySymbol: 'Ar', multiplier: 1, type: 'STRIPE' }, + { currency: 'MKD', currencySymbol: 'ден', multiplier: 100, type: 'STRIPE' }, + { currency: 'MMK', currencySymbol: 'Ks', multiplier: 100, type: 'STRIPE' }, + { currency: 'MNT', currencySymbol: '₮', multiplier: 100, type: 'STRIPE' }, + { currency: 'MOP', currencySymbol: 'P', multiplier: 100, type: 'STRIPE' }, + { currency: 'MRO', currencySymbol: 'UM', multiplier: 100, type: 'STRIPE' }, + { currency: 'MUR', currencySymbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'MVR', currencySymbol: '.ރ', multiplier: 100, type: 'STRIPE' }, + { currency: 'MWK', currencySymbol: 'MK', multiplier: 100, type: 'STRIPE' }, + { currency: 'MXN', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'MYR', currencySymbol: 'RM', multiplier: 100, type: 'STRIPE' }, + { currency: 'MZN', currencySymbol: 'MT', multiplier: 100, type: 'STRIPE' }, + { currency: 'NAD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'NGN', currencySymbol: '₦', multiplier: 100, type: 'STRIPE' }, + { currency: 'NIO', currencySymbol: 'C$', multiplier: 100, type: 'STRIPE' }, + { currency: 'NOK', currencySymbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'NPR', currencySymbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'NZD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'PAB', currencySymbol: 'B/.', multiplier: 100, type: 'STRIPE' }, + { currency: 'PEN', currencySymbol: 'S/.', multiplier: 100, type: 'STRIPE' }, + { currency: 'PGK', currencySymbol: 'K', multiplier: 100, type: 'STRIPE' }, + { currency: 'PHP', currencySymbol: '₱', multiplier: 100, type: 'STRIPE' }, + { currency: 'PKR', currencySymbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'PLN', currencySymbol: 'zł', multiplier: 100, type: 'STRIPE' }, + { currency: 'PYG', currencySymbol: '₲', multiplier: 1, type: 'STRIPE' }, + { currency: 'QAR', currencySymbol: 'ر.ق', multiplier: 100, type: 'STRIPE' }, + { currency: 'RON', currencySymbol: 'lei', multiplier: 100, type: 'STRIPE' }, + { currency: 'RSD', currencySymbol: 'дин', multiplier: 100, type: 'STRIPE' }, + { currency: 'RUB', currencySymbol: '₽', multiplier: 100, type: 'STRIPE' }, + { currency: 'RWF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'SAR', currencySymbol: 'ر.س', multiplier: 100, type: 'STRIPE' }, + { currency: 'SBD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'SCR', currencySymbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'SEK', currencySymbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'SGD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'SHP', currencySymbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'SLL', currencySymbol: 'Le', multiplier: 100, type: 'STRIPE' }, + { currency: 'SOS', currencySymbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'SRD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'STD', currencySymbol: 'Db', multiplier: 100, type: 'STRIPE' }, + { currency: 'SZL', currencySymbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'THB', currencySymbol: '฿', multiplier: 100, type: 'STRIPE' }, + { currency: 'TJS', currencySymbol: 'ЅМ', multiplier: 100, type: 'STRIPE' }, + { currency: 'TOP', currencySymbol: 'T$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TRY', currencySymbol: '₺', multiplier: 100, type: 'STRIPE' }, + { currency: 'TTD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TWD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TZS', currencySymbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'UAH', currencySymbol: '₴', multiplier: 100, type: 'STRIPE' }, + { currency: 'UGX', currencySymbol: 'Sh', multiplier: 1, type: 'STRIPE' }, + { currency: 'UYU', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'UZS', currencySymbol: 'сўм', multiplier: 100, type: 'STRIPE' }, + { currency: 'VND', currencySymbol: '₫', multiplier: 1, type: 'STRIPE' }, + { currency: 'VUV', currencySymbol: 'Vt', multiplier: 1, type: 'STRIPE' }, + { currency: 'WST', currencySymbol: 'T', multiplier: 100, type: 'STRIPE' }, + { currency: 'XAF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'XCD', currencySymbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'XOF', currencySymbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'XPF', currencySymbol: '₣', multiplier: 1, type: 'STRIPE' }, + { currency: 'YER', currencySymbol: '﷼', multiplier: 100, type: 'STRIPE' }, + { currency: 'ZAR', currencySymbol: 'Rs', multiplier: 100, type: 'STRIPE' }, + { currency: 'ZMW', currencySymbol: 'ZK', multiplier: 100, type: 'STRIPE' } +] + +export const paypalCurrencies = [ + { currency: 'AUD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'BRL', currencySymbol: 'R$', type: 'PAYPAL' }, + { currency: 'CAD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'CZK', currencySymbol: 'Kč', type: 'PAYPAL' }, + { currency: 'DKK', currencySymbol: 'kr', type: 'PAYPAL' }, + { currency: 'EUR', currencySymbol: '€', type: 'PAYPAL' }, + { currency: 'HKD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'HUF', currencySymbol: 'Ft', type: 'PAYPAL' }, + { currency: 'INR', currencySymbol: '₹', type: 'PAYPAL' }, + { currency: 'ILS', currencySymbol: 'ع.د', type: 'PAYPAL' }, + { currency: 'JPY', currencySymbol: '¥', type: 'PAYPAL' }, + { currency: 'MYR', currencySymbol: 'RM', type: 'PAYPAL' }, + { currency: 'MXN', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'TWD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'NZD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'NOK', currencySymbol: 'kr', type: 'PAYPAL' }, + { currency: 'PHP', currencySymbol: '₱', type: 'PAYPAL' }, + { currency: 'PLN', currencySymbol: 'zł', type: 'PAYPAL' }, + { currency: 'GBP', currencySymbol: '£', type: 'PAYPAL' }, + { currency: 'RUB', currencySymbol: '₽', type: 'PAYPAL' }, + { currency: 'SGD', currencySymbol: '$', type: 'PAYPAL' }, + { currency: 'SEK', currencySymbol: 'kr', type: 'PAYPAL' }, + { currency: 'CHF', currencySymbol: 'Fr', type: 'PAYPAL' }, + { currency: 'THB', currencySymbol: '฿', type: 'PAYPAL' }, + { currency: 'USD', currencySymbol: '$', type: 'PAYPAL' } +] diff --git a/enatega-multivendor-admin/src/constraints/constraints.js b/enatega-multivendor-admin/src/constraints/constraints.js new file mode 100644 index 0000000..8249a03 --- /dev/null +++ b/enatega-multivendor-admin/src/constraints/constraints.js @@ -0,0 +1,269 @@ +import { validate } from 'validate.js' + +const constraints = { + confirmPassword: { + presence: { + allowEmpty: false + }, + equality: { + attribute: 'password', + message: '^The passwords does not match' + } + }, + prefix: { + presence: { + allowEmpty: false + } + }, + email: { + email: true + }, + password: { + presence: { + allowEmpty: false + } + }, + phone: { + presence: { + allowEmpty: false + } + }, + address: { + presence: { + allowEmpty: false + } + }, + lat: { + presence: { + allowEmpty: false + } + }, + deliveryCharges: { + presence: { + allowEmpty: false + } + }, + deliveryRate: { + presence: { + allowEmpty: false + } + }, + deliveryTime: { + presence: { + allowEmpty: false + } + }, + minimumOrder: { + presence: { + allowEmpty: false + } + }, + orderPrefix: { + presence: true + }, + long: { + presence: { + allowEmpty: false + } + }, + name: { + presence: { + allowEmpty: false + } + }, + username: { + presence: { + allowEmpty: false, + message: '^UsernameCannotBeBlank' + }, + format: { + pattern: /^[^\s]+$/, + message: '^UsernameCannotContainSpaces' + } + }, + title: { + presence: { + allowEmpty: false + } + }, + description: { + presence: { + allowEmpty: false + } + }, + categoryTitle: { + presence: true, + length: { + minimum: 1, + maximum: 25 + } + }, + categoryDescription: { + presence: true, + length: { + minimum: 0, + maximum: 60 + } + }, + category: { + presence: { + allowEmpty: false + } + }, + zone: { + presence: true, + length: { + minimum: 5 + } + }, + price: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThan: 0 + } + }, + discounted: {}, + type: { + presence: true, + length: { + minimum: 1, + maximum: 6 + } + }, + mongoUrl: { + url: { + scheme: ['mongodb'] + } + }, + currencyCode: { + presence: { + allowEmpty: false + } + }, + currencySymbol: { + presence: { + allowEmpty: false + } + }, + reason: { + presence: true, + length: { + minimum: 1, + maximum: 30 + } + }, + optionTitle: { + presence: { + allowEmpty: false + } + }, + optionDescription: { + presence: { + allowEmpty: false + } + }, + optionPrice: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThanOrEqualTo: 0 + } + }, + addonTitle: { + presence: { + allowEmpty: false + } + }, + addonDescription: { + presence: { + allowEmpty: false + } + }, + addonQuantityMinimum: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThanOrEqualTo: 0 + } + }, + addonQuantityMaximum: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThanOrEqualTo: 1 + } + }, + tag: { + presence: { + allowEmpty: false + } + }, + stock: { + presence: true, + numericality: { + onlyInteger: true, + greaterThanOrEqualTo: 0 + } + }, + code: { + presence: { + allowEmpty: false + } + }, + discount: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThan: 0, + lessThan: 100 + } + }, + tip: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThan: 0, + lessThan: 100 + } + }, + tax: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThan: 0 + } + }, + taxationCharges: { + presence: { + allowEmpty: false + }, + numericality: { + greaterThanOrEqualTo: 0 + } + } +} + +export const validateFunc = (value, constraint) => { + return validate(value, { [constraint]: constraints[constraint] }) +} +export const validateFuncForRider = (value, constraint) => { + const validationResult = validate(value, { + [constraint]: constraints[constraint] + }) + if (validationResult !== undefined && validationResult !== null) { + if (!constraints[constraint]) { + return { isValid: false, errorMessage: 'Invalid constraint' } + } + return { isValid: false, errorMessage: validationResult[constraint][0] } + } else { + return { isValid: true, errorMessage: null } + } +} diff --git a/enatega-multivendor-admin/src/context/Configuration.js b/enatega-multivendor-admin/src/context/Configuration.js new file mode 100644 index 0000000..0beb737 --- /dev/null +++ b/enatega-multivendor-admin/src/context/Configuration.js @@ -0,0 +1,25 @@ +import { gql, useQuery } from '@apollo/client' +import React from 'react' +import { getConfiguration } from '../apollo/queries' + +const GETCONFIGURATION = gql` + ${getConfiguration} +` + +const ConfigurationContext = React.createContext({}) + +export const ConfigurationProvider = props => { + const { loading, data, error } = useQuery(GETCONFIGURATION) + const configuration = + loading || error || !data.configuration + ? { currency: '', currencySymbol: '', deliveryRate: 0 } + : data.configuration + + return ( + + {props.children} + + ) +} +export const ConfigurationConsumer = ConfigurationContext.Consumer +export default ConfigurationContext diff --git a/enatega-multivendor-admin/src/context/Restaurant.js b/enatega-multivendor-admin/src/context/Restaurant.js new file mode 100644 index 0000000..8bafe93 --- /dev/null +++ b/enatega-multivendor-admin/src/context/Restaurant.js @@ -0,0 +1,14 @@ +import React, { useContext, useState } from 'react' +export const RestContext = React.createContext() + +export const RestProvider = props => { + const [image, setImage] = useState() + const [name, setName] = useState() + const [id, setId] = useState() + return ( + + {props.children} + + ) +} +export const useRestaurantContext = () => useContext(RestContext) diff --git a/enatega-multivendor-admin/src/firebase.js b/enatega-multivendor-admin/src/firebase.js new file mode 100644 index 0000000..1f5e947 --- /dev/null +++ b/enatega-multivendor-admin/src/firebase.js @@ -0,0 +1,38 @@ +// Import the functions you need from the SDKs you need +import * as firebase from 'firebase/app' +import { getMessaging, isSupported } from 'firebase/messaging' + +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries + +// Your web app's Firebase configuration +// For Firebase JS SDK v7.20.0 and later, measurementId is optional + +export const initialize = ( + FIREBASE_KEY, + AUTH_DOMAIN, + PROJECT_ID, + STORAGE_BUCKET, + MSG_SENDER_ID, + APP_ID, + MEASUREMENT_ID +) => { + const firebaseConfig = { + apiKey: 'AIzaSyCHrV6bF7YPbDjmU5bSd7umSuJen71uUgI', + authDomain: 'enatega-multivendor.firebaseapp.com', + projectId: 'enatega-multivendor', + storageBucket: 'enatega-multivendor.appspot.com', + messagingSenderId: '650001300965', + appId: '1:650001300965:web:68c10de22ea273b76bc30c', + measurementId: 'G-C229R9TNPS' + } + + // Initialize Firebase + const app = firebase.initializeApp(firebaseConfig) + const messaging = getMessaging(app) + return messaging +} + +export const isFirebaseSupported = async() => { + return await isSupported() +} diff --git a/enatega-multivendor-admin/src/i18n.js b/enatega-multivendor-admin/src/i18n.js new file mode 100644 index 0000000..aa911c1 --- /dev/null +++ b/enatega-multivendor-admin/src/i18n.js @@ -0,0 +1,27 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' +import en from './translations/en' +import de from './translations/de' +import fr from './translations/fr' +import km from './translations/km' +import zh from './translations/zh' +import ar from './translations/ar' +i18n.use(initReactI18next).init({ + // we init with resources + resources: { + en, + de, + fr, + km, + zh, + ar + }, + lng: localStorage.getItem('enatega-language') || 'en', + fallbackLng: 'en', + debug: true, + interpolation: { + escapeValue: false // not needed for react!! + } +}) + +export default i18n diff --git a/enatega-multivendor-admin/src/index.js b/enatega-multivendor-admin/src/index.js new file mode 100644 index 0000000..3bdd91d --- /dev/null +++ b/enatega-multivendor-admin/src/index.js @@ -0,0 +1,129 @@ +import React, { useEffect } from 'react' + +import ReactDOM from 'react-dom' +import { + ApolloProvider, + ApolloClient, + InMemoryCache, + ApolloLink, + concat, + createHttpLink, + Observable, + split +} from '@apollo/client' +import { getMainDefinition } from '@apollo/client/utilities' +import { WebSocketLink } from '@apollo/client/link/ws' +import 'firebase/messaging' +import * as Sentry from '@sentry/react' +import { Integrations } from '@sentry/tracing' +import ConfigurableValues from './config/constants' +import { ConfigurationProvider } from './context/Configuration' +import App from './app' +import { RestProvider } from './context/Restaurant' +import { ThemeProvider, StyledEngineProvider } from '@mui/material' +import theme from './utils/theme' + +function Main() { + const { + SENTRY_DSN, + GOOGLE_MAPS_KEY, + SERVER_URL, + WS_SERVER_URL + } = ConfigurableValues() + console.log('GOOGLE_MAPS_KEY', GOOGLE_MAPS_KEY) + useEffect(() => { + Sentry.init({ + dsn: SENTRY_DSN, + integrations: [new Integrations.BrowserTracing()], + tracesSampleRate: 0.1 + }) + }, []) + + const cache = new InMemoryCache() + const httpLink = createHttpLink({ + uri: `${SERVER_URL}/graphql` + }) + const wsLink = new WebSocketLink({ + uri: `${WS_SERVER_URL}/graphql`, + options: { + reconnect: true + } + }) + const request = async operation => { + const data = localStorage.getItem('user-enatega') + + let token = null + if (data) { + token = JSON.parse(data).token + } + operation.setContext({ + headers: { + authorization: token ? `Bearer ${token}` : '' + } + }) + } + + const requestLink = new ApolloLink( + (operation, forward) => + new Observable(observer => { + let handle + Promise.resolve(operation) + .then(oper => request(oper)) + .then(() => { + handle = forward(operation).subscribe({ + next: observer.next.bind(observer), + error: observer.error.bind(observer), + complete: observer.complete.bind(observer) + }) + }) + .catch(observer.error.bind(observer)) + + return () => { + if (handle) handle.unsubscribe() + } + }) + ) + const terminatingLink = split(({ query }) => { + const { kind, operation } = getMainDefinition(query) + return kind === 'OperationDefinition' && operation === 'subscription' + }, wsLink) + + const client = new ApolloClient({ + link: concat(ApolloLink.from([terminatingLink, requestLink]), httpLink), + cache, + resolvers: {}, + connectToDevTools: true + }) + + return ( + + + {/* */} + + + + + {/* */} + + {/* */} + + + + + {/* */} + + + ) +} + +// eslint-disable-next-line react/no-deprecated +ReactDOM.render(
, document.getElementById('root')) diff --git a/enatega-multivendor-admin/src/layouts/Admin.jsx b/enatega-multivendor-admin/src/layouts/Admin.jsx new file mode 100644 index 0000000..3c76f74 --- /dev/null +++ b/enatega-multivendor-admin/src/layouts/Admin.jsx @@ -0,0 +1,67 @@ +import React, { useRef, useEffect } from 'react' +import { Route, Switch } from 'react-router-dom' +// core components +import AdminNavbar from '../components/Navbars/AdminNavbar' +import AdminFooter from '../components/Footers/AdminFooter' +import Sidebar from '../components/Sidebar/Sidebar' +import routes from '../routes' +import { Box } from '@mui/material' + +function Admin(props) { + var divRef = useRef(null) + + useEffect(() => { + document.documentElement.scrollTop = 0 + document.scrollingElement.scrollTop = 0 + divRef.current.scrollTop = 0 + }, []) + + const getRoutes = routes => { + return routes.map((prop, key) => { + if (prop.layout === '/admin') { + return ( + + ) + } else { + return null + } + }) + } + const getBrandText = path => { + for (let i = 0; i < routes.length; i++) { + if ( + props.location.pathname.indexOf(routes[i].layout + routes[i].path) !== + -1 + ) { + return routes[i].name + } + } + return 'Dispatch' + } + + return ( + + + + + {getRoutes(routes)} + + + + ) +} + +export default Admin diff --git a/enatega-multivendor-admin/src/layouts/Auth.jsx b/enatega-multivendor-admin/src/layouts/Auth.jsx new file mode 100644 index 0000000..c011ed7 --- /dev/null +++ b/enatega-multivendor-admin/src/layouts/Auth.jsx @@ -0,0 +1,39 @@ +import React, { useEffect } from 'react' +import { Route, Switch } from 'react-router-dom' + +import { Box } from '@mui/material' + +import routes from '../routes' + +function Auth() { + useEffect(() => { + document.body.classList.add('bg-default') + return () => { + document.body.classList.remove('bg-default') + } + }, []) + const getRoutes = routes => { + return routes.map((prop, key) => { + if (prop.layout === '/auth') { + return ( + + ) + } else { + return null + } + }) + } + return ( + + + {getRoutes(routes)} + + + ) +} + +export default Auth diff --git a/enatega-multivendor-admin/src/layouts/Restaurant.jsx b/enatega-multivendor-admin/src/layouts/Restaurant.jsx new file mode 100644 index 0000000..aacc71b --- /dev/null +++ b/enatega-multivendor-admin/src/layouts/Restaurant.jsx @@ -0,0 +1,59 @@ +import React, { useRef, useEffect } from 'react' +import { Route, Switch } from 'react-router-dom' +import { Container } from '@mui/material' +import AdminNavbar from '../components/Navbars/AdminNavbar' +import AdminFooter from '../components/Footers/AdminFooter' + +import routes from '../routes' + +function Restaurant(props) { + var divRef = useRef(null) + useEffect(() => { + document.documentElement.scrollTop = 0 + document.scrollingElement.scrollTop = 0 + divRef.current.scrollTop = 0 + }, []) + + const getRoutes = routes => { + return routes.map((prop, key) => { + if (prop.layout === '/restaurant') { + return ( + + ) + } else { + return null + } + }) + } + const getBrandText = path => { + for (let i = 0; i < routes.length; i++) { + if ( + props.location.pathname.indexOf(routes[i].layout + routes[i].path) !== + -1 + ) { + return routes[i].name + } + } + return 'Brand' + } + return ( + <> +
+ + {getRoutes(routes)} + + + +
+ + ) +} + +export default Restaurant diff --git a/enatega-multivendor-admin/src/layouts/SuperAdmin.jsx b/enatega-multivendor-admin/src/layouts/SuperAdmin.jsx new file mode 100644 index 0000000..e6f5c02 --- /dev/null +++ b/enatega-multivendor-admin/src/layouts/SuperAdmin.jsx @@ -0,0 +1,67 @@ +import React, { useEffect, useRef } from 'react' +import { Route, Switch } from 'react-router-dom' +// core components +import AdminNavbar from '../components/Navbars/AdminNavbar' +import AdminFooter from '../components/Footers/AdminFooter' +import AdminSidebar from '../components/Sidebar/AdminSidebar' + +import routes from '../routes' +import { Box } from '@mui/material' + +function SuperAdmin(props) { + var divRef = useRef(null) + + useEffect(() => { + document.documentElement.scrollTop = 0 + document.scrollingElement.scrollTop = 0 + divRef.current.scrollTop = 0 + }, []) + + const getRoutes = routes => { + return routes.map((prop, key) => { + if (prop.layout === '/super_admin') { + return ( + + ) + } else { + return null + } + }) + } + const getBrandText = path => { + for (let i = 0; i < routes.length; i++) { + if ( + props.location.pathname.indexOf(routes[i].layout + routes[i].path) !== + -1 + ) { + return routes[i].name + } + } + return 'Brand' + } + return ( + + + + + {getRoutes(routes)} + + + + ) +} + +export default SuperAdmin diff --git a/enatega-multivendor-admin/src/routes.js b/enatega-multivendor-admin/src/routes.js new file mode 100644 index 0000000..c23f998 --- /dev/null +++ b/enatega-multivendor-admin/src/routes.js @@ -0,0 +1,339 @@ +import Login from './views/Login' +import Category from './views/Category' +import Food from './views/Food' +import Profile from './views/VendorProfile' +import Orders from './views/Orders' +import Configuration from './views/Configuration' //uncomment this for paid version +import DemoConfiguration from './views/Configuration1' //comment this for paid version +import Users from './views/Users' +import Vendors from './views/Vendors' +import RestaurantList from './views/RestaurantList' +import ResetPassword from './views/ForgotPassword' +import Riders from './views/Riders' +import Options from './views/Options' +import Addons from './views/Addons' +import Coupons from './views/Coupons' +import Dashboard from './views/Dashboard' +import Restaurant from './views/Restaurant' +import Ratings from './views/Rating' +import Dispatch from './views/Dispatch' +import Timings from './views/Timings' +import Tipping from './views/Tipping' +import Zone from './views/Zone' +import Sections from './views/Sections' +import Notifications from './views/Notifications' +import Payment from './views/Payment' +import Commission from './views/Commission' +import DeliveryBoundsAndLocation from './views/DeliveryBoundsAndLocation' +import DispatchRestaurant from './views/DispatchRestaurant' +import WithdrawRequest from './views/WithdrawRequest' +import { ReactComponent as VendorIcon } from './assets/svg/vendor.svg' +import { ReactComponent as RestaurantIcon } from './assets/svg/restaurant.svg' +import { ReactComponent as CommissionsIcon } from './assets/svg/commission.svg' +import { ReactComponent as ConfigurationIcon } from './assets/svg/configuration.svg' +import { ReactComponent as CouponsIcon } from './assets/svg/coupons.svg' +import { ReactComponent as DeliveryIcon } from './assets/svg/delivery.svg' +import { ReactComponent as NotificationsIcon } from './assets/svg/notifications.svg' +import { ReactComponent as RequestIcon } from './assets/svg/request.svg' +import { ReactComponent as RiderIcon } from './assets/svg/riders.svg' +import { ReactComponent as TippingsIcon } from './assets/svg/tipping.svg' +import { ReactComponent as UserIcon } from './assets/svg/user.svg' +import { ReactComponent as ZonesIcon } from './assets/svg/zones.svg' +import { ReactComponent as HomeIcon } from './assets/svg/home.svg' +import { ReactComponent as AddonsIcon } from './assets/svg/addons.svg' +import { ReactComponent as BackIcon } from './assets/svg/back.svg' +import { ReactComponent as CategoryIcon } from './assets/svg/category.svg' +import { ReactComponent as DashboardIcon } from './assets/svg/dashboard.svg' +import { ReactComponent as FoodIcon } from './assets/svg/food.svg' +import { ReactComponent as LocationIcon } from './assets/svg/location.svg' +import { ReactComponent as OptionIcon } from './assets/svg/option.svg' +import { ReactComponent as OrderIcon } from './assets/svg/order.svg' +import { ReactComponent as PaymentIcon } from './assets/svg/payment.svg' +import { ReactComponent as RatingIcon } from './assets/svg/rating.svg' +import { ReactComponent as TimingIcon } from './assets/svg/timings.svg' +import { ReactComponent as RestaurantSectionIcon } from './assets/svg/restSection.svg' +import SuperAdminDashboard from './views/SuperAdminDashboard' +import Cuisines from './views/Cuisines' + +var routes = [ + { + path: '/dashboard', + name: 'Home', + icon: HomeIcon, + component: SuperAdminDashboard, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/vendors', + name: 'Vendors', + icon: VendorIcon, + component: Vendors, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/restaurants', + name: 'Restaurants', + icon: RestaurantIcon, + component: RestaurantList, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/sections', + name: 'Restaurant Sections', + icon: RestaurantSectionIcon, + component: Sections, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/users', + name: 'Users', + icon: UserIcon, + component: Users, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/riders', + name: 'Riders', + icon: RiderIcon, + component: Riders, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/configuration', + name: 'Configuration', + icon: ConfigurationIcon, + component: Configuration, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/coupons', + name: 'Coupons', + icon: CouponsIcon, + component: Coupons, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/cuisines', + name: 'Cousines', + icon: CouponsIcon, + component: Cuisines, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/tipping', + name: 'Tipping', + icon: TippingsIcon, + component: Tipping, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/zones', + name: 'Zone', + icon: ZonesIcon, + component: Zone, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/dispatch', + name: 'Dispatch', + icon: DeliveryIcon, + component: Dispatch, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/notifications', + name: 'Notifications', + icon: NotificationsIcon, + component: Notifications, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/commission', + name: 'Commission Rates', + icon: CommissionsIcon, + component: Commission, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/withdraw/', + name: 'Withdraw Requests', + icon: RequestIcon, + component: WithdrawRequest, + layout: '/super_admin', + appearInSidebar: true, + admin: true + }, + { + path: '/list', + name: 'List', + icon: 'ni ni-tv-2 text-primary', + component: Restaurant, + layout: '/restaurant', + appearInSidebar: false, + admin: false + }, + { + path: '/dashboard', + name: 'Dashboard', + icon: DashboardIcon, + component: Dashboard, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/profile', + name: 'Profile', + icon: UserIcon, + component: Profile, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/food', + name: 'Food', + icon: FoodIcon, + component: Food, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/category', + name: 'Category', + icon: CategoryIcon, + component: Category, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/orders', + name: 'Orders', + icon: OrderIcon, + component: Orders, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + + { + path: '/option', + name: 'Option', + icon: OptionIcon, + component: Options, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/ratings', + name: 'Ratings', + icon: RatingIcon, + component: Ratings, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/addons', + name: 'Addons', + icon: AddonsIcon, + component: Addons, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/timings', + name: 'Timings', + icon: TimingIcon, + component: Timings, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/payment', + name: 'Payment', + icon: PaymentIcon, + component: Payment, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/deliverybounds', + name: 'Location', + icon: LocationIcon, + component: DeliveryBoundsAndLocation, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + + { + path: '/login', + name: 'Login', + icon: 'ni ni-key-25 text-info', + component: Login, + layout: '/auth', + appearInSidebar: false + }, + { + path: '/reset', + name: 'ResetPassword', + icon: 'ni ni-key-25 text-info', + component: ResetPassword, + layout: '/auth', + appearInSidebar: false + }, + { + path: '/dispatch/:id', + name: 'Dispatch', + icon: DeliveryIcon, + component: DispatchRestaurant, + layout: '/admin', + appearInSidebar: true, + admin: false + }, + { + path: '/vendors', + name: 'Back to Admin', + icon: BackIcon, + component: Vendors, + layout: '/super_admin', + appearInSidebar: true, + admin: false + } +] +export default routes diff --git a/enatega-multivendor-admin/src/translations/ar.js b/enatega-multivendor-admin/src/translations/ar.js new file mode 100644 index 0000000..620295b --- /dev/null +++ b/enatega-multivendor-admin/src/translations/ar.js @@ -0,0 +1,305 @@ +const ar = { + translation: { + 'Sign in credentials': 'بيانات تسجيل الدخول', + 'Sign in': 'تسجيل الدخول', + 'Add Category': 'إضافة فئة', + Title: 'العنوان', + Description: 'الوصف', + Add: 'إضافة', + Remove: 'إزالة', + 'Add/Remove': 'إضافة/إزالة', + Success: 'نجاح', + Danger: 'خطر', + Categories: 'الفئات', + Image: 'صورة', + Header: 'رأس', + Loading: 'جار التحميل', + Error: 'خطأ', + Edit: 'تحرير', + Delete: 'حذف', + 'Edit Category': 'تحرير الفئة', + Save: 'حفظ', + 'OrderID prefix': 'بادئة رقم الطلب', + Order: 'الطلب', + Email: 'البريد الإلكتروني', + Password: 'كلمة المرور', + Enable: 'تمكين', + Disable: 'تعطيل', + 'Enable/Disable': 'تمكين/تعطيل', + Saving: 'جار الحفظ', + Paypal: 'بايبال', + 'Client ID': 'معرف العميل', + 'Client Secret': 'السر الخاص بالعميل', + Sandbox: 'صندوق الرمل', + 'Publishable Key': 'مفتاح النشر', + 'Secret Key': 'المفتاح السري', + 'Delivery Charges': 'رسوم التوصيل', + Price: 'السعر', + 'Add Food': 'إضافة طعام', + Category: 'الفئة', + Select: 'اختيار', + Variations: 'تغييرات', + Type: 'النوع', + 'Food Image': 'صورة الطعام', + Foods: 'الأطعمة', + Actions: 'الإجراءات', + 'Edit Food': 'تحرير الطعام', + OrderID: 'رقم الطلب', + Orders: 'الطلبات', + Name: 'الاسم', + Items: 'العناصر', + Payment: 'الدفع', + Status: 'الحالة', + Review: 'المراجعة', + 'Mark as': 'وسم كـ', + Users: 'المستخدمين', + Phone: 'الهاتف', + Address: 'العنوان', + 2019: '2019', + 'About Us': 'عنا', + Blog: 'المدونة', + Welcome: 'مرحبًا', + Logout: 'تسجيل الخروج', + Dashboard: 'لوحة التحكم', + Configuration: 'التكوين', + Login: 'تسجيل الدخول', + Food: 'طعام', + 'Character limit of max length 50': 'الحد الأقصى للحروف (50)', + 'Character limit of max length 15': 'الحد الأقصى للحروف (15)', + 'Character limit of max length 60': 'الحد الأقصى للحروف (60)', + 'Character limit of max length 20': 'الحد الأقصى للحروف (20)', + 'Character limit of max length 140': 'الحد الأقصى للحروف (140)', + Currency: 'العملة', + Delivery: 'التوصيل', + 'Currency Code': 'رمز العملة', + 'Delivery Rate': 'سعر التوصيل', + 'Currency Symbol': 'رمز العملة', + enterYourDetailsBelow: 'أدخل تفاصيلك أدناه', + LogintoEnatega: 'تسجيل الدخول إلى Enatega', + RememberMe: 'تذكرني', + ForgotYourPassword: 'نسيت كلمة المرور؟', + errorWhileSaving: 'حدث خطأ أثناء الحفظ، حاول مرة أخرى', + Saved: 'تم الحفظ', + Addons: 'إضافات', + AddRemoveAddon: 'إضافة أو إزالة الإضافة', + MinQuantity: 'الحد الأدنى للكمية', + MinimumQuantity: 'الحد الأدنى للكمية', + MaxQuantity: 'الحد الأقصى للكمية', + MaximumQuantity: 'الحد الأقصى للكمية', + Options: 'الخيارات', + NewOption: 'خيار جديد', + CategoryUpdatedSuccessfully: 'تم تحديث الفئة بنجاح', + CategoryAddedSuccessfully: 'تمت إضافة الفئة بنجاح', + ActionFailedTryAgain: 'فشلت العملية. يرجى المحاولة مرة أخرى', + PHCategory: 'الفئة، مثل وجبة الإفطار', + ChooseCurrency: 'اختيار العملة', + ChooseSymbol: 'اختيار الرمز', + PHMail: 'على سبيل المثال، something@email.com', + EmailName: 'اسم البريد الإلكتروني', + PHEnatega: 'على سبيل المثال، Enatega', + PHFood: 'على سبيل المثال، FOOD', + ClientSecretKey: 'مفتاح العميل السري', + Stripe: 'شريط', + PublishKey: 'مفتاح النشر', + CouponUpdated: 'تم تحديث القسيمة', + CouponAdded: 'تمت إضافة القسيمة', + Code: 'الرمز', + PHCode: 'مثل SALE50', + PHDiscount: 'نسبة الخصم، مثل 1-99', + FoodUpdatedSuccessfully: 'تم تحديث الطعام بنجاح', + FoodAddedSuccessfully: 'تمت إضافة الطعام بنجاح', + SelectCategory: 'اختيار الفئة', + UploadAnImage: 'تحميل صورة', + UniqueTitle: 'العنوان (يجب أن يكون فريداً)', + Discounted: 'بخصم', + LoadingDots: 'جار التحميل ...', + ErrorDots: 'خطأ ...', + NewAddon: 'إضافة جديدة', + EnategaMultivendor: 'Enatega Multivendor', + ResetPassword: 'إعادة تعيين كلمة المرور', + EnategaDashboard: 'لوحة تحكم Enatega', + UpdateOption: 'تحديث الخيار', + AddOption: 'إضافة الخيار', + OrderStatusUpdated: 'تم تحديث حالة الطلب', + SpecialInstructions: 'تعليمات خاصة', + Charges: 'الرسوم', + Subtotal: 'المجموع الفرعي', + DeliveryFee: 'رسوم التوصيل', + TaxCharges: 'رسوم الضرائب', + Tip: 'بقشيش', + Total: 'الإجمالي', + PaymentMethod: 'طريقة الدفع', + PaidAmount: 'المبلغ المدفوع', + Accepted: 'تم القبول', + Accept: 'قبول', + Cancelled: 'تم الإلغاء', + Cancel: 'إلغاء', + PHReasonIfRejected: 'السبب إذا تم رفضه', + Datetime: 'التاريخ والوقت', + PasswordChangedSuccessfully: 'تم تغيير كلمة المرور بنجاح', + ConfirmPassword: 'تأكيد كلمة المرور', + Reset: 'إعادة تعيين', + RestaurantAdded: 'تمت إضافة المطعم', + NetworkError: 'خطأ في الشبكة', + FieldsRequired: 'الحقول مطلوبة', + Username: 'اسم المستخدم', + RestaurantUsername: 'اسم مستخدم المطعم', + RestaurantPassword: 'كلمة مرور المطعم', + RestaurantName: 'اسم المطعم', + RestaurantAddress: 'عنوان المطعم', + DeliveryTime: 'وقت التوصيل', + MinOrder: 'الحد الأدنى للطلب', + SalesTax: 'ضريبة المبيعات', + RiderUpdatedSuccessfully: 'تم تحديث الراكب بنجاح', + RiderAddedSuccessfully: 'تمت إضافة الراكب بنجاح', + UsernameCannotBeBlank: 'لا يمكن أن يكون اسم المستخدم فارغًا', + UsernameCannotContainSpaces: 'لا يمكن أن يحتوي اسم المستخدم على مسافات', + EditRider: 'تحرير الراكب', + AddRider: 'إضافة الراكب', + Available: 'متاح', + PHRiderName: 'اسم الراكب', + Number: 'الرقم', + PhoneNumber: 'رقم الهاتف', + RiderZone: 'منطقة الراكب', + SectionUpdatedSuccessfully: 'تم تحديث القسم بنجاح', + SectionAddedSuccessfully: 'تمت إضافة القسم بنجاح', + EditSection: 'تحرير القسم', + AddSection: 'إضافة القسم', + SectionName: 'اسم القسم', + Update: 'تحديث', + GENERAL: 'عام', + MANAGEMENT: 'الإدارة', + RESTAURANT: 'المطعم', + BackToAdmin: 'العودة إلى الإدارة', + Search: 'بحث', + TippingUpdated: 'تم تحديث البقشيش', + EditTipping: 'تحرير البقشيش', + AddTipping: 'إضافة البقشيش', + Tip1: 'البقشيش 1', + Tip2: 'البقشيش 2', + Tip3: 'البقشيش 3', + PHTip1: 'البقشيش 1، مثل 10', + PHTip2: 'البقشيش 2، مثل 20', + PHTip3: 'البقشيش 3، مثل 30', + EditVendor: 'تحرير البائع', + AddVendor: 'إضافة بائع', + PHNumber: 'مثل 123', + ZoneUpdatedSuccessfully: 'تم تحديث المنطقة بنجاح', + ZoneAddedSuccessfully: 'تمت إضافة المنطقة بنجاح', + SetZoneOnMap: 'تحديد المنطقة على الخريطة', + EditZone: 'تحرير المنطقة', + AddZone: 'إضافة المنطقة', + Minimum: 'الحد الأدنى', + Maximum: 'الحد الأقصى', + Action: 'الإجراء', + AvailableAfterPurchasing: 'ستكون هذه الميزة متاحة بعد شراء المنتج', + CommissionRates: 'أسعار العمولة', + PHCommission: 'نسبة العمولة', + Discount: 'خصم %', + Coupons: 'قسائم', + StartDate: 'تاريخ البداية', + GraphFilter: 'مرشح الرسم البياني', + EndDate: 'تاريخ الانتهاء', + Apply: 'تطبيق', + UpdatingLocationError: 'حدث خطأ أثناء تحديث الموقع والحدود', + LocationMarkerRequired: 'مطلوب علامة الموقع', + DeliveryAreaRequired: 'منطقة التوصيل مطلوبة', + LocationUpdatedSuccessfully: 'تم تحديث الموقع والحدود بنجاح', + SetLocation: 'تعيين الموقع', + DrawDeliveryBounds: 'رسم حدود التوصيل', + SetRestaurantLocation: 'تعيين موقع المطعم', + RemoveDeliveryBounds: 'إزالة حدود التوصيل', + RemoveRestaurantLocation: 'إزالة موقع المطعم', + Reject: 'رفض', + Delivered: 'تم التوصيل', + OrderInformation: 'معلومات الطلب', + RestaurantCol: 'مطعم', + Rider: 'سائق', + OrderTime: 'وقت الطلب', + Dispatch: 'إرسال', + PasswordUpdated: 'تم تحديث كلمة المرور', + ForgotPassword: 'نسيت كلمة المرور', + NotificationSentAuccessfully: 'تم إرسال الإشعار بنجاح', + Notifications: 'الإشعارات', + Body: 'المحتوى', + Zones: 'المناطق', + RequestID: 'رقم الطلب', + Amount: 'المبلغ', + Date: 'التاريخ', + REQUESTED: 'طُلب', + TRANSFERRED: 'تم التحويل', + CANCELLEDStatus: 'ملغاة', + WithdrawRequests: 'طلبات السحب', + TotalRestaurants: 'إجمالي المطاعم', + Restaurants: 'مطاعم', + Vendors: 'بائعون', + RestaurantUpdatedSuccessfully: 'تم تحديث المطعم بنجاح', + UpdateProfile: 'تحديث الملف الشخصي', + PHRestaurantPassword: 'كلمة مرور المطعم', + PHRestaurantName: 'اسم المطعم', + PHRestaurantAddress: 'عنوان المطعم', + OrderPrefix: 'بادئة الطلب', + Days: 'أيام', + OpenTimes: 'أوقات العمل', + TimeSavedSuccessfully: 'تم حفظ الوقت بنجاح', + ErrorWhileSavingTime: 'حدث خطأ أثناء حفظ الوقت', + SavingDots: 'جاري الحفظ...', + January: 'يناير', + February: 'فبراير', + March: 'مارس', + April: 'إبريل', + May: 'مايو', + June: 'يونيو', + July: 'يوليو', + MainPageText: 'برمجيات متعددة المنصات', + MainPageText1: 'حلا كاملا يصلح تمامًا لإنشاء أي مطعم.', + ViewSite: 'عرض الموقع', + TotalUsers: 'إجمالي المستخدمين', + TotalVendors: 'إجمالي البائعين', + TotalRiders: 'إجمالي السائقين', + RestaurantSections: 'أقسام المطعم', + ImageMenu: 'قائمة الصور', + Vendor: 'بائع', + AddNewRestaurant: 'إضافة مطعم جديد', + Ratings: 'التقييمات', + StripeDetailsAttached: 'تم إرفاق تفاصيل Stripe', + EditStripeDetails: 'تحرير تفاصيل Stripe', + SubmitStripeDetails: 'إرسال تفاصيل Stripe', + 'Restaurant Sections': 'أقسام المطعم', + Riders: 'الفرسان', + Tipping: 'البقشيش', + Zone: 'المنطقة', + 'Commission Rates': 'أسعار العمولة', + 'Withdraw Requests': 'طلبات السحب', + Home: 'الرئيسية', + Profile: 'الملف الشخصي', + Option: 'خيار', + Timings: 'أوقات العمل', + Location: 'الموقع', + 'Back to Admin': 'العودة إلى لوحة التحكم', + TotalOrders: 'إجمالي الطلبات', + TotalSales: 'إجمالي المبيعات', + ClosedAllDay: 'مغلق طوال اليوم', + AddRestaurant: 'إضافة مطعم', + EditCoupon: 'تعديل الكوبون', + AddCoupon: 'إضافة كوبون', + SalesAmount: 'مبلغ المبيعات', + OrderCount: 'عدد الطلبات', + MON: 'الاثنين', + TUE: 'الثلاثاء', + WED: 'الأربعاء', + THU: 'الخميس', + FRI: 'الجمعة', + SAT: 'السبت', + SUN: 'الأحد', + Open: 'مفتوح', + ACCEPTED: 'تم قبوله', + PENDING: 'قيد الانتظار', + PICKED: 'تم اختياره', + ASSIGNED: 'تم التعيين', + DELIVERED: 'تم التسليم', + REJECTED: 'تم رفضه' + } +} + +export default ar diff --git a/enatega-multivendor-admin/src/translations/de.js b/enatega-multivendor-admin/src/translations/de.js new file mode 100644 index 0000000..d3ec74b --- /dev/null +++ b/enatega-multivendor-admin/src/translations/de.js @@ -0,0 +1,317 @@ +const de = { + translation: { + 'Sign in credentials': 'Anmeldeinformationen', + 'Sign in': 'Einloggen', + 'Add Category': 'Kategorie hinzufügen', + Title: 'Titel', + Description: 'Beschreibung', + Add: 'Hinzufügen', + Remove: 'Löschen', + 'Add/Remove': 'Hinzufügen/Entfernen', + Success: 'Erfolg', + Danger: 'Achtung', + Categories: 'Kategorien', + Image: 'Bild', + Header: 'Header', + Loading: 'Wird geladen', + Error: 'Error', + Edit: 'Bearbeiten', + Delete: 'Löschen', + 'Edit Category': 'Kategorie bearbeiten', + Save: 'sparen', + 'OrderID prefix': 'OrderID-Präfix', + Order: 'Auftrag', + Email: 'Email', + Password: 'Passwort', + Enable: 'Aktivieren', + Disable: 'Deaktivieren', + 'Enable/Disable': 'Aktivieren deaktivieren', + Saving: 'Speichern', + Paypal: 'Paypal', + 'Client ID': 'Kunden ID', + 'Client Secret': 'Kundengeheimnis', + Sandbox: 'Sandkasten', + 'Publishable Key': 'Veröffentlichbarer Schlüssel', + 'Secret Key': 'Geheimer Schlüssel', + 'Delivery Charges': 'Versandkosten', + Price: 'Preis', + 'Add Food': 'Lebensmittel hinzufügen', + Category: 'Kategorie', + Select: 'Wählen', + Variations: 'Variationen', + Type: 'Art', + 'Food Image': 'Food Image', + Foods: 'Lebensmittel', + Actions: 'Aktionen', + 'Edit Food': 'Essen bearbeiten', + OrderID: 'Auftragsnummer', + Orders: 'Aufträge', + Name: 'Name', + Items: 'Artikel', + Payment: 'Zahlung', + Status: 'Status', + Review: 'Rezension', + 'Mark as': 'markieren als', + Users: 'Benutzer', + Phone: 'Telefon', + Address: 'Adresse', + 2019: '2019', + 'About Us': 'Über uns', + Blog: 'Blog', + Welcome: 'Herzlich willkommen', + Logout: 'Ausloggen', + Dashboard: 'Instrumententafel', + Configuration: 'Aufbau', + Login: 'Anmeldung', + Food: 'Essen', + 'Character limit of max length 50': + 'Zeichenbegrenzung von maximaler Länge 50', + 'Character limit of max length 15': + 'Zeichenbegrenzung von maximaler Länge 15', + 'Character limit of max length 60': + 'Zeichenbegrenzung von maximaler Länge 60', + 'Character limit of max length 20': + 'Zeichenbegrenzung von maximaler Länge 20', + 'Character limit of max length 140': + 'Zeichenbegrenzung von maximaler Länge 140', + Currency: 'Währung', + Delivery: 'Lieferung', + 'Currency Code': 'Währungscode', + 'Delivery Rate': 'Lieferpreis', + 'Currency Symbol': 'Währungssymbol', + enterYourDetailsBelow: 'Geben Sie Ihre Details unten ein', + LogintoEnatega: 'Einloggen bei Enatega', + RememberMe: 'Erinnere dich an mich', + ForgotYourPassword: 'Passwort vergessen?', + errorWhileSaving: + 'Ein Fehler ist aufgetreten beim Speichern, Versuchen Sie es erneut', + Saved: 'Gespeichert', + Addons: 'Erweiterungen', + AddRemoveAddon: 'Erweiterung hinzufügen oder entfernen', + MinQuantity: 'Mindestmenge', + MinimumQuantity: 'Mindestmenge', + MaxQuantity: 'Maximale Menge', + MaximumQuantity: 'Maximale Menge', + Options: 'Optionen', + NewOption: 'Neue Option', + CategoryUpdatedSuccessfully: 'Kategorie erfolgreich aktualisiert', + CategoryAddedSuccessfully: 'Kategorie erfolgreich hinzugefügt', + ActionFailedTryAgain: + 'Aktion fehlgeschlagen. Bitte versuchen Sie es erneut', + PHCategory: 'Kategorie, z.B. Frühstück', + ChooseCurrency: 'Währung wählen', + ChooseSymbol: 'Symbol wählen', + PHMail: 'z.B. something@email.com', + EmailName: 'E-Mail-Name', + PHEnatega: 'z.B. Enatega', + PHFood: 'z.B. ESSEN', + ClientSecretKey: 'Geheimer Client-Schlüssel', + Stripe: 'Stripe', + PublishKey: 'Veröffentlichungsschlüssel', + CouponUpdated: 'Gutschein aktualisiert', + CouponAdded: 'Gutschein hinzugefügt', + Code: 'Code', + PHCode: 'Code, z.B. SALE50', + PHDiscount: 'Rabatt %, d.h. 1-99', + FoodUpdatedSuccessfully: 'Essen erfolgreich aktualisiert', + FoodAddedSuccessfully: 'Essen erfolgreich hinzugefügt', + SelectCategory: 'Kategorie auswählen', + UploadAnImage: 'Ein Bild hochladen', + UniqueTitle: 'Titel (muss einzigartig sein)', + Discounted: 'Reduziert', + LoadingDots: 'Laden ...', + ErrorDots: 'Fehler ...', + NewAddon: 'Neue Erweiterung', + EnategaMultivendor: 'Enatega Multivendor', + ResetPassword: 'Passwort zurücksetzen', + EnategaDashboard: 'Enatega-Dashboard', + UpdateOption: 'Option aktualisieren', + AddOption: 'Option hinzufügen', + OrderStatusUpdated: 'Bestellstatus aktualisiert', + SpecialInstructions: 'Besondere Anweisungen', + Charges: 'Gebühren', + Subtotal: 'Zwischensumme', + DeliveryFee: 'Liefergebühr', + TaxCharges: 'Steuergebühren', + Tip: 'Trinkgeld', + Total: 'Gesamt', + PaymentMethod: 'Zahlungsmethode', + PaidAmount: 'Bezahlter Betrag', + Accepted: 'Akzeptiert', + Accept: 'Akzeptieren', + Cancelled: 'Abgebrochen', + Cancel: 'Abbrechen', + PHReasonIfRejected: 'Grund, wenn abgelehnt', + Datetime: 'Datum und Uhrzeit', + PasswordChangedSuccessfully: 'Passwort erfolgreich geändert', + ConfirmPassword: 'Passwort bestätigen', + Reset: 'Zurücksetzen', + RestaurantAdded: 'Restaurant hinzugefügt', + NetworkError: 'Netzwerkfehler', + FieldsRequired: 'Felder erforderlich', + Username: 'Benutzername', + RestaurantUsername: 'Benutzername des Restaurants', + RestaurantPassword: 'Passwort des Restaurants', + RestaurantName: 'Name des Restaurants', + RestaurantAddress: 'Adresse des Restaurants', + DeliveryTime: 'Lieferzeit', + MinOrder: 'Mindestbestellung', + SalesTax: 'Umsatzsteuer', + RiderUpdatedSuccessfully: 'Fahrer erfolgreich aktualisiert', + RiderAddedSuccessfully: 'Fahrer erfolgreich hinzugefügt', + UsernameCannotBeBlank: 'Der Benutzername darf nicht leer sein', + UsernameCannotContainSpaces: + 'Der Benutzername darf keine Leerzeichen enthalten', + EditRider: 'Fahrer bearbeiten', + AddRider: 'Fahrer hinzufügen', + Available: 'Verfügbar', + PHRiderName: 'Name des Fahrers', + Number: 'Nummer', + PhoneNumber: 'Telefonnummer', + RiderZone: 'Fahrerzone', + SectionUpdatedSuccessfully: 'Abschnitt erfolgreich aktualisiert', + SectionAddedSuccessfully: 'Abschnitt erfolgreich hinzugefügt', + EditSection: 'Abschnitt bearbeiten', + AddSection: 'Abschnitt hinzufügen', + SectionName: 'Name des Abschnitts', + Update: 'Aktualisieren', + GENERAL: 'ALLGEMEIN', + MANAGEMENT: 'MANAGEMENT', + RESTAURANT: 'RESTAURANT', + BackToAdmin: 'Zurück zum Admin', + Search: 'Suche', + TippingUpdated: 'Trinkgeld aktualisiert', + EditTipping: 'Trinkgeld bearbeiten', + AddTipping: 'Trinkgeld hinzufügen', + Tip1: 'Trinkgeld 1', + Tip2: 'Trinkgeld 2', + Tip3: 'Trinkgeld 3', + PHTip1: 'Trinkgeld 1, z.B. 10', + PHTip2: 'Trinkgeld 2, z.B. 20', + PHTip3: 'Trinkgeld 3, z.B. 30', + EditVendor: 'Verkäufer bearbeiten', + AddVendor: 'Verkäufer hinzufügen', + PHNumber: 'z.B. 123', + ZoneUpdatedSuccessfully: 'Zone erfolgreich aktualisiert', + ZoneAddedSuccessfully: 'Zone erfolgreich hinzugefügt', + SetZoneOnMap: 'Zone auf Karte festlegen', + EditZone: 'Zone bearbeiten', + AddZone: 'Zone hinzufügen', + Minimum: 'Minimum', + Maximum: 'Maximum', + Action: 'Aktion', + AvailableAfterPurchasing: + 'Diese Funktion ist nach dem Kauf des Produkts verfügbar', + CommissionRates: 'Provisionsraten', + PHCommission: 'Prozentsatz der Provision', + Discount: 'Rabatt %', + Coupons: 'Gutscheine', + StartDate: 'Startdatum', + GraphFilter: 'Grafikfilter', + EndDate: 'Enddatum', + Apply: 'Anwenden', + UpdatingLocationError: + 'Ein Fehler ist aufgetreten beim Aktualisieren von Standort und Begrenzungen', + LocationMarkerRequired: 'Standortmarker ist erforderlich', + DeliveryAreaRequired: 'Lieferbereich ist erforderlich', + LocationUpdatedSuccessfully: + 'Standort und Begrenzungen erfolgreich aktualisiert', + SetLocation: 'Standort festlegen', + DrawDeliveryBounds: 'Liefergrenzen zeichnen', + SetRestaurantLocation: 'Restaurantstandort festlegen', + RemoveDeliveryBounds: 'Liefergrenzen entfernen', + RemoveRestaurantLocation: 'Restaurantstandort entfernen', + Reject: 'Ablehnen', + Delivered: 'Geliefert', + OrderInformation: 'Bestellinformation', + RestaurantCol: 'Restaurant', + Rider: 'Fahrer', + OrderTime: 'Bestellzeit', + Dispatch: 'Versand', + PasswordUpdated: 'Passwort wurde aktualisiert', + ForgotPassword: 'Passwort vergessen', + NotificationSentAuccessfully: 'Benachrichtigung erfolgreich gesendet', + Notifications: 'Benachrichtigungen', + Body: 'Text', + Zones: 'Zonen', + RequestID: 'Anfrage-ID', + Amount: 'Betrag', + Date: 'Datum', + REQUESTED: 'ANGEFORDERT', + TRANSFERRED: 'ÜBERTRAGEN', + CANCELLEDStatus: 'ABGEBROCHEN', + WithdrawRequests: 'Auszahlungsanfragen', + TotalRestaurants: 'Gesamtzahl der Restaurants', + Restaurants: 'Restaurants', + Vendors: 'Verkäufer', + RestaurantUpdatedSuccessfully: 'Restaurant erfolgreich aktualisiert', + UpdateProfile: 'Profil aktualisieren', + PHRestaurantPassword: 'Passwort des Restaurants', + PHRestaurantName: 'Name des Restaurants', + PHRestaurantAddress: 'Adresse des Restaurants', + OrderPrefix: 'Bestellpräfix', + Days: 'Tage', + OpenTimes: 'Öffnungszeiten', + TimeSavedSuccessfully: 'Zeit erfolgreich gespeichert', + ErrorWhileSavingTime: 'Fehler beim Speichern der Zeit', + SavingDots: 'Speichern...', + January: 'Januar', + February: 'Februar', + March: 'März', + April: 'April', + May: 'Mai', + June: 'Juni', + July: 'Juli', + MainPageText: 'Eine plattformübergreifende Software', + MainPageText1: + 'Eine umfassende Lösung, die sich hervorragend zum Aufbau eines Restaurants eignet.', + ViewSite: 'Website anzeigen', + TotalUsers: 'Gesamtzahl der Benutzer', + TotalVendors: 'Gesamtzahl der Verkäufer', + TotalRiders: 'Gesamtzahl der Fahrer', + RestaurantSections: 'Restaurantabschnitte', + ImageMenu: 'Bildermenü', + Vendor: 'Verkäufer', + AddNewRestaurant: 'Neues Restaurant hinzufügen', + Ratings: 'Bewertungen', + StripeDetailsAttached: 'Stripe-Details angefügt', + EditStripeDetails: 'Stripe-Details bearbeiten', + SubmitStripeDetails: 'Stripe-Details senden', + 'Restaurant Sections': 'Restaurant Abschnitte', + Riders: 'Fahrer', + Tipping: 'Trinkgeld', + Zone: 'Zone', + 'Commission Rates': 'Provisionsraten', + 'Withdraw Requests': 'Auszahlungsanfragen', + Home: 'Startseite', + Profile: 'Profil', + Option: 'Option', + Timings: 'Öffnungszeiten', + Location: 'Ort', + 'Back to Admin': 'Zurück zum Admin', + TotalOrders: 'Gesamtbestellungen', + TotalSales: 'Gesamtumsatz', + ClosedAllDay: 'Den ganzen Tag geschlossen', + AddRestaurant: 'Restaurant hinzufügen', + EditCoupon: 'Gutschein bearbeiten', + AddCoupon: 'Gutschein hinzufügen', + SalesAmount: 'Verkaufsbetrag', + OrderCount: 'Bestellanzahl', + MON: 'Mo', + TUE: 'Di', + WED: 'Mi', + THU: 'Do', + FRI: 'Fr', + SAT: 'Sa', + SUN: 'So', + Open: 'Geöffnet', + ACCEPTED: 'GEACCEPTEERD', + PENDING: 'IN AFWACHTING', + PICKED: 'GEKOZEN', + ASSIGNED: 'TOEGEWEZEN', + DELIVERED: 'BEZORGD', + REJECTED: 'AFGEWEZEN' + } +} + +export default de diff --git a/enatega-multivendor-admin/src/translations/en.js b/enatega-multivendor-admin/src/translations/en.js new file mode 100644 index 0000000..f97fbd7 --- /dev/null +++ b/enatega-multivendor-admin/src/translations/en.js @@ -0,0 +1,313 @@ +const en = { + translation: { + 'Sign in credentials': 'Sign in credentials', + 'Sign in': 'Sign in', + 'Add Category': 'Add Category', + Title: 'Title', + Description: 'Description', + Add: 'Add', + Remove: 'Remove', + 'Add/Remove': 'Add/Remove', + Success: 'Success', + Danger: 'Danger', + Categories: 'Categories', + Image: 'Image', + Header: 'Header', + Loading: 'Loading', + Error: 'Error', + Edit: 'Edit', + Delete: 'Delete', + 'Edit Category': 'Edit Category', + Save: 'Save', + 'OrderID prefix': 'OrderID prefix', + Order: 'Order', + Email: 'Email', + Password: 'Password', + Enable: 'Enable', + Disable: 'Disable', + 'Enable/Disable': 'Enable/Disable', + Saving: 'Saving', + Paypal: 'Paypal', + 'Client ID': 'Client ID', + 'Client Secret': 'Client Secret', + Sandbox: 'Sandbox', + 'Publishable Key': 'Publishable Key', + 'Secret Key': 'Secret Key', + 'Delivery Charges': 'Delivery Charges', + Price: 'Price', + 'Add Food': 'Add Food', + Category: 'Category', + Select: 'Select', + Variations: 'Variations', + Type: 'Type', + 'Food Image': 'Food Image', + Foods: 'Foods', + Actions: 'Actions', + 'Edit Food': 'Edit Food', + OrderID: 'OrderID', + Orders: 'Orders', + Name: 'Name', + Items: 'Items', + Payment: 'Payment', + Status: 'Status', + Review: 'Review', + 'Mark as': 'Mark as', + Users: 'Users', + Phone: 'Phone', + Address: 'Address', + 2019: '2019', + 'About Us': 'About Us', + Blog: 'Blog', + Welcome: 'Welcome', + Logout: 'Logout', + Dashboard: 'Dashboard', + Configuration: 'Configuration', + Login: 'Login', + Food: 'Food', + 'Character limit of max length 50': 'Character limit of max length 50', + 'Character limit of max length 15': 'Character limit of max length 15', + 'Character limit of max length 60': 'Character limit of max length 60', + 'Character limit of max length 20': 'Character limit of max length 20', + 'Character limit of max length 140': 'Character limit of max length 140', + Currency: 'Currency', + Delivery: 'Delivery', + 'Currency Code': 'Currency Code', + 'Delivery Rate': 'Delivery Rate', + 'Currency Symbol': 'Currency Symbol', + enterYourDetailsBelow: 'Enter your details below', + LogintoEnatega: 'Login to Enatega', + RememberMe: 'Remember me', + ForgotYourPassword: 'Forgot your password?', + errorWhileSaving: 'An error occured while saving,Try again', + Saved: 'Saved', + Addons: 'Addons', + AddRemoveAddon: 'Add or Remove Addon', + MinQuantity: 'Min quantity', + MinimumQuantity: 'Minimum Quantity', + MaxQuantity: 'Max quantity', + MaximumQuantity: 'Maximum quantity', + Options: 'Options', + NewOption: 'New Option', + CategoryUpdatedSuccessfully: 'Category updated successfully', + CategoryAddedSuccessfully: 'Category added successfully', + ActionFailedTryAgain: 'Action failed. Please Try again', + PHCategory: 'Category i.e Breakfast', + ChooseCurrency: 'Choose Currency', + ChooseSymbol: 'Choose Symbol', + PHMail: 'e.g something@email.com', + EmailName: 'Email Name', + PHEnatega: 'e.g Enatega', + PHFood: 'e.g FOOD', + ClientSecretKey: 'Client Secret Key', + Stripe: 'Stripe', + PublishKey: 'Publish Key', + CouponUpdated: 'Coupon updated', + CouponAdded: 'Coupon Added', + CuisineUpdated: 'Cuisine updated', + CuisineAdded: 'Cuisine Added', + Code: 'Code', + PHCode: 'Code e.g SALE50', + PHDiscount: 'Discount % i.e 1-99', + FoodUpdatedSuccessfully: 'Food updated successfully', + FoodAddedSuccessfully: 'Food added successfully', + SelectCategory: 'Select Category', + UploadAnImage: 'Upload an image', + UniqueTitle: 'Title (must be unique)', + Discounted: 'Discounted', + LoadingDots: 'Loading ...', + ErrorDots: 'Error ...', + NewAddon: 'New Addon', + EnategaMultivendor: 'Enatega Multivendor', + ResetPassword: 'Reset Password', + EnategaDashboard: 'Enatega Dashboard', + UpdateOption: 'Update Option', + AddOption: 'Add Option', + OrderStatusUpdated: 'Order status updated', + SpecialInstructions: 'Special Instructions', + Charges: 'Charges', + Subtotal: 'Subtotal', + DeliveryFee: 'Delivery Fee', + TaxCharges: 'Tax Charges', + Tip: 'Tip', + Total: 'Total', + PaymentMethod: 'Payment Method', + PaidAmount: 'PaidAmount', + Accepted: 'Accepted', + Accept: 'Accept', + Cancelled: 'Cancelled', + Cancel: 'Cancel', + PHReasonIfRejected: 'Reason if Rejected', + Datetime: 'Datetime', + PasswordChangedSuccessfully: 'Password Changed successfully', + ConfirmPassword: 'Confirm Password', + Reset: 'Reset', + RestaurantAdded: 'Restaurant added', + NetworkError: 'Network error', + FieldsRequired: 'Fields Required', + Username: 'Username', + RestaurantUsername: "Restaurant's username", + RestaurantPassword: "Restaurant's password", + RestaurantName: "Restaurant's name", + RestaurantAddress: "Restaurant's address", + DeliveryTime: 'Delivery Time', + MinOrder: 'Min Order', + SalesTax: 'Sales Tax', + RiderUpdatedSuccessfully: 'Rider updated successfully', + RiderAddedSuccessfully: 'Rider added successfully', + EditRider: 'Edit Rider', + UsernameCannotBeBlank: "Username can't be blank", + UsernameCannotContainSpaces: "Username can't contain spaces", + AddRider: 'Add Rider', + Available: 'Available', + PHRiderName: 'Rider name', + Number: 'Number', + PhoneNumber: 'Phone Number', + RiderZone: 'Rider Zone', + SectionUpdatedSuccessfully: 'Section updated successfully', + SectionAddedSuccessfully: 'Section added successfully', + EditSection: 'Edit Section', + AddSection: 'Add Section', + SectionName: 'Section Name', + Update: 'Update', + GENERAL: 'GENERAL', + MANAGEMENT: 'MANAGEMENT', + RESTAURANT: 'RESTAURANT', + BackToAdmin: 'Back to Admin', + Search: 'Search', + TippingUpdated: 'Tipping updated', + EditTipping: 'Edit Tipping', + AddTipping: 'Add Tipping', + Tip1: 'Tip 1', + Tip2: 'Tip 2', + Tip3: 'Tip 3', + PHTip1: 'Tip 1 e.g 10', + PHTip2: 'Tip 2 e.g 20', + PHTip3: 'Tip 3 e.g 30', + EditVendor: 'Edit Vendor', + AddVendor: 'Add Vendor', + PHNumber: 'e.g 123', + ZoneUpdatedSuccessfully: 'Zone updated successfully', + ZoneAddedSuccessfully: 'Zone added successfully', + SetZoneOnMap: 'Set Zone on Map', + EditZone: 'Edit Zone', + AddZone: 'Add Zone', + Minimum: 'Minimum', + Maximum: 'Maximum', + Action: 'Action', + AvailableAfterPurchasing: + 'This feature will available after purchasing product', + CommissionRates: 'Commission Rates', + PHCommission: 'Commission percent', + Discount: 'Discount', + Coupons: 'Coupons', + Cuisines: 'Cuisines', + StartDate: 'Start Date', + GraphFilter: 'Graph Filter', + EndDate: 'End Date', + Apply: 'Apply', + UpdatingLocationError: + 'An error occurred while updating location and bounds', + LocationMarkerRequired: 'Location marker is required', + DeliveryAreaRequired: 'Delivery area is required', + LocationUpdatedSuccessfully: 'Location and bounds updated successfully', + SetLocation: 'Set Location', + DrawDeliveryBounds: 'Draw Delivery Bounds', + SetRestaurantLocation: 'Set Restaurant Location', + RemoveDeliveryBounds: 'Remove Delivery Bounds', + RemoveRestaurantLocation: 'Remove Restaurant Location', + Reject: 'Reject', + Delivered: 'Delivered', + OrderInformation: 'Order Information', + RestaurantCol: 'Restaurant', + Rider: 'Rider', + OrderTime: 'Order time', + Dispatch: 'Dispatch', + PasswordUpdated: 'Password has been updated', + ForgotPassword: 'Forgot Password', + NotificationSentAuccessfully: 'Notification sent successfully', + Notifications: 'Notifications', + Body: 'Body', + Zones: 'Zones', + RequestID: 'Request ID', + Amount: 'Amount', + Date: 'Date', + REQUESTED: 'REQUESTED', + TRANSFERRED: 'TRANSFERRED', + CANCELLEDStatus: 'CANCELLED', + WithdrawRequests: 'Withdraw Requests', + TotalRestaurants: 'Total Restaurants', + Restaurants: 'Restaurants', + Vendors: 'Vendors', + RestaurantUpdatedSuccessfully: 'Restaurant updated successfully', + UpdateProfile: 'Update Profile', + PHRestaurantPassword: "Restaurant's password", + PHRestaurantName: "Restaurant's name", + PHRestaurantAddress: "Restaurant's address", + OrderPrefix: 'Order Prefix', + Days: 'Days', + OpenTimes: 'Open Times', + TimeSavedSuccessfully: 'Time saved successfully', + ErrorWhileSavingTime: 'Error while saving time', + SavingDots: 'Saving...', + January: 'January', + February: 'February', + March: 'March', + April: 'April', + May: 'May', + June: 'June', + July: 'July', + MainPageText: 'A cross-plalform software', + MainPageText1: + 'A full fledged solution highly suitable to build any restaurant.', + ViewSite: 'View Site', + TotalUsers: 'Total Users', + TotalVendors: 'Total Vendors', + TotalRiders: 'Total Riders', + RestaurantSections: 'Restaurant Sections', + ImageMenu: 'image menu', + Vendor: 'Vendor', + AddNewRestaurant: 'Add New Restaurant', + Ratings: 'Ratings', + StripeDetailsAttached: 'Stripe Details Attached', + EditStripeDetails: 'Edit Stripe details', + SubmitStripeDetails: 'Submit Stripe details', + 'Restaurant Sections': 'Restaurant Sections', + Riders: 'Riders', + Tipping: 'Tipping', + Zone: 'Zone', + 'Commission Rates': 'Commission Rates', + 'Withdraw Requests': 'Withdraw Requests', + Home: 'Home', + Profile: 'Profile', + Option: 'Option', + Timings: 'Timings', + Location: 'Location', + 'Back to Admin': 'Back to Admin', + TotalOrders: 'Total Orders', + TotalSales: 'Total Sales', + ClosedAllDay: 'Closed All Day', + AddRestaurant: 'Add Restaurant', + EditCoupon: 'Edit Coupon', + AddCoupon: 'Add Coupon', + EditCuisine: 'Edit Cuisine', + AddCuisine: 'Add Cuisine', + SalesAmount: 'Sales Amount', + OrderCount: 'Order Count', + MON: 'MON', + TUE: 'TUE', + WED: 'WED', + THU: 'THU', + FRI: 'FRI', + SAT: 'SAT', + SUN: 'SUN', + Open: 'Open', + ACCEPTED: 'ACCEPTED', + PENDING: 'PENDING', + PICKED: 'PICKED', + ASSIGNED: 'ASSIGNED', + DELIVERED: 'DELIVERED', + REJECTED: 'REJECTED' + } +} + +export default en diff --git a/enatega-multivendor-admin/src/translations/fr.js b/enatega-multivendor-admin/src/translations/fr.js new file mode 100644 index 0000000..26b2339 --- /dev/null +++ b/enatega-multivendor-admin/src/translations/fr.js @@ -0,0 +1,316 @@ +const fr = { + translation: { + 'Sign in credentials': 'Identifiez-vous', + 'Sign in': 'se connecter', + 'Add Category': 'ajouter une catégorie', + Title: 'Titre', + Description: 'La description', + Add: 'Ajouter', + Remove: 'Retirer', + 'Add/Remove': 'Ajouter enlever', + Success: 'Succès', + Danger: 'Danger', + Categories: 'Les catégories', + Image: 'Image', + Header: 'Entête', + Loading: 'Chargement', + Error: 'Erreur', + Edit: 'modifier', + Delete: 'Effacer', + 'Edit Category': 'Modifier la catégorie', + Save: 'sauvegarder', + 'OrderID prefix': 'Préfixe OrderID', + Order: 'Ordre', + Email: 'Email', + Password: 'Mot de passe', + Enable: 'Activer', + Disable: 'Désactiver', + 'Enable/Disable': 'Activer désactiver', + Saving: 'Économie', + Paypal: 'Pay Pal', + 'Client ID': 'identité du client', + 'Client Secret': 'Secret du client', + Sandbox: 'bac à sable', + 'Publishable Key': 'Clé publiable', + 'Secret Key': 'Clef secrète', + 'Delivery Charges': 'Frais de livraison', + Price: 'Prix', + 'Add Food': 'Ajouter de la nourriture', + Category: 'Catégorie', + Select: 'Sélectionner', + Variations: 'Variations', + Type: 'Type', + 'Food Image': 'Image de nourriture', + Foods: 'nourriture', + Actions: 'actes', + 'Edit Food': 'Modifier un aliment', + OrderID: 'Numéro de commande', + Orders: 'Ordres', + Name: 'prénom', + Items: 'Articles', + Payment: 'Paiement', + Status: 'Statut', + Review: 'La revue', + 'Mark as': 'Marquer comme', + Users: 'Utilisateurs', + Phone: 'Téléphone', + Address: 'Adresse', + 2019: '2019', + 'About Us': 'À propos de nous', + Blog: 'Blog', + Welcome: 'Bienvenue', + Logout: 'Connectez - Out', + Dashboard: 'Tableau de bord', + Configuration: 'Configuration', + Login: "S'identifier", + Food: 'Aliments', + 'Character limit of max length 50': + 'Limite de caractères de longueur maximale 50', + 'Character limit of max length 15': + 'Limite de caractères de longueur maximale 15', + 'Character limit of max length 60': + 'Limite de caractères de longueur maximale 60', + 'Character limit of max length 20': + 'Limite de caractères de longueur maximale 20', + 'Character limit of max length 140': + 'Limite de caractères de longueur maximale 140', + Currency: 'Devise', + Delivery: 'Livraison', + 'Currency Code': 'Code de devise', + 'Delivery Rate': 'Frais de livraison', + 'Currency Symbol': 'Symbole de devise', + enterYourDetailsBelow: 'Entrez vos détails ci-dessous', + LogintoEnatega: 'Connectez-vous à Enatega', + RememberMe: 'Souviens-toi de moi', + ForgotYourPassword: 'Mot de passe oublié ?', + errorWhileSaving: + "Une erreur s'est produite lors de l'enregistrement, réessayez", + Saved: 'Enregistré', + Addons: 'Modules complémentaires', + AddRemoveAddon: 'Ajouter ou supprimer un module complémentaire', + MinQuantity: 'Quantité minimale', + MinimumQuantity: 'Quantité minimale', + MaxQuantity: 'Quantité maximale', + MaximumQuantity: 'Quantité maximale', + Options: 'Options', + NewOption: 'Nouvelle option', + CategoryUpdatedSuccessfully: 'Catégorie mise à jour avec succès', + CategoryAddedSuccessfully: 'Catégorie ajoutée avec succès', + ActionFailedTryAgain: 'Action échouée. Veuillez réessayer', + PHCategory: 'Catégorie, par exemple le petit déjeuner', + ChooseCurrency: 'Choisissez la devise', + ChooseSymbol: 'Choisissez le symbole', + PHMail: 'par exemple quelquechose@email.com', + EmailName: "Nom de l'email", + PHEnatega: 'par exemple Enatega', + PHFood: 'par exemple NOURRITURE', + ClientSecretKey: 'Clé secrète du client', + Stripe: 'Stripe', + PublishKey: 'Clé de publication', + CouponUpdated: 'Coupon mis à jour', + CouponAdded: 'Coupon ajouté', + Code: 'Code', + PHCode: 'Code, par exemple SALE50', + PHDiscount: "Remise %, c'est-à-dire 1-99", + FoodUpdatedSuccessfully: 'Nourriture mise à jour avec succès', + FoodAddedSuccessfully: 'Nourriture ajoutée avec succès', + SelectCategory: 'Sélectionnez une catégorie', + UploadAnImage: 'Téléchargez une image', + UniqueTitle: 'Titre (doit être unique)', + Discounted: 'Remisé', + LoadingDots: 'Chargement...', + ErrorDots: 'Erreur...', + NewAddon: 'Nouveau module complémentaire', + EnategaMultivendor: 'Enatega Multivendor', + ResetPassword: 'Réinitialiser le mot de passe', + EnategaDashboard: 'Tableau de bord Enatega', + UpdateOption: "Mettre à jour l'option", + AddOption: 'Ajouter une option', + OrderStatusUpdated: 'Statut de la commande mis à jour', + SpecialInstructions: 'Instructions spéciales', + Charges: 'Frais', + Subtotal: 'Sous-total', + DeliveryFee: 'Frais de livraison', + TaxCharges: 'Frais de taxe', + Tip: 'Pourboire', + Total: 'Total', + PaymentMethod: 'Moyen de paiement', + PaidAmount: 'Montant payé', + Accepted: 'Acceptée', + Accept: 'Accepter', + Cancelled: 'Annulée', + Cancel: 'Annuler', + PHReasonIfRejected: 'Raison si rejetée', + Datetime: 'Date et heure', + PasswordChangedSuccessfully: 'Mot de passe changé avec succès', + ConfirmPassword: 'Confirmer le mot de passe', + Reset: 'Réinitialiser', + RestaurantAdded: 'Restaurant ajouté', + NetworkError: 'Erreur réseau', + FieldsRequired: 'Champs requis', + Username: "Nom d'utilisateur", + RestaurantUsername: "Nom d'utilisateur du restaurant", + RestaurantPassword: 'Mot de passe du restaurant', + RestaurantName: 'Nom du restaurant', + RestaurantAddress: 'Adresse du restaurant', + DeliveryTime: 'Temps de livraison', + MinOrder: 'Commande minimum', + SalesTax: 'Taxe de vente', + RiderUpdatedSuccessfully: 'Livreur mis à jour avec succès', + RiderAddedSuccessfully: 'Livreur ajouté avec succès', + UsernameCannotBeBlank: "Le nom d'utilisateur ne peut pas être vide", + UsernameCannotContainSpaces: + "Le nom d'utilisateur ne peut pas contenir d'espaces", + EditRider: 'Modifier le livreur', + AddRider: 'Ajouter un livreur', + Available: 'Disponible', + PHRiderName: 'Nom du livreur', + Number: 'Numéro', + PhoneNumber: 'Numéro de téléphone', + RiderZone: 'Zone du livreur', + SectionUpdatedSuccessfully: 'Section mise à jour avec succès', + SectionAddedSuccessfully: 'Section ajoutée avec succès', + EditSection: 'Modifier la section', + AddSection: 'Ajouter une section', + SectionName: 'Nom de la section', + Update: 'Mettre à jour', + GENERAL: 'GÉNÉRAL', + MANAGEMENT: 'GESTION', + RESTAURANT: 'RESTAURANT', + BackToAdmin: "Retour à l'administration", + Search: 'Recherche', + TippingUpdated: 'Pourboire mis à jour', + EditTipping: 'Modifier le pourboire', + AddTipping: 'Ajouter un pourboire', + Tip1: 'Pourboire 1', + Tip2: 'Pourboire 2', + Tip3: 'Pourboire 3', + PHTip1: 'Pourboire 1, par exemple 10', + PHTip2: 'Pourboire 2, par exemple 20', + PHTip3: 'Pourboire 3, par exemple 30', + EditVendor: 'Modifier le vendeur', + AddVendor: 'Ajouter un vendeur', + PHNumber: 'par exemple 123', + ZoneUpdatedSuccessfully: 'Zone mise à jour avec succès', + ZoneAddedSuccessfully: 'Zone ajoutée avec succès', + SetZoneOnMap: 'Définir la zone sur la carte', + EditZone: 'Modifier la zone', + AddZone: 'Ajouter une zone', + Minimum: 'Minimum', + Maximum: 'Maximum', + Action: 'Action', + AvailableAfterPurchasing: + "Cette fonctionnalité sera disponible après l'achat du produit", + CommissionRates: 'Taux de commission', + PHCommission: 'Pourcentage de commission', + Discount: 'Remise %', + Coupons: 'Coupons', + StartDate: 'Date de début', + GraphFilter: 'Filtre graphique', + EndDate: 'Date de fin', + Apply: 'Appliquer', + UpdatingLocationError: + "Une erreur s'est produite lors de la mise à jour de l'emplacement et des limites", + LocationMarkerRequired: "Le marqueur d'emplacement est requis", + DeliveryAreaRequired: 'La zone de livraison est requise', + LocationUpdatedSuccessfully: + 'Emplacement et limites mis à jour avec succès', + SetLocation: "Définir l'emplacement", + DrawDeliveryBounds: 'Dessiner les limites de livraison', + SetRestaurantLocation: "Définir l'emplacement du restaurant", + RemoveDeliveryBounds: 'Supprimer les limites de livraison', + RemoveRestaurantLocation: "Supprimer l'emplacement du restaurant", + Reject: 'Rejeter', + Delivered: 'Livré', + OrderInformation: 'Informations sur la commande', + RestaurantCol: 'Restaurant', + Rider: 'Livreur', + OrderTime: 'Heure de commande', + Dispatch: 'Expédition', + PasswordUpdated: 'Mot de passe mis à jour', + ForgotPassword: 'Mot de passe oublié', + NotificationSentAuccessfully: 'Notification envoyée avec succès', + Notifications: 'Notifications', + Body: 'Corps', + Zones: 'Zones', + RequestID: 'ID de demande', + Amount: 'Montant', + Date: 'Date', + REQUESTED: 'DEMANDÉ', + TRANSFERRED: 'TRANSFÉRÉ', + CANCELLEDStatus: 'ANNULÉE', + WithdrawRequests: 'Demandes de retrait', + TotalRestaurants: 'Total des restaurants', + Restaurants: 'Restaurants', + Vendors: 'Vendeurs', + RestaurantUpdatedSuccessfully: 'Restaurant mis à jour avec succès', + UpdateProfile: 'Mettre à jour le profil', + PHRestaurantPassword: 'Mot de passe du restaurant', + PHRestaurantName: 'Nom du restaurant', + PHRestaurantAddress: 'Adresse du restaurant', + OrderPrefix: 'Préfixe de commande', + Days: 'Jours', + OpenTimes: "Heures d'ouverture", + TimeSavedSuccessfully: 'Heure sauvegardée avec succès', + ErrorWhileSavingTime: "Erreur lors de la sauvegarde de l'heure", + SavingDots: 'Enregistrement...', + January: 'Janvier', + February: 'Février', + March: 'Mars', + April: 'Avril', + May: 'Mai', + June: 'Juin', + July: 'Juillet', + MainPageText: 'Un logiciel multiplateforme', + MainPageText1: + "Une solution complète parfaitement adaptée pour construire n'importe quel restaurant.", + ViewSite: 'Voir le site', + TotalUsers: 'Utilisateurs totaux', + TotalVendors: 'Vendeurs totaux', + TotalRiders: 'Livreurs totaux', + RestaurantSections: 'Sections du restaurant', + ImageMenu: 'Menu image', + Vendor: 'Vendeur', + AddNewRestaurant: 'Ajouter un nouveau restaurant', + Ratings: 'Évaluations', + StripeDetailsAttached: 'Détails Stripe attachés', + EditStripeDetails: 'Modifier les détails Stripe', + SubmitStripeDetails: 'Soumettre les détails Stripe', + 'Restaurant Sections': 'Sections du restaurant', + Riders: 'Cavaliers', + Tipping: 'Pourboire', + Zone: 'Zone', + 'Commission Rates': 'Taux de commission', + 'Withdraw Requests': 'Demandes de retrait', + Home: 'Accueil', + Profile: 'Profil', + Option: 'Option', + Timings: 'Horaires', + Location: 'Emplacement', + 'Back to Admin': "Retour à l'administration", + TotalOrders: 'Total des commandes', + TotalSales: 'Total des ventes', + ClosedAllDay: 'Fermé toute la journée', + AddRestaurant: 'Ajouter un restaurant', + EditCoupon: 'Modifier le coupon', + AddCoupon: 'Ajouter un coupon', + SalesAmount: 'Montant des ventes', + OrderCount: 'Nombre de commandes', + MON: 'Lun', + TUE: 'Mar', + WED: 'Mer', + THU: 'Jeu', + FRI: 'Ven', + SAT: 'Sam', + SUN: 'Dim', + Open: 'Ouvert', + ACCEPTED: 'ACCEPTÉ', + PENDING: 'EN ATTENTE', + PICKED: 'CHOISI', + ASSIGNED: 'ATTRIBUÉ', + DELIVERED: 'LIVRÉ', + REJECTED: 'REJETÉ' + } +} + +export default fr diff --git a/enatega-multivendor-admin/src/translations/km.js b/enatega-multivendor-admin/src/translations/km.js new file mode 100644 index 0000000..5005274 --- /dev/null +++ b/enatega-multivendor-admin/src/translations/km.js @@ -0,0 +1,308 @@ +const km = { + translation: { + 'Sign in credentials': 'ចូលព័ត៌មានអត្តសញ្ញាណ', + 'Sign in': 'ចូល', + 'Add Category': 'បន្ថែមប្រភេទ', + Title: 'ចំណងជើង', + Description: 'ការពិពណ៌នា', + Add: 'បន្ថែម', + Remove: 'យកចេញ', + 'Add/Remove': 'បន្ថែម / យកចេញ', + Success: 'ជោគជ័យ', + Danger: 'គ្រោះថ្នាក់', + Categories: 'ប្រភេទ', + Image: 'រូបភាព', + Header: 'បឋមកថា', + Loading: 'កំពុងផ្ទុក', + Error: 'កំហុស', + Edit: 'កែប្រែ', + Delete: 'លុប', + 'Edit Category': 'កែសម្រួលប្រភេទ', + Save: 'រក្សាទុក', + 'OrderID prefix': 'បុព្វបទ ID លំដាប់', + Order: 'លំដាប់', + Email: 'អ៊ីមែល', + Password: 'ពាក្យសម្ងាត់', + Enable: 'អនុញ្ញាត', + Disable: 'បិទ', + 'Enable/Disable': 'អនុញ្ញាត / មិនអនុញ្ញាត', + Saving: 'កំពុងរក្សាទុក', + Paypal: 'Paypal', + 'Client ID': 'លេខសម្គាល់អតិថិជន', + 'Client Secret': 'អតិថិជនសម្ងាត់', + Sandbox: 'Sandbox', + 'Publishable Key': 'កូនសៀវភៅបោះពុម្ព', + 'Secret Key': 'កូនសៀវភៅបោះពុម្ព', + 'Delivery Charges': 'ការដឹកជញ្ជូន', + Price: 'តម្លៃ', + 'Add Food': 'បន្ថែមអាហារ', + Category: 'ប្រភេទ', + Select: 'ជ្រើសរើស', + Variations: 'បំរែបំរួល', + Type: 'វាយ', + 'Food Image': 'រូបភាពអាហារ', + Foods: 'អាហារ', + Actions: 'សកម្មភាព', + 'Edit Food': 'កែសម្រួលអាហារ', + OrderID: 'លេខ​សម្គាល់​លំដាប់', + Orders: 'ការបញ្ជាទិញ', + Name: 'ឈ្មោះ', + Items: 'ធាតុ', + Payment: 'ការទូទាត់', + Status: 'ស្ថានភាព', + Review: 'ពិនិត្យឡើងវិញ', + 'Mark as': 'សម្គាល់ថា', + Users: 'អ្នកប្រើ', + Phone: 'ទូរស័ព្ទ', + Address: 'អាសយដ្ឋាន', + 2019: 'ពីរ​ពាន់​ដប់​ប្រាំបួន', + 'About Us': 'អំពី​ពួក​យើង', + Blog: 'កំណត់ហេតុបណ្ដាញ', + Welcome: 'ស្វាគមន៍', + Logout: 'ចាកចេញ', + Dashboard: 'ផ្ទាំងគ្រប់គ្រង', + Configuration: 'ការកំណត់​រចនាសម្ព័ន្ធ', + Login: 'ចូល', + Food: 'អាហារ', + 'Character limit of max length 50': 'ដែនកំណត់តួអក្សរនៃប្រវែងអតិបរមា 50', + 'Character limit of max length 15': 'ដែនកំណត់តួអក្សរនៃប្រវែងអតិបរមា 15', + 'Character limit of max length 60': 'ដែនកំណត់តួអក្សរនៃប្រវែងអតិបរមា 60', + 'Character limit of max length 20': 'ដែនកំណត់តួអក្សរនៃប្រវែងអតិបរមា 20', + 'Character limit of max length 140': 'ដែនកំណត់តួអក្សរនៃប្រវែងអតិបរមា 140', + Currency: 'រូបិយប័ណ្ណ', + Delivery: 'បញ្ជូន', + 'Currency Code': 'កូដរូបិយប័ណ្ណ', + 'Delivery Rate': 'អត្រាបញ្ជូន', + 'Currency Symbol': 'និមិត្តសញ្ញារូបិយប័ណ្ណ', + enterYourDetailsBelow: 'បញ្ចូលពត៌មានរបស់អ្នកខាងក្រោម', + LogintoEnatega: 'ចូលទៅកាន់ Enatega', + RememberMe: 'ចងចាំខ្ញុំ', + ForgotYourPassword: 'ភ្លេចពាក្យសម្ងាត់របស់អ្នក?', + errorWhileSaving: 'កំហុសបានកើតឡើងនៅពេលកំពុងរក្សាទុក, ព្យាយាមម្តងទៀត', + Saved: 'បានរក្សាទុក', + Addons: 'បន្ថែមមកកាន់', + AddRemoveAddon: 'បន្ថែម ឬ ដកចេញសម្រាប់ Addon', + MinQuantity: 'បរិមាណអប្បប', + MinimumQuantity: 'បរិមាណអប្បបនៃអនុសាសន៍', + MaxQuantity: 'បរិមាណអតិបរិមា', + MaximumQuantity: 'បរិមាណអតិបរិមានៃអនុសាសន៍', + Options: 'ជម្រើស', + NewOption: 'ជម្រើសថ្មី', + CategoryUpdatedSuccessfully: 'បានធ្វើបច្ចុប្បន្នភាពប្រភេទដោយជោគជ័យ', + CategoryAddedSuccessfully: 'បានបន្ថែមប្រភេទដោយជោគជ័យ', + ActionFailedTryAgain: 'សកម្មភាពបានបរាជ័យ។ សូមព្យាយាមម្តងទៀត', + PHCategory: 'ប្រភេទ ឧ. ព៌សាប្រាំថ្ងៃ', + ChooseCurrency: 'ជ្រើសរើសរូបិយប័ណ្ណ', + ChooseSymbol: 'ជ្រើសរើសនិមិត្តសញ្ញារូបិយប័ណ្ណ', + PHMail: 'ឧ. ស្មតស្រលាញ់@ឧ. គេហទំព័រ. លំអិត', + EmailName: 'ឈ្មោះអ៊ីមែល', + PHEnatega: 'ឧ. ស្មតហោះ', + PHFood: 'ឧ. ស្មតម្ហូប', + ClientSecretKey: 'សំងាត់អក្សរសុវត្ថិភាពអតិថិជន', + Stripe: 'ស្ទ្រីព៍', + PublishKey: 'កូនិស្តាកម្មសុវត្ថិភាព', + CouponUpdated: 'បានធ្វើបច្ចុប្បន្នភាពគូប៉ុង', + CouponAdded: 'បានបន្ថែមគូប៉ុង', + Code: 'កូដ', + PHCode: 'កូដ ឧ. គេហទំព័រ SALE50', + PHDiscount: 'បញ្ចុះតម្លៃ % ឧ. ១-៩៩', + FoodUpdatedSuccessfully: 'បានធ្វើបច្ចុប្បន្នភាពម្ហូប', + FoodAddedSuccessfully: 'បានបន្ថែមម្ហូប', + SelectCategory: 'ជ្រើសរើសប្រភេទ', + UploadAnImage: 'ផ្ទុករូបភាព', + UniqueTitle: 'ចំណងជើង (ត្រូវតែមានតែមួយ)', + Discounted: 'បញ្ចុះតម្លៃ', + LoadingDots: 'កំពុងផ្ទុក ...', + ErrorDots: 'កំហុស ...', + NewAddon: 'គ្រប់គ្រងធាតុបន្ថែមថ្មី', + EnategaMultivendor: 'Enatega ម៉ាល់ទ័រពុទ្ធកម្ម', + ResetPassword: 'កំណត់រង្វាន់ឡើងវិញ', + EnategaDashboard: 'ផ្ទៃតាប្រើប្រាស់ Enatega', + UpdateOption: 'ធ្វើបច្ចុប្បន្នភាពជម្រើស', + AddOption: 'បន្ថែមជម្រើស', + OrderStatusUpdated: 'កំណត់ស្ថានភាពកម្មង់ទាន់សម័យ', + SpecialInstructions: 'ការបញ្ជាក់ពិសេស', + Charges: 'ថ្លៃដើម្បីប្រើ', + Subtotal: 'សរុបរង', + DeliveryFee: 'ថ្លៃបញ្ជូន', + TaxCharges: 'ថ្លៃពន្ធបញ្ចូល', + Tip: 'ប្រាក់ឥវ៉ាន់', + Total: 'សរុប', + PaymentMethod: 'វិធីសាស្រ្តទូទាត់', + PaidAmount: 'ចំនួនទូទាត់', + Accepted: 'បានទទួលយក', + Accept: 'ទទួលយក', + Cancelled: 'បានបោះបង់', + Cancel: 'បោះបង់', + PHReasonIfRejected: 'ហេតុសំខាន់ប្រសើរបើលទុកចោល', + Datetime: 'ព័ត៌មានកាលបរិច្ឆេទ', + PasswordChangedSuccessfully: 'ប្តូរលេខសម្ងាត់ដោយជោគជ័យ', + ConfirmPassword: 'បញ្ជាក់ពាក្យសម្ងាត់', + Reset: 'កំណត់ឡើងវិញ', + RestaurantAdded: 'បានបន្ថែមភោជនីយដ្ឋាន', + NetworkError: 'កំហុសបណ្តាញ', + FieldsRequired: 'តម្រូវឱ្យបំពេញវាល', + Username: 'ឈ្មោះអ្នកប្រើ', + RestaurantUsername: 'ឈ្មោះអ្នកប្រើភោជនីយដ្ឋាន', + RestaurantPassword: 'ពាក្យសម្ងាត់ភោជនីយដ្ឋាន', + RestaurantName: 'ឈ្មោះភោជនីយដ្ឋាន', + RestaurantAddress: 'អាសយដ្ឋានភោជនីយដ្ឋាន', + DeliveryTime: 'ពេលវេលាដឹកជញ្ជូន', + MinOrder: 'ការកម្មង់អបអរ', + SalesTax: 'ពន្ធលក់', + RiderUpdatedSuccessfully: 'ជូនដំណឹងតាមលំដាប់', + RiderAddedSuccessfully: 'ជូនដំណឹងតាមលំដាប់បានបន្ថែមដោយជោគជ័យ', + UsernameCannotBeBlank: 'ឈ្មោះអ្នកប្រើមិនអាចទទេបានទេ។', + UsernameCannotContainSpaces: 'ឈ្មោះអ្នកប្រើមិនអាចមានដកឃ្លាបានទេ។', + EditRider: 'កែប្រែជូនដំណឹង', + AddRider: 'បន្ថែមជូនដំណឹង', + Available: 'មាន', + PHRiderName: 'ឈ្មោះជូនដំណឹង', + Number: 'លេខ', + PhoneNumber: 'លេខទូរស័ព្ទ', + RiderZone: 'តំបន់ជូនដំណឹង', + SectionUpdatedSuccessfully: 'កែប្រែបែបបទជំនាញដោយជោគជ័យ', + SectionAddedSuccessfully: 'បានបន្ថែមបែបបទដោយជោគជ័យ', + EditSection: 'កែប្រែបែបបទ', + AddSection: 'បន្ថែមបែបបទ', + SectionName: 'ឈ្មោះបែបបទ', + Update: 'ធ្វើបច្ចុប្បន្នភាព', + GENERAL: 'ទូទៅ', + MANAGEMENT: 'គ្រប់គ្រង', + RESTAURANT: 'ភោជនីយដ្ឋាន', + BackToAdmin: 'ត្រឡប់ទៅកាន់អនុគមន៏', + Search: 'ស្វែងរក', + TippingUpdated: 'ការធ្វើដំណើរការទាមទារត្រូវបានធ្វើអោយទាន់សម័យ', + EditTipping: 'កែប្រែការធ្វើដំណើរ', + AddTipping: 'បន្ថែមការធ្វើដំណើរ', + Tip1: 'ការធ្វើដំណើរ 1', + Tip2: 'ការធ្វើដំណើរ 2', + Tip3: 'ការធ្វើដំណើរ 3', + PHTip1: 'ការធ្វើដំណើរ 1 ឧទាហរណ៍ 10', + PHTip2: 'ការធ្វើដំណើរ 2 ឧទាហរណ៍ 20', + PHTip3: 'ការធ្វើដំណើរ 3 ឧទាហរណ៍ 30', + EditVendor: 'កែប្រែអ្នកលក់', + AddVendor: 'បន្ថែមអ្នកលក់', + PHNumber: 'ឧទាហរណ៍ 123', + ZoneUpdatedSuccessfully: 'តំបន់ត្រូវបានធ្វើបច្ចុប្បន្នភាព', + ZoneAddedSuccessfully: 'តំបន់បន្ថែមបានជោគជ័យ', + SetZoneOnMap: 'ដាក់តំបន់នៅលើផែនទី', + EditZone: 'កែប្រែតំបន់', + AddZone: 'បន្ថែមតំបន់', + Minimum: 'អប្បបរមា', + Maximum: 'អតិបរមា', + Action: 'សកម្មភាព', + AvailableAfterPurchasing: 'លក់ពេលដែលបានទិញផលិតផល', + CommissionRates: 'អត្រាការចំណាយ', + PHCommission: 'អត្រាការចំណាយឧទាហរណ៍', + Discount: 'បញ្ចុះតម្លៃ', + Coupons: 'គូប៉ុង', + StartDate: 'ថ្ងៃចាប់ផ្តើម', + GraphFilter: 'ត្រង្គល់តុ', + EndDate: 'ថ្ងៃបញ្ចប់', + Apply: 'អនុវត្ត', + UpdatingLocationError: + 'មានកំហុសពេលកំពុងធ្វើបច្ចុប្បន្នភាពទីតាំងនិងដែនតម្លៃ', + LocationMarkerRequired: 'ត្រូវការសញ្ញាទីតាំង', + DeliveryAreaRequired: 'ត្រូវការតំបន់ដឹកជញ្ជូន', + LocationUpdatedSuccessfully: + 'ទីតាំងនិងដែនតម្លៃបានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ', + SetLocation: 'ដាក់ទីតាំង', + DrawDeliveryBounds: 'គូរដែនដឹកជញ្ជូន', + SetRestaurantLocation: 'ដាក់ទីតាំងហាងនៅលើផែនទី', + RemoveDeliveryBounds: 'ដកដែនដឹកជញ្ជូន', + RemoveRestaurantLocation: 'ដកទីតាំងហាង', + Reject: 'បដិសេធទំនិញ', + Delivered: 'បញ្ជូនរួច', + OrderInformation: 'ព័ត៌មានការកុម្មង់', + RestaurantCol: 'ហាងនៅលើផែនទី', + Rider: 'អ្នកបើកបរ', + OrderTime: 'ព័ត៌មានការកុម្មង់', + Dispatch: 'បញ្ជូន', + PasswordUpdated: 'ពាក្យសម្ងាត់បានធ្វើបច្ចុប្បន្នភាព', + ForgotPassword: 'ភ្លេចពាក្យសម្ងាត់', + NotificationSentAuccessfully: 'ការជូនដំណឹងបានបញ្ចូលដោយជោគជ័យ', + Notifications: 'ការជូនដំណឹង', + Body: 'តួនាទី', + Zones: 'តំបន់', + RequestID: 'សូមបញ្ជាក់លេខសម្គាល់', + Amount: 'ចំនួន', + Date: 'កាលបរិច្ឆេទ', + REQUESTED: 'បានស្នើសុំ', + TRANSFERRED: 'បានបញ្ជូន', + CANCELLEDStatus: 'ស្ថានភាពបានលុប', + WithdrawRequests: 'សំណើសុំដកប្រាក់', + TotalRestaurants: 'ចំនួនសំុក', + Restaurants: 'សំុក', + Vendors: 'អ្នកលក់', + RestaurantUpdatedSuccessfully: + 'ការធ្វើបច្ចុប្បន្នភាពកំណត់ហេតុរបស់សំុកបានបន្ថែមដោយជោគជ័យ', + UpdateProfile: 'ធ្វើបច្ចុប្បន្នភាពទម្រង់', + PHRestaurantPassword: 'ពាក្យសម្ងាត់សំុក', + PHRestaurantName: 'ឈ្មោះសំុក', + PHRestaurantAddress: 'អាសយដ្ឋានសំុក', + OrderPrefix: 'បុព្វបទបញ្ជាពន្ធ', + Days: 'ថ្ងៃ', + OpenTimes: 'ម៉ោងបើក', + TimeSavedSuccessfully: 'បានរក្សារទុកពេលដែលជោគជ័យ', + ErrorWhileSavingTime: 'មានកំហុសពេលរក្សារទុកពេល', + SavingDots: 'កំពុងរក្សារទុក...', + January: 'មករា', + February: 'កុម្ភៈ', + March: 'មីនា', + April: 'មេសា', + May: 'ឧសភា', + June: 'មិថុនា', + July: 'កក្កដា', + MainPageText: 'កម្មវិធីសំរាប់ប្រព័ន្ធកុំព្យូទ័រ', + MainPageText1: 'ប្រព័ន្ធមួយដែលមានសំរាប់ទើបអាចតាមដានសំរាប់សំុកណាមួយ។', + ViewSite: 'មើលទំព័រ', + TotalUsers: 'សរុបអ្នកប្រើប្រាស់', + TotalVendors: 'សរុបអ្នកលក់', + TotalRiders: 'សរុបអ្នកជើងលើ', + RestaurantSections: 'ផ្នែកសំុក', + ImageMenu: 'ម៉ឺនុយរូប', + Vendor: 'អ្នកលក់', + AddNewRestaurant: 'បន្ថែមសំុកថ្មី', + Ratings: 'ការវាយតម្លៃ', + StripeDetailsAttached: 'លម្អិតព័ត៌មាន Stripe', + EditStripeDetails: 'កែសម្រួលព័ត៌មាន Stripe', + SubmitStripeDetails: 'ដាក់ពាក្យសម្ងាត់ព័ត៌មាន Stripe', + 'Restaurant Sections': 'ផ្នែកសំុក', + Riders: 'អ្នកជើងលើ', + Tipping: 'បង់ជូនរថយន្ត', + Zone: 'តំបន់', + 'Commission Rates': 'អត្ថបទនៃការរួមបញ្ចូល', + 'Withdraw Requests': 'សំណើសុំដកប្រាក់', + Home: 'ទំព័រដើម', + Profile: 'ទម្រង់', + Option: 'ជម្រើស', + Timings: 'ពេលវេលា', + Location: 'ទីតាំង', + 'Back to Admin': 'ត្រឡប់ទៅអគ្គនាយក', + TotalOrders: 'សរុបការបញ្ជាទិញ', + TotalSales: 'សរុបការលក់', + ClosedAllDay: 'បានបិទជុំវិញរបស់ថ្ងៃ', + AddRestaurant: 'បន្ថែមសំុក', + EditCoupon: 'កែសម្រួលការបញ្ជារបស់អ្នក', + AddCoupon: 'បន្ថែមការបញ្ជារបស់អ្នក', + SalesAmount: 'ចំនួនលក់', + OrderCount: 'ចំនួនការបញ្ជាទិញ', + MON: 'ច័ន្ទ', + TUE: 'អង្គារ', + WED: 'ពុធ', + THU: 'ព្រហស្បត់', + FRI: 'សុក្រ', + SAT: 'សៅរ៍', + SUN: 'អាទិត្យ', + Open: 'បើក', + ACCEPTED: 'ត្រូវបានទទួលយក', + PENDING: 'កំពុងរងចាំ', + PICKED: 'ត្រូវបានជ្រើសរើស', + ASSIGNED: 'ត្រូវបានផ្ដល់បន្ថែម', + DELIVERED: 'ត្រូវបានដឹកជញ្ជូន', + REJECTED: 'ត្រូវបានបដិសេធចោល' + } +} + +export default km diff --git a/enatega-multivendor-admin/src/translations/zh.js b/enatega-multivendor-admin/src/translations/zh.js new file mode 100644 index 0000000..60007f9 --- /dev/null +++ b/enatega-multivendor-admin/src/translations/zh.js @@ -0,0 +1,304 @@ +const zh = { + translation: { + 'Sign in credentials': '登录凭据', + 'Sign in': '登入', + 'Add Category': '添加类别', + Title: '标题', + Description: '描述', + Add: '加', + Remove: '去掉', + 'Add/Remove': '添加/删除', + Success: '成功', + Danger: '危险', + Categories: '分类', + Image: '图片', + Header: '头', + Loading: '载入中', + Error: '错误', + Edit: '编辑', + Delete: '删除', + 'Edit Category': '编辑类别', + Save: '保存', + 'OrderID prefix': '订单ID前缀', + Order: '订购', + Email: '电子邮件', + Password: '密码', + Enable: '启用', + Disable: '禁用', + 'Enable/Disable': '启用/禁用', + Saving: '保存', + Paypal: '贝宝', + 'Client ID': '客户ID', + 'Client Secret': '客户秘密', + Sandbox: '砂箱', + 'Publishable Key': '可发布的密钥', + 'Secret Key': '密钥', + 'Delivery Charges': '送货费', + Price: '价钱', + 'Add Food': '添加食物', + Category: '类别', + Select: '选择', + Variations: '变化', + Type: '类型', + 'Food Image': '食物形象', + Foods: '食品', + Actions: '操作', + 'Edit Food': '编辑食物', + OrderID: '订单ID', + Orders: '命令', + Name: '名称', + Items: '项目', + Payment: '付款', + Status: '状态', + Review: '评论', + 'Mark as': '标记为', + Users: '用户', + Phone: '电话', + Address: '地址', + 2019: '2019', + 'About Us': '关于我们', + Blog: '博客', + Welcome: '欢迎', + Logout: '登出', + Dashboard: '仪表板', + Configuration: '组态', + Login: '登录', + Food: '餐饮', + 'Character limit of max length 50': '最大长度50的字符限制', + 'Character limit of max length 15': '最大长度15的字符限制', + 'Character limit of max length 60': '最大长度60的字符限制', + 'Character limit of max length 20': '最大长度20的字符限制', + 'Character limit of max length 140': '最大长度的字符限制140', + Currency: '货币', + Delivery: '送货', + 'Currency Code': '货币代码', + 'Delivery Rate': '送货费率', + 'Currency Symbol': '货币符号', + enterYourDetailsBelow: '在下面输入您的详细信息', + LogintoEnatega: '登录到Enatega', + RememberMe: '记住我', + ForgotYourPassword: '忘记密码?', + errorWhileSaving: '保存时出现错误,请重试', + Saved: '已保存', + Addons: '附加组件', + AddRemoveAddon: '添加或删除插件', + MinQuantity: '最小数量', + MinimumQuantity: '最小数量', + MaxQuantity: '最大数量', + MaximumQuantity: '最大数量', + Options: '选项', + NewOption: '新选项', + CategoryUpdatedSuccessfully: '类别成功更新', + CategoryAddedSuccessfully: '类别添加成功', + ActionFailedTryAgain: '操作失败,请重试', + PHCategory: '类别,例如早餐', + ChooseCurrency: '选择货币', + ChooseSymbol: '选择符号', + PHMail: '例如something@email.com', + EmailName: '电子邮件名称', + PHEnatega: '例如Enatega', + PHFood: '例如FOOD', + ClientSecretKey: '客户端秘钥', + Stripe: '条纹', + PublishKey: '发布密钥', + CouponUpdated: '优惠券已更新', + CouponAdded: '已添加优惠券', + Code: '代码', + PHCode: '例如SALE50的代码', + PHDiscount: '折扣百分比,即1-99', + FoodUpdatedSuccessfully: '食品成功更新', + FoodAddedSuccessfully: '食品成功添加', + SelectCategory: '选择类别', + UploadAnImage: '上传图片', + UniqueTitle: '标题(必须唯一)', + Discounted: '打折', + LoadingDots: '加载中...', + ErrorDots: '错误...', + NewAddon: '新插件', + EnategaMultivendor: 'Enatega 多供应商', + ResetPassword: '重置密码', + EnategaDashboard: 'Enatega 仪表板', + UpdateOption: '更新选项', + AddOption: '添加选项', + OrderStatusUpdated: '订单状态已更新', + SpecialInstructions: '特殊说明', + Charges: '费用', + Subtotal: '小计', + DeliveryFee: '运费', + TaxCharges: '税费', + Tip: '小费', + Total: '总计', + PaymentMethod: '支付方式', + PaidAmount: '已支付金额', + Accepted: '已接受', + Accept: '接受', + Cancelled: '已取消', + Cancel: '取消', + PHReasonIfRejected: '拒绝原因', + Datetime: '日期时间', + PasswordChangedSuccessfully: '密码已成功更改', + ConfirmPassword: '确认密码', + Reset: '重置', + RestaurantAdded: '餐厅已添加', + NetworkError: '网络错误', + FieldsRequired: '必填字段', + Username: '用户名', + RestaurantUsername: '餐厅用户名', + RestaurantPassword: '餐厅密码', + RestaurantName: '餐厅名称', + RestaurantAddress: '餐厅地址', + DeliveryTime: '送货时间', + MinOrder: '最低订单金额', + SalesTax: '销售税', + RiderUpdatedSuccessfully: '骑手已成功更新', + RiderAddedSuccessfully: '骑手已成功添加', + UsernameCannotBeBlank: '用户名不能为空', + UsernameCannotContainSpaces: '用户名不能包含空格', + EditRider: '编辑骑手', + AddRider: '添加骑手', + Available: '可用', + PHRiderName: '骑手姓名', + Number: '号码', + PhoneNumber: '电话号码', + RiderZone: '骑手区域', + SectionUpdatedSuccessfully: '部分已成功更新', + SectionAddedSuccessfully: '部分已成功添加', + EditSection: '编辑部分', + AddSection: '添加部分', + SectionName: '部分名称', + Update: '更新', + GENERAL: '常规', + MANAGEMENT: '管理', + RESTAURANT: '餐厅', + BackToAdmin: '返回管理员', + Search: '搜索', + TippingUpdated: '小费已更新', + EditTipping: '编辑小费', + AddTipping: '添加小费', + Tip1: '小费 1', + Tip2: '小费 2', + Tip3: '小费 3', + PHTip1: '小费 1,例如 10', + PHTip2: '小费 2,例如 20', + PHTip3: '小费 3,例如 30', + EditVendor: '编辑供应商', + AddVendor: '添加供应商', + PHNumber: '例如 123', + ZoneUpdatedSuccessfully: '区域已成功更新', + ZoneAddedSuccessfully: '区域已成功添加', + SetZoneOnMap: '在地图上设置区域', + EditZone: '编辑区域', + AddZone: '添加区域', + Minimum: '最小值', + Maximum: '最大值', + Action: '操作', + AvailableAfterPurchasing: '此功能将在购买产品后可用', + CommissionRates: '佣金率', + PHCommission: '佣金百分比', + Discount: '折扣', + Coupons: '优惠券', + StartDate: '开始日期', + GraphFilter: '图表筛选', + EndDate: '结束日期', + Apply: '应用', + UpdatingLocationError: '更新位置和边界时发生错误', + LocationMarkerRequired: '需要位置标记', + DeliveryAreaRequired: '需要交付区域', + LocationUpdatedSuccessfully: '位置和边界已成功更新', + SetLocation: '设置位置', + DrawDeliveryBounds: '绘制交付边界', + SetRestaurantLocation: '设置餐厅位置', + RemoveDeliveryBounds: '删除交付边界', + RemoveRestaurantLocation: '删除餐厅位置', + Reject: '拒绝', + Delivered: '已交付', + OrderInformation: '订单信息', + RestaurantCol: '餐厅', + Rider: '骑手', + OrderTime: '订单时间', + Dispatch: '派送', + PasswordUpdated: '密码已更新', + ForgotPassword: '忘记密码', + NotificationSentAuccessfully: '通知发送成功', + Notifications: '通知', + Body: '内容', + Zones: '区域', + RequestID: '请求 ID', + Amount: '金额', + Date: '日期', + REQUESTED: '请求中', + TRANSFERRED: '已转账', + CANCELLEDStatus: '已取消', + WithdrawRequests: '提款请求', + TotalRestaurants: '总餐厅', + Restaurants: '餐厅', + Vendors: '商家', + RestaurantUpdatedSuccessfully: '餐厅更新成功', + UpdateProfile: '更新个人资料', + PHRestaurantPassword: '餐馆密码', + PHRestaurantName: '餐馆名称', + PHRestaurantAddress: '餐馆地址', + OrderPrefix: '订单前缀', + Days: '天', + OpenTimes: '开放时间', + TimeSavedSuccessfully: '时间保存成功', + ErrorWhileSavingTime: '保存时间时出错', + SavingDots: '保存中...', + January: '一月', + February: '二月', + March: '三月', + April: '四月', + May: '五月', + June: '六月', + July: '七月', + MainPageText: '一个跨平台软件', + MainPageText1: '一个功能齐全的解决方案,非常适合构建任何餐厅。', + ViewSite: '查看网站', + TotalUsers: '总用户', + TotalVendors: '总商家', + TotalRiders: '总骑手', + RestaurantSections: '餐厅部分', + ImageMenu: '图片菜单', + Vendor: '商家', + AddNewRestaurant: '新增餐厅', + Ratings: '评分', + StripeDetailsAttached: 'Stripe 详细信息已附加', + EditStripeDetails: '编辑 Stripe 详细信息', + SubmitStripeDetails: '提交 Stripe 详细信息', + 'Restaurant Sections': '餐厅部分', + Riders: '骑手', + Tipping: '小费', + Zone: '区域', + 'Commission Rates': '佣金率', + 'Withdraw Requests': '提款请求', + Home: '首页', + Profile: '个人资料', + Option: '选项', + Timings: '时间', + Location: '位置', + 'Back to Admin': '返回管理', + TotalOrders: '总订单', + TotalSales: '总销售额', + ClosedAllDay: '全天关闭', + AddRestaurant: '添加餐厅', + EditCoupon: '编辑优惠券', + AddCoupon: '添加优惠券', + SalesAmount: '销售额', + OrderCount: '订单数', + MON: '星期一', + TUE: '星期二', + WED: '星期三', + THU: '星期四', + FRI: '星期五', + SAT: '星期六', + SUN: '星期日', + Open: '打开', + ACCEPTED: '已接受', + PENDING: '待处理', + PICKED: '已选择', + ASSIGNED: '已分配', + DELIVERED: '已交付', + REJECTED: '已拒绝' + } +} +export default zh diff --git a/enatega-multivendor-admin/src/utils/coordinates.js b/enatega-multivendor-admin/src/utils/coordinates.js new file mode 100644 index 0000000..011733f --- /dev/null +++ b/enatega-multivendor-admin/src/utils/coordinates.js @@ -0,0 +1,12 @@ +export function transformPolygon(coordinate) { + return coordinate.slice(0, coordinate.length - 1).map(item => { + return { lat: item[1], lng: item[0] } + }) +} +export function transformPath(path) { + const geometry = path.map(coordinates => { + return [coordinates.lng, coordinates.lat] + }) + geometry.push(geometry[0]) + return [geometry] +} diff --git a/enatega-multivendor-admin/src/utils/enums.js b/enatega-multivendor-admin/src/utils/enums.js new file mode 100644 index 0000000..58378eb --- /dev/null +++ b/enatega-multivendor-admin/src/utils/enums.js @@ -0,0 +1,4 @@ +export const SHOP_TYPE = { + GROCERY: 'grocery', + RESTAURANT: 'restaurant' +} diff --git a/enatega-multivendor-admin/src/utils/globalStyles.js b/enatega-multivendor-admin/src/utils/globalStyles.js new file mode 100644 index 0000000..94cd900 --- /dev/null +++ b/enatega-multivendor-admin/src/utils/globalStyles.js @@ -0,0 +1,122 @@ +import { makeStyles } from '@mui/styles' + +const useGlobalStyles = makeStyles(theme => ({ + flex: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center' + }, + flexRow: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center' + }, + input: { + backgroundColor: theme.palette.common.white, + margin: '20px 20px 0 0', + height: 40, + width: '90%', + fontSize: 15, + color: theme.palette.text.disabled, + padding: '5px 20px', + borderRadius: 31, + boxShadow: '0px 0px 18px rgba(0, 0, 0, 0.04)', + border: `1px solid ${theme.palette.grey[100]}` + }, + inputError: { + border: `2px solid ${theme.palette.error.main}` + }, + inputSuccess: { + border: `2px solid ${theme.palette.primary.main2}` + }, + button: { + backgroundColor: theme.palette.primary.main2, + height: 35, + borderRadius: 15, + color: theme.palette.common.black, + fontWeight: 'bold', + border: 'none', + margin: '20px 0 0 0', + padding: '5px 25px', + '&:hover': { + backgroundColor: theme.palette.primary.main, + color: theme.palette.common.white + } + }, + button100: { + width: '90%', + backgroundColor: theme.palette.primary.main2, + height: 35, + borderRadius: 15, + color: theme.palette.common.black, + fontWeight: 'bold', + border: 'none', + margin: '20px 0 0 0', + padding: '5px 25px', + '&:hover': { + backgroundColor: theme.palette.primary.main, + color: theme.palette.common.white + } + }, + selectInput: { + height: 20, + backgroundColor: theme.palette.common.white, + borderRadius: 10, + boxShadow: '0px 0px 18px rgba(0, 0, 0, 0.04)', + border: `1px solid ${theme.palette.grey[100]}` + }, + timing: { + backgroundColor: theme.palette.background.primary, + margin: '30px 0', + borderRadius: 20, + boxShadow: `0px 0px 38px ${theme.palette.common.blackShade}`, + textAlign: 'center' + }, + timingHeader: { + backgroundColor: theme.palette.primary.main2, + borderRadius: '20px 20px 0 0', + fontWeight: 'bold', + padding: '10px ', + color: theme.palette.common.black + }, + dayComponent: { + // backgroundColor: theme.palette.grey[700], + padding: 5, + borderRadius: 15, + marginTop: 5, + marginBottom: 5 + }, + day: { + // backgroundColor: theme.palette.grey[200], + color: theme.palette.common.black, + borderRadius: 15 + }, + openBtn: { + borderRadius: 20, + padding: '0 5px', + backgroundColor: theme.palette.primary.main2, + color: theme.palette.common.black + }, + closeBtn: { + borderRadius: 20, + padding: '0 5px', + color: theme.palette.primary.main2, + backgroundColor: theme.palette.common.black + }, + mb: { + marginBottom: 20 + }, + alertSuccess: { + backgroundColor: theme.palette.primary.main2, + paddingTop: 0, + paddingBottom: 0 + }, + alertError: { + backgroundColor: theme.palette.warning.main, + paddingTop: 0, + paddingBottom: 0 + } +})) + +export default useGlobalStyles diff --git a/enatega-multivendor-admin/src/utils/stringManipulations.js b/enatega-multivendor-admin/src/utils/stringManipulations.js new file mode 100644 index 0000000..92acfa4 --- /dev/null +++ b/enatega-multivendor-admin/src/utils/stringManipulations.js @@ -0,0 +1,20 @@ +/* + * Transform string by adding newline after x spaces + * parameter: String, Number + * return: String + */ +const transformToNewline = (input, spaces = 3) => { + var spaceCount = 0 + var result = [] + var splittedDesc = input.split('') + for (let i = 0; i < splittedDesc.length; i++) { + result.push(splittedDesc[i]) + if (splittedDesc[i] === ' ') { + ++spaceCount + if (spaceCount % spaces === 0 && spaceCount !== 0) result.push('\n') + } + } + return result.join('') +} + +export { transformToNewline } diff --git a/enatega-multivendor-admin/src/utils/tableCustomStyles.js b/enatega-multivendor-admin/src/utils/tableCustomStyles.js new file mode 100644 index 0000000..ad6b223 --- /dev/null +++ b/enatega-multivendor-admin/src/utils/tableCustomStyles.js @@ -0,0 +1,81 @@ +export const customStyles = { + header: { + style: { + fontSize: '17px', + fontWeight: 'bold', + minHeight: '40px', + paddingLeft: '16px', + paddingRight: '8px', + borderRadius: '20px 20px 0 0' + } + }, + headRow: { + style: { + backgroundColor: '#6FCF97', + color: '#FFFFFF', + fontSize: '16px', + fontWeight: 'bold', + minHeight: '40px', + borderRadius: '0 0 20px 20px', + borderBottom: 'none', + alignItems: 'center', + textAlign: 'center' + }, + denseStyle: { + minHeight: '32px' + } + }, + subHeader: { + style: { + minHeight: '0px', + marginTop: -14, + boxShadow: '0px 4px 4px rgba(0, 0, 0, 0.09)' + } + }, + headCells: { + style: { + fontSize: '14px', + color: 'white', + fontWeight: 'bold' + } + }, + + rows: { + style: { + fontSize: '13px', + fontWeight: 400, + minHeight: '40px', + textAlign: 'center', + '&:not(:last-of-type)': { + borderBottomStyle: 'solid', + borderBottomWidth: '0px' + }, + '&:hover': { + backgroundColor: '#f9fafc' + } + } + }, + pagination: { + style: { + fontSize: '13px', + minHeight: '50px', + borderRadius: '0 0 20px 20px', + textAlign: 'left' + }, + pageButtonsStyle: { + backgroundColor: 'transparent', + '&:disabled': { + cursor: 'unset', + color: 'red', + fill: '#5A5858' + }, + '&:hover:not(:disabled)': { + backgroundColor: '#90EA93' + }, + '&:focus': { + outline: 'none', + backgroundColor: '#90EA93' + } + } + } +} diff --git a/enatega-multivendor-admin/src/utils/theme.js b/enatega-multivendor-admin/src/utils/theme.js new file mode 100644 index 0000000..785c4ee --- /dev/null +++ b/enatega-multivendor-admin/src/utils/theme.js @@ -0,0 +1,224 @@ +import { blue } from '@mui/material/colors' +import { createTheme } from '@mui/material/styles' + +const theme = createTheme({ + overrides: { + MuiPickersToolbar: { + toolbar: { + backgroundColor: blue.A200 + } + }, + MuiPickersCalendarHeader: { + switchHeader: { + // backgroundColor: blue.A200, + // color: "white", + } + }, + MuiPickersDay: { + day: { + color: blue.A700 + }, + daySelected: { + backgroundColor: blue['400'] + }, + dayDisabled: { + color: blue['100'] + }, + current: { + color: blue['900'] + } + }, + MuiPickersModal: { + dialogAction: { + color: blue['400'] + } + } + }, + typography: { + fontFamily: ['Inter', 'Open Sans', 'sans-serif'].join(), + htmlFontSize: 16, + fontSize: 14, + fontWeightLight: 300, + fontWeightRegular: 400, + fontWeightMedium: 500, + fontWeightBold: 700, + h1: { + fontWeight: 300, + fontSize: '6rem', + lineHeight: 1.167, + letterSpacing: '-0.01562em' + }, + h2: { + fontWeight: 300, + fontSize: '3.75rem', + lineHeight: 1.2, + letterSpacing: '-0.00833em' + }, + h3: { + fontWeight: 400, + fontSize: '3rem', + lineHeight: 1.167, + letterSpacing: '0em' + }, + h4: { + fontWeight: 400, + fontSize: '2.125rem', + lineHeight: 1.235, + letterSpacing: '0.00735em' + }, + h5: { + fontWeight: 400, + fontSize: '1.5rem', + lineHeight: 1.334, + letterSpacing: '0em' + }, + h6: { + fontWeight: 500, + fontSize: '1.25rem', + lineHeight: 1.6, + letterSpacing: '0.0075em' + }, + subtitle1: { + fontWeight: 400, + fontSize: '1rem', + lineHeight: 1.75, + letterSpacing: '0.00938em' + }, + subtitle2: { + fontWeight: 500, + fontSize: '0.875rem', + lineHeight: 1.57, + letterSpacing: '0.00714em' + }, + body1: { + fontWeight: 400, + fontSize: '1rem', + lineHeight: 1.5, + letterSpacing: '0.00938em' + }, + body2: { + fontWeight: 400, + fontSize: '1rem', + lineHeight: 1.5, + letterSpacing: '0.00938em' + }, + button: { + fontWeight: 500, + fontSize: '0.875rem', + lineHeight: 1.75, + letterSpacing: '0.02857em', + textTransform: 'uppercase' + }, + caption: { + fontWeight: 400, + fontSize: '0.75rem', + lineHeight: 1.66, + letterSpacing: '0.03333em' + }, + overline: { + fontWeight: 400, + fontSize: '0.75rem', + lineHeight: 2.66, + letterSpacing: '0.08333em', + textTransform: 'uppercase' + }, + shape: { + borderRadius: 4 + }, + zIndex: { + mobileStepper: 1000, + speedDial: 1050, + appBar: 1100, + drawer: 1200, + modal: 1300, + snackbar: 1400, + tooltip: 1500 + } + }, + palette: { + mode: 'light', + common: { + black: '#000', + blackShade: 'rgba(0, 0, 0, 0.06)', + white: '#fff' + }, + primary: { + main: '#6FCF97', + main2: '#90EA93', + main3: '#3C8F7C', + light: '#fff', + dark: '#000', + contrastText: '#fff' + }, + secondary: { + main: '#FAFAFA', + light: '#333333', + lightest: '#3C8F7C', + dark: '#949393', + darkest: '#3EC6DD', + contrastText: '#fff' + }, + success: { + main: '#1DB20D', + light: '#CDCDCD', + lightest: '#EEF4FA', + dark: '#FDEFDD', + darkest: '#DEE6ED', + contrastText: '#fff' + }, + info: { + main: 'rgba(39,111,191,0.8)', + light: 'rgba(63, 64, 65, 0.66)', + lightest: 'rgba(238, 244, 250, 0.66)', + dark: 'rgba(0, 0, 0, 0.08)', + darkest: 'rgba(0, 0, 0, 0.1)', + contrastText: '#fff' + }, + error: { + main: '#fe0000', + light: '#BB2124', + lightest: '#fb6340', + contrastText: '#fff' + }, + warning: { + main: '#FA7751', + light: '#FCC54C', + lightest: 'rgba(240, 173, 78,0.2)', + dark: '#90EA93', + darkest: 'rgba(111, 207, 151, 0.34)', + contrastText: '#fff' + }, + grey: { + 50: '#fafafa', + 100: '#f5f5f5', + 200: '#eeeeee', + 300: '#e0e0e0', + 400: '#bdbdbd', + 500: '#9e9e9e', + 600: '#757575', + 700: '#616161', + 800: '#424242', + 900: '#212121', + A100: '#d5d5d5', + A200: '#aaaaaa', + A400: '#303030', + A700: '#616161' + }, + contrastThreshold: 3, + tonalOffset: 0.2, + text: { + primary: '#fff', + secondary: '#212121', + disabled: '#5A5858', + hint: '#FFF' + }, + divider: 'rgba(0, 0, 0, 0.12)', + background: { + paper: '#FAFAFA', + default: '#fff', + primary: '#f9fafc' + } + } +}) + +export default theme diff --git a/enatega-multivendor-admin/src/views/.Dashboard.jsx.swp b/enatega-multivendor-admin/src/views/.Dashboard.jsx.swp new file mode 100644 index 0000000..c09ba40 Binary files /dev/null and b/enatega-multivendor-admin/src/views/.Dashboard.jsx.swp differ diff --git a/enatega-multivendor-admin/src/views/Addons.jsx b/enatega-multivendor-admin/src/views/Addons.jsx new file mode 100644 index 0000000..d5ff0d6 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Addons.jsx @@ -0,0 +1,244 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import Header from '../components/Headers/Header' +import AddonComponent from '../components/Addon/Addon' +import { getRestaurantDetail, deleteAddon } from '../apollo' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import { withTranslation } from 'react-i18next' +import { useQuery, useMutation, gql } from '@apollo/client' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Typography, + ListItemIcon +} from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_ADDONS = gql` + ${getRestaurantDetail} +` +const DELETE_ADDON = gql` + ${deleteAddon} +` +const Addon = props => { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [addon, setAddon] = useState(null) + const [editModal, setEditModal] = useState(false) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + + const toggleModal = addon => { + setEditModal(!editModal) + setAddon(addon) + } + const closeEditModal = () => { + setEditModal(false) + } + const restaurantId = localStorage.getItem('restaurantId') + + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_ADDONS, + { + variables: { id: restaurantId } + } + ) + const [mutate, { loading }] = useMutation(DELETE_ADDON, { + refetchQueries: [{ query: GET_ADDONS, variables: { id: restaurantId } }] + }) + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field] && isNaN(row[field])) { + return row[field].toLowerCase() + } + return row[field] + } + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Title'), + sortable: true, + selector: 'title' + }, + { + name: t('Description'), + sortable: true, + selector: 'description' + }, + { + name: t('Minimum'), + sortable: true, + selector: 'quantityMinimum' + }, + { + name: t('Maximum'), + sortable: true, + selector: 'quantityMaximum' + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + console.log('PAID_VERSION', PAID_VERSION) + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + + if(PAID_VERSION) + mutate({ + variables: { id: row._id, restaurant: restaurantId } + }) + else { + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.restaurant.addons + : data && + data.restaurant.addons.filter(addon => { + return ( + addon.title.toLowerCase().search(regex) > -1 || + addon.description.toLowerCase().search(regex) > -1 + ) + }) + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {isOpen && ( + + )} + {/* Page content */} + + + {errorQuery && ( + + {`Error! ${errorQuery.message}`} + + )} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={data && data.restaurant ? filtered : {}} + pagination + progressPending={loading} + progressComponent={} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + selectableRows + /> + )} + { + toggleModal() + }}> + + + + + ) +} +export default withTranslation()(Addon) diff --git a/enatega-multivendor-admin/src/views/AdminPrivateRoute.jsx b/enatega-multivendor-admin/src/views/AdminPrivateRoute.jsx new file mode 100644 index 0000000..b759d78 --- /dev/null +++ b/enatega-multivendor-admin/src/views/AdminPrivateRoute.jsx @@ -0,0 +1,29 @@ +import React from 'react' +import { Redirect, Route } from 'react-router-dom' +export const AdminPrivateRoute = ({ component: Component, ...rest }) => ( + + localStorage.getItem('user-enatega') ? ( + JSON.parse(localStorage.getItem('user-enatega')).userType === + 'ADMIN' ? ( + + ) : ( + + ) + ) : ( + + ) + } + /> +) diff --git a/enatega-multivendor-admin/src/views/Category.jsx b/enatega-multivendor-admin/src/views/Category.jsx new file mode 100644 index 0000000..ace71af --- /dev/null +++ b/enatega-multivendor-admin/src/views/Category.jsx @@ -0,0 +1,230 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import CategoryComponent from '../components/Category/Category' +import CustomLoader from '../components/Loader/CustomLoader' +// core components +import Header from '../components/Headers/Header' +import { getRestaurantDetail, deleteCategory } from '../apollo' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Typography, + ListItemIcon, + Grid +} from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_CATEGORIES = gql` + ${getRestaurantDetail} +` +const DELETE_CATEGORY = gql` + ${deleteCategory} +` +const Category = props => { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [category, setCategory] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + + const toggleModal = category => { + setEditModal(!editModal) + setCategory(category) + } + const closeEditModal = () => { + setEditModal(false) + } + const restaurantId = localStorage.getItem('restaurantId') + + const [mutate, { loading }] = useMutation(DELETE_CATEGORY) + + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_CATEGORIES, + { + variables: { + id: restaurantId + } + } + ) + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + return row[field] + } + return orderBy(rows, handleField, direction) + } + const columns = [ + { + name: t('Title'), + sortable: true, + selector: 'title' + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + + if(PAID_VERSION) + mutate({ + variables: { id: row._id, restaurant: restaurantId } + }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? data && data.restaurant.categories + : data && + data.restaurant.categories.filter(category => { + return category.title.toLowerCase().search(regex) > -1 + }) + const globalClasses = useGlobalStyles() + return ( + <> +
+ {isOpen && ( + + )} + {/* Page content */} + + + + + + + {errorQuery ? {`Error! ${errorQuery.message}`} : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loading} + progressComponent={} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + )} + + { + toggleModal(null) + }} + style={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }}> + + + + + ) +} +export default withTranslation()(Category) diff --git a/enatega-multivendor-admin/src/views/Commission.jsx b/enatega-multivendor-admin/src/views/Commission.jsx new file mode 100644 index 0000000..6d12e35 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Commission.jsx @@ -0,0 +1,121 @@ +import React from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import Header from '../components/Headers/Header' +import { restaurants, updateCommission } from '../apollo' +import CustomLoader from '../components/Loader/CustomLoader' +import useGlobalStyles from '../utils/globalStyles' +import { Container, Box, Typography, Grid, Input, Button } from '@mui/material' +import useStyles from '../components/Rider/styles' +import { NotificationContainer, NotificationManager } from 'react-notifications' +import 'react-notifications/lib/notifications.css' +import { ReactComponent as CommissionIcon } from '../assets/svg/svg/CommisionRate.svg' +import { useTranslation, withTranslation } from 'react-i18next' + +const GET_RESTAURANTS = gql` + ${restaurants} +` +const UPDATE_COMMISSION = gql` + ${updateCommission} +` +const Commission = () => { + const getValues = id => { + const commissionRate = document.getElementById(id).value + return { id, commissionRate: +commissionRate } + } + const [mutate, { error }] = useMutation(UPDATE_COMMISSION) + + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_RESTAURANTS + ) + console.log(data) + const globalClasses = useGlobalStyles() + const classes = useStyles() + const { t } = useTranslation() + const handleSuccessButtonClick = () => { + NotificationManager.success('Update Successful', 'Commission Rates', 3000, { + className: 'customNotification' + }) + } + const handleErrorButtonClick = () => { + NotificationManager.error('Update Error', 'Commission Rates', 3000, { + className: 'customNotification' + }) + } + + return ( + <> +
+ + + + + + + + {t('CommissionRates')} + + + + {errorQuery ? error {errorQuery.message} : null} + {loadingQuery ? ( + + ) : ( + data && ( + <> + {data.restaurants.map(restaurant => ( + + + {restaurant.name} + + + + + + + {error && {error.message}} + + + ))} + {error && handleErrorButtonClick()} + + ) + )} + + + + + + + + + + ) +} +export default withTranslation()(Commission) diff --git a/enatega-multivendor-admin/src/views/Configuration.jsx b/enatega-multivendor-admin/src/views/Configuration.jsx new file mode 100644 index 0000000..6d909b0 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Configuration.jsx @@ -0,0 +1,185 @@ +import React from 'react' +import { withTranslation } from 'react-i18next' +import { useQuery, gql } from '@apollo/client' +import Header from '../components/Headers/Header' +import { getConfiguration } from '../apollo' +import EmailConfiguration from '../components/Configuration/Email/Email' +import Email from '../components/Configuration/FormEmail/FormEmail' +import DeliveryRateConfiguration from '../components/Configuration/DeliveryRate/DeliveryRate' +import PaypalConfiguration from '../components/Configuration/Paypal/Paypal' +import StripeConfiguration from '../components/Configuration/Stripe/Stripe' +import CurrencyConfiguration from '../components/Configuration/Currency/Currency' +import { Grid } from '@mui/material' +import { ReactComponent as ConfigIcon } from '../assets/svg/svg/Configuration.svg' +import TwilioConfiguration from '../components/Configuration/Twilio/Twilio' +import VerificationConfiguration from '../components/Configuration/Verification/Verification' +import SendGridConfiguration from '../components/Configuration/SendGrid/SendGrid' + +import SentryConfiguration from '../components/Configuration/Sentry/Sentry' +import GoogleApiKeyConfiguration from '../components/Configuration/GoogleApi/GoogleApi' +import CloudinaryConfiguration from '../components/Configuration/ Cloudinary/ Cloudinary' +import AmplitudeApiKeyConfiguration from '../components/Configuration/Amplitude/Amplitude' +import GoogleClientIDConfiguration from '../components/Configuration/GoogleClient/GoogleClient' +import WebConfiguration from '../components/Configuration/Web/Web' +import AppConfigurations from '../components/Configuration/App/App' +import FirebaseConfiguration from '../components/Configuration/FireBase/FireBase' +import Configuration1 from './Configuration1' + +const GET_CONFIGURATION = gql` + ${getConfiguration} +` +const Configuration = props => { + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_CONFIGURATION + ) + console.log('configuration', data) + const { t } = props + + return ( + <> +
+ {errorQuery && t('Error')} + {loadingQuery ? ( + t('LoadingDots') + ) : ( + data.configuration.isPaidVersion? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + )} + + ) +} + +export default withTranslation()(Configuration) diff --git a/enatega-multivendor-admin/src/views/Configuration1.jsx b/enatega-multivendor-admin/src/views/Configuration1.jsx new file mode 100644 index 0000000..9b6fd4e --- /dev/null +++ b/enatega-multivendor-admin/src/views/Configuration1.jsx @@ -0,0 +1,37 @@ +import React from 'react' +import { withTranslation } from 'react-i18next' +import { Grid, useTheme } from '@mui/material' +import { ReactComponent as ConfigIcon } from '../assets/svg/svg/Configuration.svg' +import { Box } from '@mui/material' + +const Configuration1 = props => { + const { t } = props + const theme = useTheme() + return ( + + +

{t('AvailableAfterPurchasing')}

+
+
+ + + +
) +} + +export default withTranslation()(Configuration1) diff --git a/enatega-multivendor-admin/src/views/Coupons.jsx b/enatega-multivendor-admin/src/views/Coupons.jsx new file mode 100644 index 0000000..9c5df48 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Coupons.jsx @@ -0,0 +1,241 @@ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import CouponComponent from '../components/Coupon/Coupon' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import { getCoupons, deleteCoupon, editCoupon } from '../apollo' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import { + Container, + Grid, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Switch, + Typography, + ListItemIcon +} from '@mui/material' +import { ReactComponent as CouponsIcon } from '../assets/svg/svg/Coupons.svg' +import TableHeader from '../components/TableHeader' + +const GET_COUPONS = gql` + ${getCoupons} +` +const EDIT_COUPON = gql` + ${editCoupon} +` +const DELETE_COUPON = gql` + ${deleteCoupon} +` + +const Coupon = props => { + const { t } = props + const [editModal, setEditModal] = useState(false) + const [coupon, setCoupon] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const [mutateEdit] = useMutation(EDIT_COUPON) + const [mutateDelete] = useMutation(DELETE_COUPON, { + refetchQueries: [{ query: GET_COUPONS }] + }) + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_COUPONS + ) + const toggleModal = coupon => { + setEditModal(!editModal) + setCoupon(coupon) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field] && isNaN(row[field])) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Title'), + sortable: true, + selector: 'title' + }, + { + name: t('Discount'), + sortable: true, + selector: 'discount' + }, + { + name: t('Status'), + cell: row => <>{statusChanged(row)} + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.coupons + : data && + data.coupons.filter(coupon => { + return coupon.title.toLowerCase().search(regex) > -1 + }) + + const statusChanged = row => { + return ( + <> + {row.enabled} + { + mutateEdit({ + variables: { + couponInput: { + _id: row._id, + title: row.title, + discount: row.discount, + enabled: !row.enabled + } + } + }) + }} + style={{ color: 'black' }} + /> + + ) + } + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + toggleModal(row) + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + mutateDelete({ variables: { id: row._id } }) + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + + + + + + + + + + {errorQuery ? ( + + `${t('Error')}! ${errorQuery.message}` + + ) : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + /> + )} + { + toggleModal(null) + }} + style={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }}> + + + + + ) +} + +export default withTranslation()(Coupon) diff --git a/enatega-multivendor-admin/src/views/Cuisines.jsx b/enatega-multivendor-admin/src/views/Cuisines.jsx new file mode 100644 index 0000000..adcbf6a --- /dev/null +++ b/enatega-multivendor-admin/src/views/Cuisines.jsx @@ -0,0 +1,213 @@ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import { getCuisines, editCuisine, deleteCuisine } from '../apollo' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import { + Container, + Grid, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Switch, + Typography, + ListItemIcon +} from '@mui/material' +import { ReactComponent as CouponsIcon } from '../assets/svg/svg/Coupons.svg' +import TableHeader from '../components/TableHeader' +import CuisineComponent from '../components/Cuisine/Cuisine' + +const GET_CUISINES = gql` + ${getCuisines} +` +const EDIT_CUISINE = gql` + ${editCuisine} +` +const DELETE_CUISINE = gql` + ${deleteCuisine} +` + +const Cuisines = props => { + const { t } = props + const [editModal, setEditModal] = useState(false) + const [cuisine, setCuisine] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const [mutateEdit] = useMutation(EDIT_CUISINE) + const [mutateDelete] = useMutation(DELETE_CUISINE, { + refetchQueries: [{ query: GET_CUISINES }] + }) + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_CUISINES + ) + const toggleModal = cuisine => { + setEditModal(!editModal) + setCuisine(cuisine) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field] && isNaN(row[field])) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Name'), + sortable: true, + selector: 'name' + }, + { + name: t('Description'), + sortable: true, + selector: 'description' + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.cuisines + : data && + data.cuisines.filter(cuisine => { + return cuisine.name.toLowerCase().search(regex) > -1 + }) + + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + toggleModal(row) + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + mutateDelete({ variables: { id: row._id } }) + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + + + + + + + + + + {errorQuery ? ( + + `${t('Error')}! ${errorQuery.message}` + + ) : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + sortFunction={customSort} + defaultSortField="name" + customStyles={customStyles} + /> + )} + { + toggleModal(null) + }} + style={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }}> + + + + + ) +} + +export default withTranslation()(Cuisines) diff --git a/enatega-multivendor-admin/src/views/Dashboard.jsx b/enatega-multivendor-admin/src/views/Dashboard.jsx new file mode 100644 index 0000000..e7b21c6 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Dashboard.jsx @@ -0,0 +1,419 @@ +import React, { useState } from 'react' +// node.js library that concatenates classes (strings) +// react plugin used to create charts +import { Line } from 'react-chartjs-2' +import stats from '../assets/img/stats.png' +import RiderStat from '../assets/img/RiderStat.png' +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Legend +} from 'chart.js' + +import { + Box, + Typography, + Input, + Button, + Container, + Grid, + useTheme +} from '@mui/material' +import Header from '../components/Headers/Header' +import { useQuery, gql } from '@apollo/client' +import { + getDashboardTotal, + getDashboardSales, + getDashboardOrders, + getOrdersByDateRange +} from '../apollo' + +import useStyles from '../components/Option/styles' +import useGlobalStyles from '../utils/globalStyles' +import { withTranslation } from 'react-i18next' + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Legend +) + +const GET_DASHBOARD_TOTAL = gql` + ${getDashboardTotal} +` +const GET_DASHBOARD_SALES = gql` + ${getDashboardSales} +` +const GET_DASHBOARD_ORDERS = gql` + ${getDashboardOrders} +` +const GET_ORDERS = gql` + ${getOrdersByDateRange} +` + +const Dashboard = props => { + const { t } = props + const theme = useTheme() + const restaurantId = localStorage.getItem('restaurantId') + + const dataLine = { + datasets: { + label: t('SalesAmount'), + // label: 'Sales Amount', + backgroundColor: theme.palette.secondary.darkest, + borderColor: theme.palette.secondary.darkest + } + } + const dataBar = { + datasets: { + label: t('OrderCount'), + // label: 'Order count', + backgroundColor: theme.palette.warning.dark, + borderColor: theme.palette.warning.dark + } + } + + const intializeStartDate = () => { + var d = new Date() + d.setDate(d.getDate() - 7) + return d.toISOString().substr(0, 10) + } + const [stateData, setStateData] = useState({ + startingDate: intializeStartDate(), // new Date().toISOString().substr(0,10), + endingDate: new Date().toISOString().substr(0, 10) + }) + + const { + data: dataTotal, + error: errorTotal, + loading: loadingTotal + } = useQuery(GET_DASHBOARD_TOTAL, { + variables: { + startingDate: stateData.startingDate.toString(), + endingDate: stateData.endingDate.toString(), + restaurant: restaurantId + } + }) + const { + data: dataSales, + error: errorSales, + loading: loadingSales + } = useQuery(GET_DASHBOARD_SALES, { + variables: { + startingDate: stateData.startingDate.toString(), + endingDate: stateData.endingDate.toString(), + restaurant: restaurantId + } + }) + const { data: dataOrders, loading: loadingOrders } = useQuery( + GET_DASHBOARD_ORDERS, + { + variables: { + startingDate: stateData.startingDate.toString(), + endingDate: stateData.endingDate.toString(), + restaurant: restaurantId + } + } + ) + + const { data, loading: loadingQuery } = useQuery(GET_ORDERS, { + variables: { + startingDate: stateData.startingDate.toString(), + endingDate: stateData.endingDate.toString(), + restaurant: restaurantId + } + }) + console.log('getOrdersByDateRange', data) + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + <> +
+ + {errorTotal ? {`${Error} + ${errorTotal.message}`} : null} + + + + + {t('GraphFilter')} + + + + + +
+ + + + {t('StartDate')} + + { + setStateData({ + ...stateData, + startingDate: event.target.value + }) + }} + value={stateData.startingDate} + disableUnderline + className={[globalClasses.input]} + /> + + + + {t('EndDate')} + + { + setStateData({ + ...stateData, + endingDate: event.target.value + }) + }} + value={stateData.endingDate} + disableUnderline + className={[globalClasses.input]} + /> + + + +
+
+
+
+ + + + + {errorSales ? null : null} + d.day), + datasets: [ + { + ...dataLine.datasets, + data: loadingSales + ? [] + : dataSales && + dataSales.getDashboardSales.orders.map(d => d.amount), + lineTension: 0.8 + }, + { + ...dataBar.datasets, + data: loadingOrders + ? [] + : dataOrders && + dataOrders.getDashboardOrders.orders.map(d => d.count) + } + ] + }} + options={{ + maintainAspectRatio: false, + legend: { + labels: { + display: false, + fontColor: theme.palette.common.white, + fontSize: 10 + } + }, + scales: { + yAxes: { + grid: { + color: theme.palette.common.white + }, + ticks: { + color: theme.palette.secondary.main, + fontSize: 12 + } + }, + xAxes: { + grid: { + color: theme.palette.common.white + }, + ticks: { + color: theme.palette.secondary.main, + fontSize: 12 + } + } + } + }} + /> + + + + + + + {t('TotalOrders')} + + + {loadingTotal + ? '...' + : dataTotal && dataTotal.getDashboardTotal.totalOrders} + + + stat + + + + COD Orders + + + + {loadingQuery + ? '...' + : data && data.getOrdersByDateRange.countCashOnDeliveryOrders} + + stat + + + + {t('TotalSales')} + + + {loadingTotal + ? '...' + : dataTotal && dataTotal.getDashboardTotal.totalSales} + + stat + + + + COD Sales + + + {loadingQuery + ? '...' + : data && data.getOrdersByDateRange.totalAmountCashOnDelivery} + + stat + + + + + ) +} + +export default withTranslation()(Dashboard) diff --git a/enatega-multivendor-admin/src/views/DeliveryBoundsAndLocation.jsx b/enatega-multivendor-admin/src/views/DeliveryBoundsAndLocation.jsx new file mode 100644 index 0000000..8aca401 --- /dev/null +++ b/enatega-multivendor-admin/src/views/DeliveryBoundsAndLocation.jsx @@ -0,0 +1,332 @@ +import React, { useCallback, useRef, useState } from 'react' +import { GoogleMap, Marker, Polygon } from '@react-google-maps/api' +import { useMutation, useQuery, gql } from '@apollo/client' +import Header from '../components/Headers/Header' +import { transformPolygon, transformPath } from '../utils/coordinates' +import { + updateDeliveryBoundsAndLocation, + getRestaurantProfile +} from '../apollo' +import useGlobalStyles from '../utils/globalStyles' +import useStyles from '../components/styles' +import CustomLoader from '../components/Loader/CustomLoader' +import { + Container, + Box, + Button, + Typography, + Alert, + useTheme +} from '@mui/material' +import { useTranslation, withTranslation } from 'react-i18next' + +const UPDATE_DELIVERY_BOUNDS_AND_LOCATION = gql` + ${updateDeliveryBoundsAndLocation} +` +const GET_RESTAURANT_PROFILE = gql` + ${getRestaurantProfile} +` + +function DeliveryBoundsAndLocation() { + const { t } = useTranslation() + const theme = useTheme() + const restaurantId = localStorage.getItem('restaurantId') + + const [drawBoundsOrMarker, setDrawBoundsOrMarker] = useState('marker') // polygon + const [successMessage, setSuccessMessage] = useState('') + const [errorMessage, setErrorMessage] = useState('') + + const [center, setCenter] = useState({ lat: 33.684422, lng: 73.047882 }) + const [marker, setMarker] = useState({ lat: 33.684422, lng: 73.047882 }) + const [path, setPath] = useState([ + { + lat: 33.6981335731709, + lng: 73.036895671875 + }, + { + lat: 33.684779099960515, + lng: 73.04650870898438 + }, + { + lat: 33.693206228391965, + lng: 73.06461898425293 + }, + { + lat: 33.706880699271096, + lng: 73.05410472491455 + } + ]) + const polygonRef = useRef() + const listenersRef = useRef([]) + const { error: errorQuery, loading: loadingQuery } = useQuery( + GET_RESTAURANT_PROFILE, + { + variables: { id: restaurantId }, + fetchPolicy: 'network-only', + onCompleted, + onError + } + ) + const [mutate, { loading }] = useMutation( + UPDATE_DELIVERY_BOUNDS_AND_LOCATION, + { + update: updateCache, + onError, + onCompleted + } + ) + // Call setPath with new edited path + const onEdit = useCallback(() => { + if (polygonRef.current) { + const nextPath = polygonRef.current + .getPath() + .getArray() + .map(latLng => { + return { lat: latLng.lat(), lng: latLng.lng() } + }) + setPath(nextPath) + } + }, [setPath]) + + const onLoadPolygon = useCallback( + polygon => { + polygonRef.current = polygon + const path = polygon.getPath() + listenersRef.current.push( + path.addListener('set_at', onEdit), + path.addListener('insert_at', onEdit), + path.addListener('remove_at', onEdit) + ) + }, + [onEdit] + ) + + const onUnmount = useCallback(() => { + listenersRef.current.forEach(lis => lis.remove()) + polygonRef.current = null + }, []) + + const onClick = e => { + if (drawBoundsOrMarker === 'marker') { + setMarker({ lat: e.latLng.lat(), lng: e.latLng.lng() }) + } else { + setPath([...path, { lat: e.latLng.lat(), lng: e.latLng.lng() }]) + } + } + + const removePolygon = () => { + setPath([]) + } + const removeMarker = () => { + setMarker(null) + } + const toggleDrawingMode = mode => { + setDrawBoundsOrMarker(mode) + } + + function updateCache(cache, { data: { result } }) { + const { restaurant } = cache.readQuery({ + query: GET_RESTAURANT_PROFILE, + variables: { id: restaurantId } + }) + cache.writeQuery({ + query: GET_RESTAURANT_PROFILE, + variables: { id: restaurantId }, + data: { + restaurant: { + ...restaurant, + ...result + } + } + }) + } + + function onCompleted({ restaurant }) { + if (restaurant) { + setCenter({ + lat: +restaurant.location.coordinates[1], + lng: +restaurant.location.coordinates[0] + }) + setMarker({ + lat: +restaurant.location.coordinates[1], + lng: +restaurant.location.coordinates[0] + }) + setPath( + restaurant.deliveryBounds + ? transformPolygon(restaurant.deliveryBounds.coordinates[0]) + : path + ) + } + } + + function onError({ networkError, graphqlErrors }) { + setErrorMessage(t('UpdatingLocationError')) + setTimeout(() => setErrorMessage(''), 5000) // Clear error message after 5 seconds + } + + const validate = () => { + if (!marker) { + setErrorMessage(t('LocationMarkerRequired')) + setTimeout(() => setErrorMessage(''), 5000) // Clear success message after 5 seconds + return false + } + if (path.length < 3) { + setErrorMessage(t('DeliveryAreaRequired')) + setTimeout(() => setErrorMessage(''), 5000) // Clear success message after 5 seconds + return false + } + setSuccessMessage(t('LocationUpdatedSuccessfully')) + setTimeout(() => setSuccessMessage(''), 5000) // Clear success message after 5 seconds + setErrorMessage('') + return true + } + + const onDragEnd = mapMouseEvent => { + setMarker({ + lat: mapMouseEvent.latLng.lat(), + lng: mapMouseEvent.latLng.lng() + }) + } + const globalClasses = useGlobalStyles() + const classes = useStyles() + + return ( + <> +
+ + + + + + {t('SetLocation')} + + + + {loadingQuery && } + {errorQuery &&

{errorQuery.message}

} + + + { + + } + {marker && ( + + )} + + + + + + + + + + + + + + {successMessage && ( + + {successMessage} + + )} + + {errorMessage && ( + + {errorMessage} + + )} +
+
+ + ) +} + +export default withTranslation()(DeliveryBoundsAndLocation) diff --git a/enatega-multivendor-admin/src/views/Dispatch.jsx b/enatega-multivendor-admin/src/views/Dispatch.jsx new file mode 100644 index 0000000..5bcb37e --- /dev/null +++ b/enatega-multivendor-admin/src/views/Dispatch.jsx @@ -0,0 +1,339 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useQuery, useMutation, useSubscription, gql } from '@apollo/client' +import DataTable from 'react-data-table-component' +import { + getActiveOrders, + getRidersByZone, + subscriptionOrder, + updateStatus, + assignRider +} from '../apollo' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import { transformToNewline } from '../utils/stringManipulations' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { customStyles } from '../utils/tableCustomStyles' +import { Container, MenuItem, Select, Box, useTheme } from '@mui/material' +import { ReactComponent as DispatchIcon } from '../assets/svg/svg/Dispatch.svg' +import TableHeader from '../components/TableHeader' +import { NotificationContainer, NotificationManager } from 'react-notifications' +import 'react-notifications/lib/notifications.css' + +const SUBSCRIPTION_ORDER = gql` + ${subscriptionOrder} +` +const UPDATE_STATUS = gql` + ${updateStatus} +` +const ASSIGN_RIDER = gql` + ${assignRider} +` +const GET_RIDERS_BY_ZONE = gql` + ${getRidersByZone} +` +const GET_ACTIVE_ORDERS = gql` + ${getActiveOrders} +` + +const Orders = props => { + const theme = useTheme() + const { t } = props + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const [mutateUpdate] = useMutation(UPDATE_STATUS) + const globalClasses = useGlobalStyles() + const [mutateAssign] = useMutation(ASSIGN_RIDER) + + const riderFunc = row => { + const { data: dataZone } = useQuery(GET_RIDERS_BY_ZONE, { + variables: { id: row.zone._id } + }) + return ( + + ) + } + const { + data: dataOrders, + error: errorOrders, + loading: loadingOrders, + refetch: refetchOrders + } = useQuery(GET_ACTIVE_ORDERS, { pollInterval: 3000 }) + + const statusFunc = row => { + const handleStatusSuccessNotification = status => { + NotificationManager.success(status, 'Status Updated!', 3000) + } + + return ( + <> + + + ) + } + const subscribeFunc = row => { + const { data: dataSubscription } = useSubscription(SUBSCRIPTION_ORDER, { + variables: { id: row._id } + }) + console.log(dataSubscription) + return ( +
+ {row.orderId} +
+ {transformToNewline(row.deliveryAddress.deliveryAddress, 3)} +
+ ) + } + const columns = [ + { + name: t('OrderInformation'), + sortable: true, + selector: 'orderId', + cell: row => subscribeFunc(row) + }, + { + name: t('RestaurantCol'), + selector: 'restaurant.name' + }, + { + name: t('Payment'), + selector: 'paymentMethod' + }, + { + name: t('Status'), + selector: 'orderStatus', + cell: row => ( +
+ {t(row.orderStatus)} +
+ {!['CANCELLED', 'DELIVERED'].includes(row.orderStatus) && + statusFunc(row)} +
+ ) + }, + { + name: t('Rider'), + selector: 'rider', + cell: row => ( +
+ {row.rider ? row.rider.name : ''} +
+ {!row.isPickedUp && + !['CANCELLED', 'DELIVERED'].includes(row.orderStatus) && + riderFunc(row)} +
+ ) + }, + { + name: t('OrderTime'), + cell: row => ( + <>{new Date(row.createdAt).toLocaleString().replace(/ /g, '\n')} + ) + } + ] + + const conditionalRowStyles = [ + { + when: row => ['DELIVERED', 'CANCELLED'].includes(row.orderStatus), + style: { + backgroundColor: theme.palette.success.dark + } + } + ] + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? dataOrders && dataOrders.getActiveOrders + : dataOrders && + dataOrders.getActiveOrders.filter(order => { + return ( + order.restaurant.name.toLowerCase().search(regex) > -1 || + order.orderId.toLowerCase().search(regex) > -1 || + order.deliveryAddress.deliveryAddress.toLowerCase().search(regex) > + -1 || + order.orderId.toLowerCase().search(regex) > -1 || + order.paymentMethod.toLowerCase().search(regex) > -1 || + order.orderStatus.toLowerCase().search(regex) > -1 || + (order.rider !== null + ? order.rider.name.toLowerCase().search(regex) > -1 + : false) + ) + }) + + return ( + <> + +
+ + + + + {errorOrders ? ( + + + `${'Error'}! ${errorOrders.message}` + + + ) : null} + {loadingOrders ? ( + + ) : ( + refetchOrders()} + /> + } + title={} + columns={columns} + data={filtered} + progressPending={loadingOrders} + pointerOnHover + progressComponent={} + pagination + conditionalRowStyles={conditionalRowStyles} + customStyles={customStyles} + selectableRows + /> + )} + + + ) +} +export default withTranslation()(Orders) diff --git a/enatega-multivendor-admin/src/views/DispatchRestaurant.jsx b/enatega-multivendor-admin/src/views/DispatchRestaurant.jsx new file mode 100644 index 0000000..e584575 --- /dev/null +++ b/enatega-multivendor-admin/src/views/DispatchRestaurant.jsx @@ -0,0 +1,234 @@ +/* eslint-disable react/display-name */ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { Container, MenuItem, Select, useTheme } from '@mui/material' +import { useQuery, useMutation, useSubscription, gql } from '@apollo/client' +import DataTable from 'react-data-table-component' +import { getActiveOrders, subscriptionOrder, updateStatus } from '../apollo' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import { transformToNewline } from '../utils/stringManipulations' +import SearchBar from '../components/TableHeader/SearchBar' +import { useParams } from 'react-router-dom' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import TableHeader from '../components/TableHeader' + +const SUBSCRIPTION_ORDER = gql` + ${subscriptionOrder} +` +const UPDATE_STATUS = gql` + ${updateStatus} +` +const GET_ACTIVE_ORDERS = gql` + ${getActiveOrders} +` + +const DispatchRestaurant = props => { + const theme = useTheme() + const { t } = props + const params = useParams() + + const [restaurantId, seteRestaurantId] = useState( + localStorage.getItem('restaurantId') + ) + useEffect(() => { + if (params.id) seteRestaurantId(params.id) + }, []) + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const [mutateUpdate] = useMutation(UPDATE_STATUS) + const globalClasses = useGlobalStyles() + + const { + data: dataOrders, + error: errorOrders, + loading: loadingOrders, + refetch: refetchOrders + } = useQuery(GET_ACTIVE_ORDERS, { + variables: { restaurantId }, + pollInterval: 3000, + skip: restaurantId === null + }) + + const statusFunc = row => { + return ( + <> + + + ) + } + + const subscribeFunc = row => { + const { data: dataSubscription } = useSubscription(SUBSCRIPTION_ORDER, { + variables: { id: row._id } + }) + console.log(dataSubscription) + return ( +
+ {row.orderId} +
+ {transformToNewline(row.deliveryAddress.deliveryAddress, 3)} +
+ ) + } + const columns = [ + { + name: t('OrderInformation'), + sortable: true, + selector: 'orderId', + cell: row => subscribeFunc(row) + }, + { + name: t('RestaurantCol'), + selector: 'restaurant.name' + }, + { + name: t('Payment'), + selector: 'paymentMethod' + }, + { + name: t('Status'), + selector: 'orderStatus', + cell: row => ( +
+ {row.orderStatus} +
+ {!['CANCELLED', 'DELIVERED'].includes(row.orderStatus) && + statusFunc(row)} +
+ ) + }, + { + name: t('OrderTime'), + cell: row => ( + <>{new Date(row.createdAt).toLocaleString().replace(/ /g, '\n')} + ) + } + ] + + const conditionalRowStyles = [ + { + when: row => ['DELIVERED', 'CANCELLED'].includes(row.orderStatus), + style: { + backgroundColor: theme.palette.success.dark + } + } + ] + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? dataOrders && dataOrders.getActiveOrders + : dataOrders && + dataOrders.getActiveOrders.filter(order => { + return ( + order.restaurant.name.toLowerCase().search(regex) > -1 || + order.orderId.toLowerCase().search(regex) > -1 || + order.deliveryAddress.deliveryAddress.toLowerCase().search(regex) > + -1 || + order.orderId.toLowerCase().search(regex) > -1 || + order.paymentMethod.toLowerCase().search(regex) > -1 || + order.orderStatus.toLowerCase().search(regex) > -1 || + (order.rider !== null + ? order.rider.name.toLowerCase().search(regex) > -1 + : false) + ) + }) + + return ( + <> +
+ {/* Page content */} + + {errorOrders ? ( + + {`${t('Error')} ${errorOrders.message}`} + + ) : null} + {loadingOrders ? ( + + ) : ( + refetchOrders()} + /> + } + title={} + columns={columns} + data={filtered} + progressPending={loadingOrders} + pointerOnHover + progressComponent={} + pagination + conditionalRowStyles={conditionalRowStyles} + customStyles={customStyles} + selectableRows + /> + )} + + + ) +} +export default withTranslation()(DispatchRestaurant) diff --git a/enatega-multivendor-admin/src/views/Food.jsx b/enatega-multivendor-admin/src/views/Food.jsx new file mode 100644 index 0000000..e10cf0d --- /dev/null +++ b/enatega-multivendor-admin/src/views/Food.jsx @@ -0,0 +1,295 @@ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +// core components +import Header from '../components/Headers/Header' +import { getRestaurantDetail, deleteFood } from '../apollo' +import FoodComponent from '../components/Food/Food' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import { transformToNewline } from '../utils/stringManipulations' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Typography, + ListItemIcon +} from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_FOODS = gql` + ${getRestaurantDetail} +` +const DELETE_FOOD = gql` + ${deleteFood} +` +const Food = props => { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [food, setFood] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + const restaurantId = localStorage.getItem('restaurantId') + + const [mutate, { loading }] = useMutation(DELETE_FOOD, { + refetchQueries: [{ query: GET_FOODS, variables: { id: restaurantId } }] + }) + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_FOODS, + { + variables: { + id: restaurantId + } + } + ) + const toggleModal = food => { + setEditModal(!editModal) + setFood(food) + } + const closeEditModal = () => { + setEditModal(false) + } + + const propExists = (obj, path) => { + return path.split('.').reduce((obj, prop) => { + return obj && obj[prop] ? obj[prop] : '' + }, obj) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (field && isNaN(propExists(row, field))) { + return propExists(row, field).toLowerCase() + } + + return row[field] + } + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Title'), + selector: 'title', + sortable: true + }, + { + name: t('Description'), + sortable: true, + selector: 'description', + cell: row => <>{transformToNewline(row.description, 3)} + }, + { + name: t('Category'), + sortable: true, + selector: 'category.category', + cell: row => <>{row.category} + }, + { + name: t('Image'), + cell: row => ( + <> + {row.image + + ) + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + if(PAID_VERSION) + mutate({ + variables: { + id: row._id, + restaurant: restaurantId, + categoryId: row.categoryId + } + }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const foodsList = categories => { + const list = [] + categories && + categories.forEach(category => { + if (category.foods && category.foods.length) { + return category.foods.map(item => { + list.push({ + ...item, + category: category.title, + categoryId: category._id, + ...category, + _id: item._id, + title: item.title + }) + + return { + ...item, + category: category.title, + categoryId: category._id, + ...category, + _id: item._id, + title: item.title + } + }) + } + }) + return list + } + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? foodsList(data && data.restaurant.categories) + : foodsList(data && data.restaurant.categories).filter(food => { + return ( + food.title.toLowerCase().search(regex) > -1 || + food.description.toLowerCase().search(regex) > -1 || + food.category.toLowerCase().search(regex) > -1 + ) + }) + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {/* Page content */} + {isOpen && ( + + )} + + + {errorQuery && `Error! ${errorQuery.message}`} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={data && data.restaurant ? filtered : {}} + pagination + progressPending={loading} + progressComponent={} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + )} + { + toggleModal() + }} + style={{ + marginLeft: '13%', + overflowY: 'auto' + }}> + + + + + ) +} + +export default withTranslation()(Food) diff --git a/enatega-multivendor-admin/src/views/ForgotPassword.jsx b/enatega-multivendor-admin/src/views/ForgotPassword.jsx new file mode 100644 index 0000000..0b354ea --- /dev/null +++ b/enatega-multivendor-admin/src/views/ForgotPassword.jsx @@ -0,0 +1,222 @@ +import React, { useRef, useState } from 'react' +import { useMutation, gql } from '@apollo/client' +import { resetPassword } from '../apollo' +import { validateFunc } from '../constraints/constraints' +import useStyles from '../components/Configuration/styles' +import useGlobalStyles from '../utils/globalStyles' +import { Box, Typography, Input, Alert, Button, Checkbox } from '@mui/material' +import { withTranslation } from 'react-i18next' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' + +const RESET_PASSWORD = gql` + ${resetPassword} +` +const ResetPassword = props => { + const { t } = props + const formRef = useRef() + const [password, setPassword] = useState('') + const [confirmPassword, setConfirmPassword] = useState('') + const [confirmPasswordError, setConfirmPasswordError] = useState(null) + const [passwordError, setPasswordError] = useState(null) + const [error, setError] = useState(null) + const [success, setSuccess] = useState(null) + const [showPassword, setShowPassword] = useState(false) + const [showConfirmPassword, setShowConfirmPassword] = useState(false) + + const onBlur = (event, field) => { + if (field === 'password') { + setPasswordError(!validateFunc({ password: password }, 'password')) + } else if (field === 'confirmPassword') { + setConfirmPasswordError( + !validateFunc( + { confirmPassword: confirmPassword, password: password }, + 'confirmPassword' + ) + ) + } + } + const hideAlert = () => { + passwordError('') + confirmPasswordError('') + } + const validate = () => { + const confirmPasswordErrorDisplay = !validateFunc( + { password: password, confirmPassword: confirmPassword }, + 'confirmPassword' + ) + const passwordErrorDisplay = !validateFunc( + { password: password }, + 'password' + ) + setConfirmPasswordError(confirmPasswordErrorDisplay) + setPasswordError(passwordErrorDisplay) + return confirmPasswordErrorDisplay && passwordErrorDisplay + } + const onCompleted = data => { + setConfirmPasswordError(null) + setPasswordError(null) + setSuccess(t('PasswordUpdated')) + setTimeout(hideAlert, 5000) + } + const onError = error => { + setConfirmPasswordError(null) + setPasswordError(null) + setError(error.networkError.result.errors[0].message) + setTimeout(hideAlert, 5000) + } + const [mutate] = useMutation(RESET_PASSWORD, { onError, onCompleted }) + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + + + + + + {t('ForgotPassword')} + + + + + +
+ + { + setPassword(event.target.value) + }} + onBlur={event => { + onBlur(event, 'password') + }} + placeholder={t('Password')} + type={showPassword ? 'text' : 'password'} + disableUnderline + className={[ + globalClasses.input, + passwordError === false + ? globalClasses.inputError + : passwordError === true + ? globalClasses.inputSuccess + : '' + ]} + endAdornment={ + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + + { + setConfirmPassword(event.target.value) + }} + onBlur={event => { + onBlur(event, 'confirmPassword') + }} + placeholder={t('ConfirmPassword')} + disableUnderline + className={[ + globalClasses.input, + confirmPasswordError === false + ? globalClasses.inputError + : confirmPasswordError === true + ? globalClasses.inputSuccess + : '' + ]} + endAdornment={ + + + setShowConfirmPassword(!showConfirmPassword) + } + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + + + +
+ + {success && ( + + {success} + + )} + {error && ( + + {error} + + )} + +
+
+
+ ) +} + +export default withTranslation()(ResetPassword) diff --git a/enatega-multivendor-admin/src/views/Login.jsx b/enatega-multivendor-admin/src/views/Login.jsx new file mode 100644 index 0000000..dea9e1f --- /dev/null +++ b/enatega-multivendor-admin/src/views/Login.jsx @@ -0,0 +1,307 @@ +import React, { useState, useEffect, useRef } from 'react' +import { withTranslation } from 'react-i18next' +import { + Box, + Alert, + Typography, + Input, + Button, + Grid, + Link, + Checkbox, + FormGroup, + FormControlLabel +} from '@mui/material' + +import { useMutation, gql } from '@apollo/client' +import { ownerLogin } from '../apollo' +import { validateFunc } from '../constraints/constraints' +import useStyles from '../components/Configuration/styles' +import useGlobalStyles from '../utils/globalStyles' +import LoginBg from '../assets/img/loginBg.png' +import LoginPageIcon from '../assets/img/LoginPageIcon.png' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' + +const LOGIN = gql` + ${ownerLogin} +` +const Login = props => { + const [showPassword, setShowPassword] = useState(false) + const [stateData, setStateData] = useState({ + email: 'admin@gmail.com', + password: '123123', + emailError: null, + passwordError: null, + error: null, + type: null, /// 0 for vendor + redirectToReferrer: !!localStorage.getItem('user-enatega') + }) + const formRef = useRef() + const { t } = props + + const [isLogged, setIsLogged] = useState(false) + const onBlur = (event, field) => { + setStateData({ + ...stateData, + [field + 'Error']: !validateFunc({ [field]: stateData[field] }, field) + }) + } + const validate = () => { + const emailError = !validateFunc({ email: stateData.email }, 'email') + const passwordError = !validateFunc( + { password: stateData.password }, + 'password' + ) + setStateData({ ...stateData, emailError, passwordError }) + return emailError && passwordError + } + const { redirectToReferrer, type } = stateData + + useEffect(() => { + if (isLogged) { + if (redirectToReferrer && type === 0) { + props.history.replace('/restaurant/list') + } + if (redirectToReferrer && type === 1) { + props.history.replace('/super_admin/vendors') + } + } + }, [isLogged]) + + const onCompleted = data => { + localStorage.setItem('user-enatega', JSON.stringify(data.ownerLogin)) + const userType = data.ownerLogin.userType + if (userType === 'VENDOR') { + setStateData({ + ...stateData, + redirectToReferrer: true, + type: 0, + emailError: null, + passwordError: null + }) + } else { + setStateData({ + ...stateData, + redirectToReferrer: true, + type: 1, + emailError: null, + passwordError: null + }) + } + setIsLogged(true) + setTimeout(hideAlert, 5000) + } + const hideAlert = () => { + setStateData({ + ...stateData, + emailError: null, + passwordError: null + }) + } + const onError = error => { + if (error.graphQLErrors.length) { + setStateData({ + ...stateData, + error: error.graphQLErrors[0].message + }) + } + if (error.networkError) { + setStateData({ + ...stateData, + error: error.message + }) + } + setIsLogged(false) + setTimeout(hideAlert, 5000) + } + const [mutate] = useMutation(LOGIN, { onError, onCompleted }) + + const loginFunc = async() => { + if (validate()) { + mutate({ variables: { ...stateData } }) + } + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + <> + + + login img + + + + {t('enterYourDetailsBelow')} + + + + + + {t('LogintoEnatega')} + + + + + +
+ + + {t('Email')} + + { + setStateData({ ...stateData, email: event.target.value }) + }} + onBlur={event => { + onBlur(event, 'email') + }} + placeholder={t('Email')} + type="email" + disableUnderline + className={[ + globalClasses.input, + stateData.emailError === false + ? globalClasses.inputError + : stateData.emailError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + {t('Password')} + + { + setStateData({ + ...stateData, + password: event.target.value + }) + }} + onBlur={event => { + onBlur(event, 'password') + }} + disableUnderline + className={[ + globalClasses.input, + stateData.passwordError === false + ? globalClasses.inputError + : stateData.passwordError === true + ? globalClasses.inputSuccess + : '' + ]} + endAdornment={ + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + + + } + label={t('RememberMe')} + /> + + + {t('ForgotYourPassword')} + + + + + +
+ + {stateData.error && ( + + {stateData.error} + + )} + +
+
+
+
+ + ) +} +export default withTranslation()(Login) diff --git a/enatega-multivendor-admin/src/views/Notifications.jsx b/enatega-multivendor-admin/src/views/Notifications.jsx new file mode 100644 index 0000000..285c8df --- /dev/null +++ b/enatega-multivendor-admin/src/views/Notifications.jsx @@ -0,0 +1,202 @@ +import React, { useState, useEffect } from 'react' +import { useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import { sendNotificationUser } from '../apollo' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import { validateFunc } from '../constraints/constraints' +import { + Container, + Box, + Typography, + Input, + Button, + Alert, + Grid +} from '@mui/material' +import useStyles from '../components/Tipping/styles' +import useGlobalStyles from '../utils/globalStyles' +import { ReactComponent as NotificationIcon } from '../assets/svg/svg/Notification.svg' + +const NOTIFICATION_USER = gql` + ${sendNotificationUser} +` + +const Notifications = props => { + const { t } = props + const [notificationTitle, setNotificationTitle] = useState('') + const [notificationBody, setNotificationBody] = useState('') + const [bodyError, setBodyError] = useState(null) + const [titleError, setTitleError] = useState(null) + const [mainError, setError] = useState('') + const [success, setSuccess] = useState('') + + useEffect(() => { + // Use a timer to clear the success message after 5 seconds + if (success) { + const timer = setTimeout(() => { + setSuccess('') + }, 5000) + + return () => clearTimeout(timer) + } + }, [success]) + + const [mutate, { loading }] = useMutation(NOTIFICATION_USER, { + onCompleted: () => { + setSuccess(t('NotificationSentAuccessfully')) // Set success message + setNotificationTitle('') // Clear the title field + setNotificationBody('') // Clear the body field + }, + onError: error => { + setError(t('ActionFailedTryAgain')) // Set error message + } + }) + + const onSubmitValidation = () => { + const nTitleError = !validateFunc( + { notificationTitle }, + 'notificationTitle' + ) + const nBodyError = !validateFunc({ notificationBody }, 'notificationBody') + setTitleError(nTitleError) + setBodyError(nBodyError) + return nTitleError && nBodyError + } + + const classes = useStyles() + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {/* Page content */} + + + + + + + + {t('Notifications')} + + + + + + {loading ? ( + + ) : ( +
+ + + + + {t('Title')} + + { + setNotificationTitle(event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + titleError === false + ? globalClasses.inputError + : titleError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + {t('Body')} + + { + setNotificationBody(event.target.value) + }} + disableUnderline + className={[ + globalClasses.input, + bodyError === false + ? globalClasses.inputError + : bodyError === true + ? globalClasses.inputSuccess + : '' + ]} + /> + + + + + + +
+ )} + + {success && ( + + {success} + + )} + {mainError && ( + + {mainError} + + )} + +
+
+
+
+ + + +
+ + ) +} + +export default withTranslation()(Notifications) diff --git a/enatega-multivendor-admin/src/views/Options.jsx b/enatega-multivendor-admin/src/views/Options.jsx new file mode 100644 index 0000000..7f86f28 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Options.jsx @@ -0,0 +1,251 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import Header from '../components/Headers/Header' +import OptionComponent from '../components/Option/Option' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' + +import { withTranslation } from 'react-i18next' +import { useQuery, useMutation, gql } from '@apollo/client' +import { getRestaurantDetail, deleteOption } from '../apollo' +import SearchBar from '../components/TableHeader/SearchBar' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Typography, + ListItemIcon +} from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_OPTIONS = gql` + ${getRestaurantDetail} +` +const DELETE_OPTION = gql` + ${deleteOption} +` + +const Option = props => { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [option, setOption] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + + const toggleModal = option => { + setEditModal(!editModal) + setOption(option) + } + const closeEditModal = () => { + setEditModal(false) + } + + const restaurantId = localStorage.getItem('restaurantId') + + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_OPTIONS, + { + variables: { id: restaurantId } + } + ) + const [mutate, { loading }] = useMutation(DELETE_OPTION, { + refetchQueries: [{ query: GET_OPTIONS, variables: { id: restaurantId } }] + }) + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field] && isNaN(row[field])) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const handleSort = (column, sortDirection) => + console.log(column.selector, sortDirection) + + const columns = [ + { + name: t('Title'), + sortable: true, + selector: 'title' + }, + { + name: t('Description'), + sortable: true, + selector: 'description' + }, + { + name: t('Price'), + sortable: true, + selector: 'price' + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + + if(PAID_VERSION) + mutate({ + variables: { id: row._id, restaurant: restaurantId } + }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? data && data.restaurant.options + : data && + data.restaurant.options.filter(option => { + return ( + option.title.toLowerCase().search(regex) > -1 || + option.description.toLowerCase().search(regex) > -1 + ) + }) + const globalClasses = useGlobalStyles() + return ( + <> +
+ {isOpen && ( + + )} + {/* Page content */} + + + {errorQuery && ( + + {`${'Error'} ${errorQuery.message}`} + + )} + {loading ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={data && data.restaurant ? filtered : {}} + pagination + progressPending={loadingQuery} + progressComponent={} + onSort={handleSort} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + )} + { + toggleModal() + }} + style={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }}> + + + + + ) +} +export default withTranslation()(Option) diff --git a/enatega-multivendor-admin/src/views/Orders.jsx b/enatega-multivendor-admin/src/views/Orders.jsx new file mode 100644 index 0000000..e8e0480 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Orders.jsx @@ -0,0 +1,79 @@ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import OrderComponent from '../components/Order/Order' +import OrdersData from '../components/Order/OrdersData' +import Header from '../components/Headers/Header' +import { useQuery, gql } from '@apollo/client' +import { getOrdersByRestaurant } from '../apollo' +import useGlobalStyles from '../utils/globalStyles' +import { Container, Modal } from '@mui/material' + +const GET_ORDERS = gql` + ${getOrdersByRestaurant} +` + +const Orders = () => { + const [detailsModal, setDetailModal] = useState(false) + const [order, setOrder] = useState(null) + const [page, setPage] = useState(1) + const [rowsPerPage, setRowsPerPage] = useState(10) + const [search] = useState('') + const restaurantId = localStorage.getItem('restaurantId') + + const { + data, + error: errorQuery, + loading: loadingQuery, + subscribeToMore + } = useQuery(GET_ORDERS, { + variables: { + restaurant: restaurantId, + page: page - 1, + rows: rowsPerPage, + search + } + }) + const toggleModal = order => { + setOrder(order) + setDetailModal(!detailsModal) + } + + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + + {errorQuery && ( + + {`${'Error'} ${errorQuery.message}`} + + )} + + { + toggleModal(null) + }}> + + + + + ) +} +export default withTranslation()(Orders) diff --git a/enatega-multivendor-admin/src/views/Payment.jsx b/enatega-multivendor-admin/src/views/Payment.jsx new file mode 100644 index 0000000..74da6cf --- /dev/null +++ b/enatega-multivendor-admin/src/views/Payment.jsx @@ -0,0 +1,79 @@ +import React from 'react' +import { useQuery, gql } from '@apollo/client' +import { withTranslation, useTranslation } from 'react-i18next' +import { Container, Box, Typography, Button } from '@mui/material' +import Header from '../components/Headers/Header' +import ConfigurableValues from '../config/constants' +import { getRestaurantProfile } from '../apollo' +import useGlobalStyles from '../utils/globalStyles' +import useStyles from '../components/styles' +const RESTAURANT = gql` + ${getRestaurantProfile} +` +const Payment = () => { + const { SERVER_URL } = ConfigurableValues() + + const { t } = useTranslation() + + const restaurantId = localStorage.getItem('restaurantId') + + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + RESTAURANT, + { + variables: { id: restaurantId } + } + ) + const submitStripeDetails = () => { + fetch(SERVER_URL + '/stripe/account', { + method: 'POST', + body: JSON.stringify({ restaurantId }), + headers: { + 'content-type': 'application/json' + } + }) + .then(response => response.json()) + .then(data => { + window.location = data.url + }) + .catch(error => { + console.log('error', error) + }) + } + const globalClasses = useGlobalStyles() + const classes = useStyles() + return ( + <> +
+ + + + + + {t('Delivery Rate')} + + + + + + {loadingQuery && {t('LoadingDots')}} + {errorQuery && {errorQuery.message}} + {data && data.restaurant.stripeDetailsSubmitted && ( + {t('StripeDetailsAttached')} + )} + + + + + + + + ) +} +export default withTranslation()(Payment) diff --git a/enatega-multivendor-admin/src/views/PrivateRoute.jsx b/enatega-multivendor-admin/src/views/PrivateRoute.jsx new file mode 100644 index 0000000..95d76c0 --- /dev/null +++ b/enatega-multivendor-admin/src/views/PrivateRoute.jsx @@ -0,0 +1,20 @@ +import React from 'react' +import { Redirect, Route } from 'react-router-dom' + +export const PrivateRoute = ({ component: Component, ...rest }) => ( + + localStorage.getItem('user-enatega') ? ( + + ) : ( + + ) + } + /> +) diff --git a/enatega-multivendor-admin/src/views/Rating.jsx b/enatega-multivendor-admin/src/views/Rating.jsx new file mode 100644 index 0000000..2c045f7 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Rating.jsx @@ -0,0 +1,138 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import { Container } from '@mui/material' +import Header from '../components/Headers/Header' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import CustomLoader from '../components/Loader/CustomLoader' +import { useQuery, gql } from '@apollo/client' +import { reviews } from '../apollo' +import useGlobalStyles from '../utils/globalStyles' +import SearchBar from '../components/TableHeader/SearchBar' +import { customStyles } from '../utils/tableCustomStyles' +import TableHeader from '../components/TableHeader' + +const REVIEWS = gql` + ${reviews} +` + +const Ratings = props => { + const { t } = props + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const restaurantId = localStorage.getItem('restaurantId') + + const { data, error: errorQuery, loading: loadingQuery } = useQuery(REVIEWS, { + variables: { restaurant: restaurantId } + }) + + const columns = [ + { + name: t('Name'), + sortable: true, + selector: 'user.name', + cell: row => <>{row.order.user.name} + }, + { + name: t('Email'), + sortable: true, + selector: 'user.email', + cell: row => <>{row.order.user.email} + }, + { + name: t('Items'), + cell: row => ( + <> + {row.order.items.map(({ title }) => { + return title + '\t' + })} + + ) + }, + { + name: t('Review'), + sortable: true, + selector: 'description', + cell: row => <>{row.description} + }, + { + name: t('Ratings'), + sortable: true, + selector: 'rating', + cell: row => <>{row.rating} + } + ] + const propExists = (obj, path) => { + return path.split('.').reduce((obj, prop) => { + return obj && obj[prop] ? obj[prop] : '' + }, obj) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (field && isNaN(propExists(row, field))) { + return propExists(row, field).toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const handleSort = (column, sortDirection) => + console.log(column.selector, sortDirection, column) + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.reviews + : data && + data.reviews.filter(review => { + return ( + review.user.name.toLowerCase().search(regex) > -1 || + review.user.email.toLowerCase().search(regex) > -1 + ) + }) + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + {errorQuery && ( + + {`${t('Error')} ${errorQuery.message}`} + + )} + {loadingQuery ? ( + + ) : ( + } + subHeader={true} + subHeaderComponent={ + + } + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + onSort={handleSort} + sortFunction={customSort} + defaultSortField="order.user.name" + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + )} + + + ) +} + +export default withTranslation()(Ratings) diff --git a/enatega-multivendor-admin/src/views/Restaurant.jsx b/enatega-multivendor-admin/src/views/Restaurant.jsx new file mode 100644 index 0000000..7e78952 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Restaurant.jsx @@ -0,0 +1,106 @@ +import React, { useState } from 'react' +import RestaurantCard from '../components/Restaurant/Card' +import { Link } from 'react-router-dom' +import { useQuery, gql } from '@apollo/client' +import { restaurantByOwner } from '../apollo' +import CreateRestaurant from '../components/Restaurant/CreateRestaurant' +import { Box, Button, Modal, Container, Grid, useTheme } from '@mui/material' +import AddIcon from '@mui/icons-material/Add' +import useGlobalStyles from '../utils/globalStyles' +import { withTranslation } from 'react-i18next' + +const RESTAURANT_BY_OWNER = gql` + ${restaurantByOwner} +` +const Restaurant = props => { + const theme = useTheme() + const { t } = props + const [owner, setOwner] = useState() + const [isModalVisible, setIsModalVisible] = useState(false) + const vendorId = localStorage.getItem('vendorId') + const toggleModal = () => { + setIsModalVisible(prevState => !prevState) + } + + const globalClasses = useGlobalStyles() + + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + RESTAURANT_BY_OWNER, + { + variables: { id: vendorId } + } + ) + const links = + data && + data.restaurantByOwner.restaurants.map((rest, index) => { + return ( + + { + localStorage.setItem('restaurantId', rest._id) + localStorage.setItem('restaurantImage', rest.image) + localStorage.setItem('restaurantName', rest.name) + }} + to={`/admin/dashboard/${rest.slug}`}> + + + + ) + }) + return ( + <> + + {/* Page content */} + + + {loadingQuery ?
{t('Loading')}
: null} + {errorQuery ? `${errorQuery.message}` : null} + {!loadingQuery && !errorQuery && ( + + {links} + + )} +
+ + + + + + +
+ + ) +} +export default withTranslation()(Restaurant) diff --git a/enatega-multivendor-admin/src/views/RestaurantList.jsx b/enatega-multivendor-admin/src/views/RestaurantList.jsx new file mode 100644 index 0000000..ec8e080 --- /dev/null +++ b/enatega-multivendor-admin/src/views/RestaurantList.jsx @@ -0,0 +1,208 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import CustomLoader from '../components/Loader/CustomLoader' +// core components +import Header from '../components/Headers/Header' +import { restaurants, deleteRestaurant } from '../apollo' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import Loader from 'react-loader-spinner' +import SearchBar from '../components/TableHeader/SearchBar' +import { Container, Button, Box, useTheme } from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import { ReactComponent as RestIcon } from '../assets/svg/svg/Restaurant.svg' +import TableHeader from '../components/TableHeader' + +const GET_RESTAURANTS = gql` + ${restaurants} +` +const DELETE_RESTAURANT = gql` + ${deleteRestaurant} +` + +const Restaurants = props => { + const { t } = props + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const globalClasses = useGlobalStyles() + + const [mutate, { loading }] = useMutation(DELETE_RESTAURANT) + const { + data, + loading: loadingQuery, + refetch, + networkStatus + } = useQuery(GET_RESTAURANTS, { fetchPolicy: 'network-only' }) + const onClickRefetch = cb => { + cb() + } + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + return row[field] + } + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Image'), + cell: row => ( + <> + {!!row.image && ( + {t('ImageMenu')} { + localStorage.setItem('restaurant_id', row._id) + props.history.push('/admin/dashboard') + }} + /> + )} + {!row.image && 'No Image'} + + ), + selector: 'image' + }, + { + name: t('Name'), + // sortable: true, + selector: 'name', + style: { + cursor: 'pointer' + } + }, + { + name: t('Address'), + selector: 'address', + style: { + cursor: 'pointer' + } + }, + { + name: t('OrderPrefix'), + selector: 'orderPrefix', + style: { + cursor: 'pointer' + } + }, + { + name: t('Vendor'), + selector: 'owner', + style: { + cursor: 'pointer' + }, + cell: row => <>{row.owner ? row.owner.email : null} + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const theme = useTheme() + const actionButtons = row => { + return ( + <> + {loading ? ( + + ) : null} + + + ) + } + + const conditionalRowStyles = [ + { + when: row => !row.isActive, + style: { + backgroundColor: theme.palette.background.primary + } + } + ] + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.restaurants + : data && + data.restaurants.filter(restaurant => { + return ( + restaurant.name.toLowerCase().search(regex) > -1 || + restaurant.orderPrefix.toLowerCase().search(regex) > -1 || + restaurant.owner.email.toLowerCase().search(regex) > -1 || + restaurant.address.toLowerCase().search(regex) > -1 + ) + }) + + return ( + <> +
+ + + + + {loadingQuery ? ( + + ) : ( + onClickRefetch(refetch)} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loading || networkStatus === 4} + progressComponent={} + sortFunction={customSort} + defaultSortField="name" + onRowClicked={row => { + localStorage.setItem('restaurantId', row._id) + localStorage.setItem('restaurantImage', row.image) + localStorage.setItem('restaurantName', row.name) + props.history.push(`/admin/dashboard/${row.slug}`) + }} + conditionalRowStyles={conditionalRowStyles} + selectableRows + /> + )} + + + ) +} +export default withTranslation()(Restaurants) diff --git a/enatega-multivendor-admin/src/views/Riders.jsx b/enatega-multivendor-admin/src/views/Riders.jsx new file mode 100644 index 0000000..c921c61 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Riders.jsx @@ -0,0 +1,300 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import { useQuery, useMutation, gql } from '@apollo/client' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import RiderComponent from '../components/Rider/Rider' +import SearchBar from '../components/TableHeader/SearchBar' +import { + getRiders, + deleteRider, + toggleAvailablity, + getAvailableRiders +} from '../apollo' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + Grid, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Switch, + Typography, + ListItemIcon +} from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import { ReactComponent as RiderIcon } from '../assets/svg/svg/Rider.svg' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_RIDERS = gql` + ${getRiders} +` +const DELETE_RIDER = gql` + ${deleteRider} +` +const TOGGLE_RIDER = gql` + ${toggleAvailablity} +` +const GET_AVAILABLE_RIDERS = gql` + ${getAvailableRiders} +` + +function Riders(props) { + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [rider, setRider] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + const [mutateToggle] = useMutation(TOGGLE_RIDER, { + refetchQueries: [{ query: GET_RIDERS }, { query: GET_AVAILABLE_RIDERS }] + }) + const [mutateDelete] = useMutation(DELETE_RIDER, { + refetchQueries: [{ query: GET_RIDERS }] + }) + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_RIDERS + ) + + const toggleModal = rider => { + setEditModal(!editModal) + setRider(rider) + } + + const closeEditModal = () => { + setEditModal(false) + } + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const handleSort = (column, sortDirection) => + console.log(column.selector, sortDirection) + + const { t } = props + + const columns = [ + { + name: t('Name'), + sortable: true, + selector: 'name' + }, + { + name: t('Username'), + sortable: true, + selector: 'username' + }, + { + name: t('Password'), + sortable: true, + selector: 'password' + }, + { + name: t('Phone'), + sortable: true, + selector: 'phone' + }, + { + name: t('Zone'), + selector: 'zone.title' + }, + { + name: t('Available'), + cell: row => <>{availableStatus(row)} + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + + const availableStatus = row => { + return ( + <> + {row.available} + { + mutateToggle({ variables: { id: row._id } }) + }} + style={{ color: 'black' }} + /> + + ) + } + + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + + if(PAID_VERSION) + mutateDelete({ variables: { id: row._id } }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.riders + : data && + data.riders.filter(rider => { + return ( + rider.name.toLowerCase().search(regex) > -1 || + rider.username.toLowerCase().search(regex) > -1 || + rider.phone.toLowerCase().search(regex) > -1 || + rider.zone.title.toLowerCase().search(regex) > -1 + ) + }) + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + + + + + + + + + {isOpen && ( + + )} + {/* Table */} + {errorQuery ? ( + + `Error! ${errorQuery.message}` + + ) : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + onSort={handleSort} + sortFunction={customSort} + selectableRows + customStyles={customStyles} + /> + )} + { + toggleModal() + }} + style={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }}> + + + + + ) +} + +export default withTranslation()(Riders) diff --git a/enatega-multivendor-admin/src/views/Sections.jsx b/enatega-multivendor-admin/src/views/Sections.jsx new file mode 100644 index 0000000..baf9b95 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Sections.jsx @@ -0,0 +1,288 @@ +/* eslint-disable react/display-name */ +import React, { useState } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation } from 'react-i18next' +import SectionComponent from '../components/Section/Section' +import CustomLoader from '../components/Loader/CustomLoader' + +// core components +import { deleteSection, editSection, getSections } from '../apollo' +import Header from '../components/Headers/Header' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Switch, + Typography, + ListItemIcon, + Grid +} from '@mui/material' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import SearchBar from '../components/TableHeader/SearchBar' +import { ReactComponent as SectionIcon } from '../assets/svg/svg/RestaurantSection.svg' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_SECTIONS = gql` + ${getSections} +` +const EDIT_SECTION = gql` + ${editSection} +` +const DELETE_SECTION = gql` + ${deleteSection} +` + +function Sections(props) { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [sections, setSections] = useState(null) + const [isOpen, setIsOpen] = useState(false) + const toggleModal = section => { + setEditModal(!editModal) + setSections(section) + } + + // Callback function to close the modal + const closeEditModal = () => { + setEditModal(false) + } + + const restaurantId = localStorage.getItem('restaurantId') + + const [mutateEdit] = useMutation(EDIT_SECTION) + const [mutateDelete] = useMutation(DELETE_SECTION, { + refetchQueries: [{ query: GET_SECTIONS }] + }) + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_SECTIONS, + { + variables: { id: restaurantId } + } + ) + console.log(data) + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Name'), + sortable: true, + selector: 'name' + }, + { + name: t('Status'), + sortable: false, + cell: row => <>{statusChanged(row)} + }, + { + name: t('Restaurants'), + sortable: true, + cell: row => <>{row.restaurants.map(item => `${item.name}`).join(', ')} + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + + const statusChanged = row => { + return ( + <> + {row.available} + { + mutateEdit({ + variables: { + section: { + _id: row._id, + name: row.name, + enabled: !row.enabled, + restaurants: row.restaurants + ? row.restaurants.map(r => r._id) + : [] + } + } + }) + }} + style={{ color: 'black' }} + /> + + ) + } + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + + if(PAID_VERSION) + mutateDelete({ variables: { id: row._id } }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.sections + : data && + data.sections.filter(section => { + return section.name.toLowerCase().search(regex) > -1 + }) + + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {/* Page content */} + + + + + + + + + + {isOpen && ( + + )} + + {/* Table */} + {errorQuery && `${t('Error')}! ${errorQuery.message}`} + {loadingQuery ? ( + + ) : ( + } + subHeader={true} + subHeaderComponent={ + refetch()} + /> + } + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + sortFunction={customSort} + defaultSortField="name" + customStyles={customStyles} + selectableRows + /> + )} + { + toggleModal(null) + }} + style={{ + width: '65%', + marginLeft: '18%', + overflowY: 'auto' + }}> + + + + + ) +} + +export default withTranslation()(Sections) diff --git a/enatega-multivendor-admin/src/views/SuperAdminDashboard.jsx b/enatega-multivendor-admin/src/views/SuperAdminDashboard.jsx new file mode 100644 index 0000000..06f5e64 --- /dev/null +++ b/enatega-multivendor-admin/src/views/SuperAdminDashboard.jsx @@ -0,0 +1,264 @@ +import React from 'react' +import Header from '../components/Headers/Header' +import useGlobalStyles from '../utils/globalStyles' +import { + Box, + Typography, + Container, + Grid, + ButtonBase, + useTheme +} from '@mui/material' +import RiderStat from '../assets/img/RiderStat.png' +import RestStat from '../assets/img/RestStat.png' +import VendorStat from '../assets/img/VendorStat.png' +import UserStat from '../assets/img/UserStat.png' +import { ReactComponent as DashboardIcon } from '../assets/svg/svg/dashboard.svg' +import { Line } from 'react-chartjs-2' +import { getUsers, getRiders, restaurants, getVendors } from '../apollo' +import { gql, useQuery } from '@apollo/client' +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Legend +} from 'chart.js' +import { withTranslation } from 'react-i18next' + +// const { t } = useTranslation(); + +ChartJS.register( + CategoryScale, + LinearScale, + PointElement, + LineElement, + Title, + Tooltip, + Legend +) +ChartJS.defaults.color = '#000' + +const GET_USERS = gql` + ${getUsers} +` +const GET_RIDERS = gql` + ${getRiders} +` +const GET_RESTAURANTS = gql` + ${restaurants} +` +const GET_VENDORS = gql` + ${getVendors} +` + +const SuperAdminDashboard = props => { + const { t } = props + const theme = useTheme() + console.log('superadmin props: ', props) + const globalClasses = useGlobalStyles() + const { loading: loadingVendors, data: vendors } = useQuery(GET_VENDORS) + const { data: restaurants, loading: loadingRest } = useQuery( + GET_RESTAURANTS, + { fetchPolicy: 'network-only' } + ) + const { data: riders, loading: loadingRiders } = useQuery(GET_RIDERS) + const { data: users, loading: loadingUsers } = useQuery(GET_USERS, { + variables: { page: 0 } + }) + + // Move the initialization of data inside the component + const labels = [ + t('January'), + t('February'), + t('March'), + t('April'), + t('May'), + t('June'), + t('July') + ] + + const data = { + labels, + datasets: [ + { + label: t('Restaurants'), + data: [1, 2, 3, 4, 5, 6, 7], + borderColor: theme.palette.warning.dark, + backgroundColor: theme.palette.warning.dark + }, + { + label: t('Vendors'), + data: [8, 7, 6, 5, 4, 3, 2], + borderColor: theme.palette.secondary.lightest, + backgroundColor: theme.palette.secondary.lightest + }, + { + label: t('Riders'), + data: [2, 4, 6, 8, 7, 4, 1], + borderColor: 'black', + backgroundColor: 'black' + }, + { + label: t('Users'), + data: [9, 6, 4, 2, 3, 5, 7], + borderColor: 'orange', + backgroundColor: 'orange' + } + ] + } + const sty = { + fontSize: 35, + fontWeight: 'bold', + color: theme.palette.secondary.lightest, + textAlign: 'center' + } + return ( + <> +
+ + + + + + + + {t('MainPageText')} + + + {t('MainPageText1')} + + + (window.location.href = 'https://enatega.com') + } + variant="contained" + sx={{ width: '30%' }} + className={globalClasses.button}> + {t('ViewSite')} + + + + + + + + + + + + + + + + {t('TotalUsers')} + + {loadingUsers ? '...' : users.users.length} + + stat + + + {t('TotalVendors')} + + {loadingVendors ? '...' : vendors.vendors.length} + + stat + + + {t('TotalRestaurants')} + + {loadingRest ? '...' : restaurants.restaurants.length} + + stat + + + {t('TotalRiders')} + + {loadingRiders ? '...' : riders.riders.length} + + stat + + + + + + ) +} + +const BoxCard = ({ children }) => ( + + {children} + +) + +const imgStyle = { marginLeft: '40%' } + +const headSty = { fontSize: 15, fontWeight: 'bold' } + +export default withTranslation()(SuperAdminDashboard) diff --git a/enatega-multivendor-admin/src/views/Timings.jsx b/enatega-multivendor-admin/src/views/Timings.jsx new file mode 100644 index 0000000..f6493ed --- /dev/null +++ b/enatega-multivendor-admin/src/views/Timings.jsx @@ -0,0 +1,254 @@ +/* eslint-disable react/display-name */ +import React, { useState, useEffect } from 'react' +import { useQuery, useMutation, gql } from '@apollo/client' +import { withTranslation, useTranslation } from 'react-i18next' +// core components +import Header from '../components/Headers/Header' +import { getRestaurantProfile, updateTimings } from '../apollo' +import TimeRangePicker from '@wojtekmaj/react-timerange-picker' +import CustomLoader from '../components/Loader/CustomLoader' +import useGlobalStyles from '../utils/globalStyles' +import { Container, Grid, Box, Button, Alert, useTheme } from '@mui/material' +import AddIcon from '@mui/icons-material/Add' +import RemoveIcon from '@mui/icons-material/Remove' +const GET_RESTAURANT_PROFILE = gql` + ${getRestaurantProfile} +` +const UPDATE_TIMINGS = gql` + ${updateTimings} +` +const Timings = props => { + const [value, onChange] = useState({}) + const restaurantId = localStorage.getItem('restaurantId') + + const [successMessage, setSuccessMessage] = useState('') + const [errorMessage, setErrorMessage] = useState('') + + const { t } = props + const onChangeTime = (day, values) => { + value[day] = values + onChange(value) + } + const getTransformedTimings = e => { + const openingTimes = Object.keys(value).map(v => { + return { + day: v, + times: value[v].map(timings => ({ + startTime: timings[0].split(':'), + endTime: timings[1].split(':') + })) + } + }) + return openingTimes + } + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_RESTAURANT_PROFILE, + { + variables: { id: restaurantId } + } + ) + const transformedTimes = {} + + const [mutate, { loading }] = useMutation(UPDATE_TIMINGS) + + data && + data.restaurant.openingTimes.forEach(value => { + transformedTimes[value.day] = value.times.map(t => [ + `${t.startTime[0]}:${t.startTime[1]}`, + `${t.endTime[0]}:${t.endTime[1]}` + ]) + }) + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {/* Page content */} + + {errorQuery ? Error! {errorQuery.message} : null} + {loadingQuery ? ( + + ) : ( + + + + {t('Days')} + + + {t('OpenTimes')} + + + + + + + + + + + {successMessage && ( + + {successMessage} + + )} + {errorMessage && ( + + {errorMessage} + + )} + + )} + + + ) +} + +export default withTranslation()(Timings) +const DayComponent = ({ day, value, onChangeTime }) => { + const { t } = useTranslation() + const theme = useTheme() + useEffect(() => { + onChangeTime(day, values) + }) + const globalClasses = useGlobalStyles() + + const [values, onChange] = useState(value) + return ( + + + {day} + + + {values.map((value, index) => ( + + { + values[index] = value + onChange([...values]) + }} + /> + {index === values.length - 1 && ( + { + e.preventDefault() + onChange([...values, ['00:00', '23:59']]) + }} + /> + )} + {values.length > 1 && ( + { + e.preventDefault() + values.splice(index, 1) + onChange([...values]) + }} + /> + )} + + ))} + {values.length === 0 && {t('ClosedAllDay')}} + + + {values.length > 0 ? ( + + ) : null} + {values.length === 0 ? ( + + ) : null} + + + ) +} diff --git a/enatega-multivendor-admin/src/views/Tipping.jsx b/enatega-multivendor-admin/src/views/Tipping.jsx new file mode 100644 index 0000000..a2ae0fc --- /dev/null +++ b/enatega-multivendor-admin/src/views/Tipping.jsx @@ -0,0 +1,35 @@ +/* eslint-disable react/display-name */ +import React from 'react' +import { withTranslation } from 'react-i18next' +import { Container, Grid } from '@mui/material' +import TippingComponent from '../components/Tipping/Tipping' +// core components +import Header from '../components/Headers/Header' +import useGlobalStyles from '../utils/globalStyles' +import { ReactComponent as TippingIcon } from '../assets/svg/svg/Tipping.svg' + +function Tipping() { + const globalClasses = useGlobalStyles() + return ( + <> +
+ {/* Page content */} + + + + + + + + + + + + ) +} + +export default withTranslation()(Tipping) diff --git a/enatega-multivendor-admin/src/views/Users.jsx b/enatega-multivendor-admin/src/views/Users.jsx new file mode 100644 index 0000000..65776a0 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Users.jsx @@ -0,0 +1,138 @@ +import React, { useState } from 'react' +import { withTranslation } from 'react-i18next' +import Header from '../components/Headers/Header' +import CustomLoader from '../components/Loader/CustomLoader' +import { useQuery, gql } from '@apollo/client' +import { getUsers } from '../apollo' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import SearchBar from '../components/TableHeader/SearchBar' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import { Box, Container } from '@mui/material' +import { ReactComponent as UserIcon } from '../assets/svg/svg/User.svg' +import TableHeader from '../components/TableHeader' + +const GET_USERS = gql` + ${getUsers} +` +const Users = props => { + const { t } = props + + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const { data, error: errorQuery, loading: loadingQuery, refetch } = useQuery( + GET_USERS, + { + variables: { page: 0 } + } + ) + const columns = [ + { + name: t('Name'), + sortable: true, + selector: 'name' + }, + { + name: t('Email'), + sortable: true, + selector: 'email', + cell: row => hiddenData(row.email, 'EMAIL') + }, + { + name: t('Phone'), + sortable: true, + selector: 'phone', + cell: row => hiddenData(row.phone, 'PHONE') + } + ] + + const hiddenData = (cell, column) => { + if (column === 'EMAIL') { + if (cell != null) { + const splitArray = cell.split('@') + splitArray.splice(0, 1, '*'.repeat(splitArray[0].length)) + const star = splitArray.join('@') + return star + } else { + return '*' + } + } else if (column === 'PHONE') { + const star = '*'.repeat(cell.length) + return star + } + } + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const handleSort = (column, sortDirection) => + console.log(column.selector, sortDirection) + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? data && data.users + : data && + data.users.filter(user => { + return ( + user.name.toLowerCase().search(regex) > -1 || + user.phone.toLowerCase().search(regex) > -1 || + (user.email !== null + ? user.email.toLowerCase().search(regex) > -1 + : false) + ) + }) + const globalClasses = useGlobalStyles() + return ( + <> +
+ + + + + {errorQuery ? ( + + `${t('Error')}! ${errorQuery.message}` + + ) : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + onSort={handleSort} + sortFunction={customSort} + customStyles={customStyles} + selectableRows + paginationIconLastPage="" + paginationIconFirstPage="" + /> + )} + + + ) +} +export default withTranslation()(Users) diff --git a/enatega-multivendor-admin/src/views/VendorProfile.jsx b/enatega-multivendor-admin/src/views/VendorProfile.jsx new file mode 100644 index 0000000..6386e02 --- /dev/null +++ b/enatega-multivendor-admin/src/views/VendorProfile.jsx @@ -0,0 +1,626 @@ +import React, { useState, useRef, useMemo, useEffect } from 'react' +import { validateFunc } from '../constraints/constraints' +import { withTranslation, useTranslation } from 'react-i18next' +import Header from '../components/Headers/Header' +import { useQuery, useMutation, gql } from '@apollo/client' +import { getRestaurantProfile, editRestaurant, getCuisines } from '../apollo' +import ConfigurableValues from '../config/constants' +import useStyles from '../components/Restaurant/styles' +import useGlobalStyles from '../utils/globalStyles' +import { + Box, + Alert, + Typography, + Button, + Input, + Grid, + Checkbox, + Select, + OutlinedInput, + MenuItem, + ListItemText +} from '@mui/material' +import { Container } from '@mui/system' +import CustomLoader from '../components/Loader/CustomLoader' +import InputAdornment from '@mui/material/InputAdornment' +import VisibilityIcon from '@mui/icons-material/Visibility' +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff' +import { SHOP_TYPE } from '../utils/enums' +import Dropdown from '../components/Dropdown' + +const GET_PROFILE = gql` + ${getRestaurantProfile} +` +const EDIT_RESTAURANT = gql` + ${editRestaurant} +` +const CUISINES = gql` + ${getCuisines} +` + +const ITEM_HEIGHT = 48 +const ITEM_PADDING_TOP = 8 +const MenuProps = { + PaperProps: { + style: { + maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP, + width: 250 + } + } +} + +const VendorProfile = () => { + const { CLOUDINARY_UPLOAD_URL, CLOUDINARY_FOOD } = ConfigurableValues() + + const { t } = useTranslation() + + const restaurantId = localStorage.getItem('restaurantId') + const [showPassword, setShowPassword] = useState(false) + const [imgUrl, setImgUrl] = useState('') + const [nameError, setNameError] = useState(null) + const [usernameError, setUsernameError] = useState(null) + const [passwordError, setPasswordError] = useState(null) + const [addressError, setAddressError] = useState(null) + const [prefixError, setPrefixError] = useState(null) + const [deliveryTimeError, setDeliveryTimeError] = useState(null) + const [minimumOrderError, setMinimumOrderError] = useState(null) + const [salesTaxError, setSalesTaxError] = useState(null) + const [errors, setErrors] = useState('') + const [success, setSuccess] = useState('') + const [restaurantCuisines, setRestaurantCuisines] = useState([]) + + const onCompleted = data => { + setNameError(null) + setAddressError(null) + setPrefixError(null) + setUsernameError(null) + setPasswordError(null) + setDeliveryTimeError(null) + setMinimumOrderError(null) + setSalesTaxError(null) + setErrors('') + setSuccess(t('RestaurantUpdatedSuccessfully')) + setTimeout(hideAlert, 5000) + } + + const onError = ({ graphQLErrors, networkError }) => { + setNameError(null) + setAddressError(null) + setPrefixError(null) + setUsernameError(null) + setPasswordError(null) + setDeliveryTimeError(null) + setMinimumOrderError(null) + setSalesTaxError(null) + setSuccess('') + if (graphQLErrors) { + setErrors(graphQLErrors[0].message) + } + if (networkError) { + setErrors(networkError.result.errors[0].message) + } + setTimeout(hideAlert, 5000) + } + const hideAlert = () => { + setErrors('') + setSuccess('') + } + const { data, error: errorQuery, loading: loadingQuery } = useQuery( + GET_PROFILE, + { + variables: { id: restaurantId } + } + ) + console.log('Rest data: ', data) + const [mutate, { loading }] = useMutation(EDIT_RESTAURANT, { + onError, + onCompleted, + refetchQueries: [GET_PROFILE] + }) + + const formRef = useRef(null) + + const selectImage = (event, state) => { + const result = filterImage(event) + if (result) imageToBase64(result) + } + + const filterImage = event => { + let images = [] + for (var i = 0; i < event.target.files.length; i++) { + images[i] = event.target.files.item(i) + } + images = images.filter(image => image.name.match(/\.(jpg|jpeg|png|gif)$/)) + return images.length ? images[0] : undefined + } + const imageToBase64 = imgUrl => { + const fileReader = new FileReader() + fileReader.onloadend = () => { + setImgUrl(fileReader.result) + } + fileReader.readAsDataURL(imgUrl) + } + const uploadImageToCloudinary = async() => { + if (imgUrl === '') return imgUrl + + const apiUrl = CLOUDINARY_UPLOAD_URL + const data = { + file: imgUrl, + upload_preset: CLOUDINARY_FOOD + } + try { + const result = await fetch(apiUrl, { + body: JSON.stringify(data), + headers: { + 'content-type': 'application/json' + }, + method: 'POST' + }) + const imageData = await result.json() + return imageData.secure_url + } catch (e) { + console.log(e) + } + } + + const onSubmitValidaiton = data => { + const form = formRef.current + const name = form.name.value + const address = form.address.value + const username = form.username.value + const password = form.password.value + // IMPORTANT!!!! + const prefix = form.prefix.value + const deliveryTime = form.deliveryTime.value + const minimumOrder = form.minimumOrder.value + const salesTax = +form.salesTax.value + + const nameErrors = !validateFunc({ name }, 'name') + const addressErrors = !validateFunc({ address }, 'address') + const prefixErrors = !validateFunc({ prefix: prefix }, 'prefix') + const deliveryTimeErrors = !validateFunc( + { deliveryTime: deliveryTime }, + 'deliveryTime' + ) + const minimumOrderErrors = !validateFunc( + { minimumOrder: minimumOrder }, + 'minimumOrder' + ) + const usernameErrors = !validateFunc({ name: username }, 'name') + const passwordErrors = !validateFunc({ password }, 'password') + const salesTaxError = !validateFunc({ salesTax }, 'salesTax') + setNameError(nameErrors) + setAddressError(addressErrors) + setPrefixError(prefixErrors) + setUsernameError(usernameErrors) + setPasswordError(passwordErrors) + setDeliveryTimeError(deliveryTimeErrors) + setMinimumOrderError(minimumOrderErrors) + setSalesTaxError(salesTaxError) + if ( + !( + nameErrors && + addressErrors && + prefixErrors && + usernameErrors && + passwordErrors && + deliveryTimeErrors && + minimumOrderErrors && + salesTaxError + ) + ) { + setErrors(t('FieldsRequired')) + } + return ( + nameErrors && + addressErrors && + prefixErrors && + usernameErrors && + passwordErrors && + deliveryTimeErrors && + minimumOrderErrors && + salesTaxError + ) + } + + const { data: cuisines } = useQuery(CUISINES) + const cuisinesInDropdown = useMemo( + () => cuisines?.cuisines?.map(item => item.name), + [cuisines] + ) + const handleCuisineChange = event => { + const { + target: { value } + } = event + setRestaurantCuisines( + typeof value === 'string' ? value.split(',') : value + ) + } + + useEffect(()=>{ + setRestaurantCuisines(data?.restaurant?.cuisines) + },[data?.restaurant?.cuisines]) + + const classes = useStyles() + const globalClasses = useGlobalStyles() + return ( + <> +
+ + + + + + {t('UpdateProfile')} + + + + {errorQuery && {errorQuery.message}} + {loadingQuery ? ( + + ) : ( + +
+ + + + + {t('RestaurantUsername')} + + { + if (event.target.value.includes(' ')) { + const usernameWithoutSpaces = event.target.value.replace( + / /g, + '' + ) + event.target.value = usernameWithoutSpaces + } + }} + /> + + + + + + {t('Password')} + + + setShowPassword(!showPassword)} + color="primary" + icon={} + checkedIcon={} + /> + + } + /> + + + + + + + + + {t('Name')} + + + + + + + + {t('Address')} + + + + + + + + + + + {t('DeliveryTime')} + + + + + + + + {t('MinOrder')} + + + + + + + + + + {t('SalesTax')} + + + + + + + + {t('OrderPrefix')} + + + + + + + + + + + {t('Cuisines')} + + + + + + + ... + + { + selectImage(event, 'image_url') + }} + /> + + + + +
+ + {success && ( + + {success} + + )} + {errors && ( + + {errors} + + )} + +
+ )} +
+
+ + ) +} +export default withTranslation()(VendorProfile) diff --git a/enatega-multivendor-admin/src/views/Vendors.jsx b/enatega-multivendor-admin/src/views/Vendors.jsx new file mode 100644 index 0000000..efb2607 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Vendors.jsx @@ -0,0 +1,271 @@ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { gql, useMutation, useQuery } from '@apollo/client' +import Header from '../components/Headers/Header' +import VendorComponent from '../components/Vendor/Vendor' +import CustomLoader from '../components/Loader/CustomLoader' +import { getVendors, deleteVendor } from '../apollo' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import SearchBar from '../components/TableHeader/SearchBar' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import { + Container, + Button, + Grid, + Modal, + MenuItem, + IconButton, + Menu, + ListItemIcon, + Typography, + Paper, + useTheme +} from '@mui/material' +import { ReactComponent as VendorIcon } from '../assets/svg/svg/Vendors.svg' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_VENDORS = gql` + ${getVendors} +` +const DELETE_VENDOR = gql` + ${deleteVendor} +` +const Vendors = props => { + const theme = useTheme() + const {PAID_VERSION} = ConfigurableValues() + const { t } = props + const [editModal, setEditModal] = useState(false) + const [vendors, setVendor] = useState(null) + const [isOpen, setIsOpen] = useState(false) + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const golbalClasses = useGlobalStyles() + + const closeEditModal = () => { + setEditModal(false) + } + + const { loading: loadingQuery, error: errorQuery, data, refetch } = useQuery( + GET_VENDORS + ) + const [mutate, { loading }] = useMutation(DELETE_VENDOR, { + refetchQueries: [{ query: GET_VENDORS }] + }) + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? data && data.vendors + : data && + data.vendors.filter(vendor => { + return vendor.email.toLowerCase().search(regex) > -1 + }) + + const toggleModal = vendor => { + setEditModal(!editModal) + setVendor(vendor) + } + + useEffect(() => { + localStorage.removeItem('restaurant_id') + }, []) + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Email'), + sortable: true, + selector: 'email' + }, + { + name: t('TotalRestaurants'), + sortable: true, + cell: row => <>{row.restaurants.length} + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> + +
+ + + + + + { + e.preventDefault() + if(PAID_VERSION) + toggleModal(row); + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + if(PAID_VERSION) + mutate({ variables: { id: row._id } }); + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + return ( + <> +
+ {isOpen && ( + + )} + + + + {/* */} + + + + + + + + + {errorQuery ? `Error! ${errorQuery.message}` : null} + {loadingQuery ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loading} + progressComponent={} + sortFunction={customSort} + defaultSortField="email" + customStyles={customStyles} + selectableRows + /> + )} + { + toggleModal() + }}> + + + + + ) +} + +export default withTranslation()(Vendors) diff --git a/enatega-multivendor-admin/src/views/WithdrawRequest.jsx b/enatega-multivendor-admin/src/views/WithdrawRequest.jsx new file mode 100644 index 0000000..4e53629 --- /dev/null +++ b/enatega-multivendor-admin/src/views/WithdrawRequest.jsx @@ -0,0 +1,181 @@ +import { useQuery, gql, useMutation } from '@apollo/client' +import React, { useState } from 'react' +import CustomLoader from '../components/Loader/CustomLoader' +import DataTable from 'react-data-table-component' +import { updateWithdrawReqStatus, withdrawRequestQuery } from '../apollo' +import Header from '../components/Headers/Header' +import { Box, Container, MenuItem, Select } from '@mui/material' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import SearchBar from '../components/TableHeader/SearchBar' +import { ReactComponent as WithdrawIcon } from '../assets/svg/svg/Request.svg' +import TableHeader from '../components/TableHeader' +import { withTranslation, useTranslation } from 'react-i18next' + +function WithdrawRequest() { + const { t } = useTranslation() + const [searchQuery, setSearchQuery] = useState('') + const onChangeSearch = e => setSearchQuery(e.target.value) + const { loading, error, data } = useQuery( + gql` + ${withdrawRequestQuery} + ` + ) + const [updateStatus] = useMutation( + gql` + ${updateWithdrawReqStatus} + ` + ) + + const handleSort = (column, sortDirection) => + console.log(column.selector, sortDirection) + + const columns = [ + { + name: t('RequestID'), + selector: 'requestId' + }, + { + name: t('Rider'), + sortable: true, + selector: 'rider', + cell: row => <>{row.rider ? row.rider.name : null} + }, + + { + name: t('Amount'), + selector: 'requestAmount' + }, + { + name: t('Date'), + selector: 'requestTime', + cell: row => <>{new Date(row.requestTime).toDateString()} + }, + { + name: t('Status'), + selector: 'status', + cell: row => ( +
+ {row.status} +
+ {updateRequestStatus(row)} +
+ ) + } + ] + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + const filtered = + searchQuery.length < 3 + ? data && data.getAllWithdrawRequests.data + : data && + data.getAllWithdrawRequests.data.filter(request => { + return ( + request.requestId.toLowerCase().search(regex) > -1 || + request.rider.name.toLowerCase().search(regex) > -1 + ) + }) + + const updateRequestStatus = row => { + return ( + <> + + + ) + } + const globalClasses = useGlobalStyles() + + return ( + <> +
+ + + + + {error ? `Error! ${error.message}` : null} + {loading ? ( + + ) : ( + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loading} + progressComponent={} + onSort={handleSort} + selectableRows + customStyles={customStyles} + /> + )} + + + ) +} +export default withTranslation()(WithdrawRequest) diff --git a/enatega-multivendor-admin/src/views/Zone.jsx b/enatega-multivendor-admin/src/views/Zone.jsx new file mode 100644 index 0000000..482dc03 --- /dev/null +++ b/enatega-multivendor-admin/src/views/Zone.jsx @@ -0,0 +1,227 @@ +/* eslint-disable react/display-name */ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { + Container, + IconButton, + Menu, + MenuItem, + Modal, + Paper, + Typography, + ListItemIcon +} from '@mui/material' +import { gql, useQuery, useMutation } from '@apollo/client' +import Header from '../components/Headers/Header' +import ZoneComponent from '../components/Zone/Zone' +import CustomLoader from '../components/Loader/CustomLoader' +import { getZones, deleteZone } from '../apollo' +import DataTable from 'react-data-table-component' +import orderBy from 'lodash/orderBy' +import SearchBar from '../components/TableHeader/SearchBar' +import { customStyles } from '../utils/tableCustomStyles' +import useGlobalStyles from '../utils/globalStyles' +import MoreVertIcon from '@mui/icons-material/MoreVert' +import EditIcon from '@mui/icons-material/Edit' +import DeleteIcon from '@mui/icons-material/Delete' +import TableHeader from '../components/TableHeader' +import Alert from '../components/Alert' +import ConfigurableValues from '../config/constants' + +const GET_ZONES = gql` + ${getZones} +` +const DELETE_ZONE = gql` + ${deleteZone} +` + +const Zones = props => { + const { t } = props + const {PAID_VERSION} = ConfigurableValues() + const [editModal, setEditModal] = useState(false) + const [zones, setZone] = useState(null) + const [searchQuery, setSearchQuery] = useState('') + const [isOpen, setIsOpen] = useState(false) + const onChangeSearch = e => setSearchQuery(e.target.value) + + const [mutate, { error, loading }] = useMutation(DELETE_ZONE, { + refetchQueries: [{ query: GET_ZONES }] + }) + const { data, loading: loadingQuery, refetch } = useQuery(GET_ZONES) + const toggleModal = zone => { + setEditModal(!editModal) + setZone(zone) + } + const closeEditModal = () => { + setEditModal(false) + } + + useEffect(() => { + localStorage.removeItem('restaurant_id') + }, []) + + const customSort = (rows, field, direction) => { + const handleField = row => { + if (row[field]) { + return row[field].toLowerCase() + } + + return row[field] + } + + return orderBy(rows, handleField, direction) + } + + const columns = [ + { + name: t('Title'), + sortable: true, + selector: 'title' + }, + { + name: t('Description'), + sortable: true, + selector: 'description' + }, + { + name: t('Action'), + cell: row => <>{actionButtons(row)} + } + ] + const actionButtons = row => { + const [anchorEl, setAnchorEl] = React.useState(null) + const open = Boolean(anchorEl) + const handleClick = event => { + setAnchorEl(event.currentTarget) + } + const handleClose = () => { + setAnchorEl(null) + } + return ( + <> +
+ + + + + + { + e.preventDefault() + if(PAID_VERSION) + toggleModal(row) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 5000) + } + }} + style={{ height: 25 }}> + + + + {t('Edit')} + + { + e.preventDefault() + if(PAID_VERSION) + mutate({ variables: { id: row._id } }) + else{ + setIsOpen(true) + setTimeout(() => { + setIsOpen(false) + }, 2000) + } + }} + style={{ height: 25 }}> + + + + {t('Delete')} + + + +
+ + ) + } + + const regex = + searchQuery.length > 2 ? new RegExp(searchQuery.toLowerCase(), 'g') : null + + const filtered = + searchQuery.length < 3 + ? data && data.zones + : data && + data.zones.filter(zone => { + return ( + zone.title.toLowerCase().search(regex) > -1 || + zone.description.toLowerCase().search(regex) > -1 + ) + }) + + const globalClasses = useGlobalStyles() + + return ( + <> +
+ {/* Page content */} + + + {/* Table */} + {isOpen && ( + + )} + {error ? {`Error! ${error.message}`} : null} + {loading ? : null} + refetch()} + /> + } + title={} + columns={columns} + data={filtered} + pagination + progressPending={loadingQuery} + progressComponent={} + sortFunction={customSort} + defaultSortField="title" + customStyles={customStyles} + selectableRows + /> + { + toggleModal() + }}> + + + + + ) +} + +export default withTranslation()(Zones) diff --git a/enatega-multivendor-app/.eslintrc.json b/enatega-multivendor-app/.eslintrc.json new file mode 100644 index 0000000..03e0089 --- /dev/null +++ b/enatega-multivendor-app/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "settings":{ + "react": { + "pragma": "React", + "version": "detect" + } + }, + "env": { + "browser": true, + "es6": true + }, + "extends": [ + "plugin:react/recommended", + "standard" + ], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 11, + "sourceType": "module" + }, + "plugins": [ + "react" + ], + "rules": { + "space-before-function-paren": ["error", { + "anonymous": "never", + "named": "never", + "asyncArrow": "never" + }], + "react/prop-types": 0 + } +} diff --git a/enatega-multivendor-app/.gitignore b/enatega-multivendor-app/.gitignore new file mode 100644 index 0000000..f1c3ad8 --- /dev/null +++ b/enatega-multivendor-app/.gitignore @@ -0,0 +1,60 @@ +/node_modules +# @generated expo-cli sync-2138f1e3e130677ea10ea873f6d498e3890e677b +# The following patterns were generated by expo-cli + +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore +!debug.keystore + +# Bundle artifacts +*.jsbundle + +# CocoaPods +/ios/Pods/ + +# Expo +.expo/ +web-build/ + +# @end expo-cli \ No newline at end of file diff --git a/enatega-multivendor-app/.npmrc b/enatega-multivendor-app/.npmrc new file mode 100644 index 0000000..e9ee3cb --- /dev/null +++ b/enatega-multivendor-app/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true \ No newline at end of file diff --git a/enatega-multivendor-app/.prettierrc.js b/enatega-multivendor-app/.prettierrc.js new file mode 100644 index 0000000..2fc75e2 --- /dev/null +++ b/enatega-multivendor-app/.prettierrc.js @@ -0,0 +1 @@ +module.exports = 'prettier-config-standard' diff --git a/enatega-multivendor-app/App.js b/enatega-multivendor-app/App.js new file mode 100644 index 0000000..3e10c7e --- /dev/null +++ b/enatega-multivendor-app/App.js @@ -0,0 +1,242 @@ +import React, { useState, useEffect, useReducer } from 'react' +import AppContainer from './src/routes' +import * as Notifications from 'expo-notifications' +import * as Font from 'expo-font' +import 'react-native-gesture-handler' +import * as SplashScreen from 'expo-splash-screen' +// import * as Sentry from 'sentry-expo' +import { + BackHandler, + Platform, + StatusBar, + LogBox, + StyleSheet, + ActivityIndicator +} from 'react-native' +import { ApolloProvider } from '@apollo/client' +import { exitAlert } from './src/utils/androidBackButton' +import FlashMessage from 'react-native-flash-message' +import setupApolloClient from './src/apollo/index' +import ThemeReducer from './src/ui/ThemeReducer/ThemeReducer' +import ThemeContext from './src/ui/ThemeContext/ThemeContext' +import { ConfigurationProvider } from './src/context/Configuration' +import { UserProvider } from './src/context/User' +import { AuthProvider } from './src/context/Auth' +import { theme as Theme } from './src/utils/themeColors' +import { LocationContext } from './src/context/Location' +import AsyncStorage from '@react-native-async-storage/async-storage' +import 'expo-dev-client' +import useEnvVars, { isProduction } from './environment' +import { requestTrackingPermissions } from './src/utils/useAppTrackingTrasparency' +import { OrdersProvider } from './src/context/Orders' +import { MessageComponent } from './src/components/FlashMessage/MessageComponent' +import * as Updates from 'expo-updates' + +LogBox.ignoreLogs([ + 'Warning: ...', + 'Sentry Logger ', + 'Constants.deviceYearClass' +]) // Ignore log notification by message +LogBox.ignoreAllLogs() // Ignore all log notifications + +// Default Theme +const themeValue = 'Pink' + +export default function App() { + const [appIsReady, setAppIsReady] = useState(false) + const [location, setLocation] = useState(null) + // Theme Reducer + const [theme, themeSetter] = useReducer(ThemeReducer, themeValue) + const [isUpdating, setIsUpdating] = useState(false) + + useEffect(() => { + const loadAppData = async () => { + try { + await SplashScreen.preventAutoHideAsync() + } catch (e) { + console.warn(e) + } + // await i18n.initAsync() + await Font.loadAsync({ + MuseoSans300: require('./src/assets/font/MuseoSans/MuseoSans300.ttf'), + MuseoSans500: require('./src/assets/font/MuseoSans/MuseoSans500.ttf'), + MuseoSans700: require('./src/assets/font/MuseoSans/MuseoSans700.ttf') + }) + await permissionForPushNotificationsAsync() + await getActiveLocation() + BackHandler.addEventListener('hardwareBackPress', exitAlert) + + setAppIsReady(true) + } + + loadAppData() + + return () => { + BackHandler.removeEventListener('hardwareBackPress', exitAlert) + } + }, []) + + useEffect(() => { + try { + AsyncStorage.getItem('theme').then((response) => + response !== 'Pink' ? themeSetter({ type: response }) : null + ) + } catch (error) { + // Error retrieving data + console.log('Theme Error : ', error.message) + } + }, [theme]) + + useEffect(() => { + if (!appIsReady) return + + const hideSplashScreen = async () => { + await SplashScreen.hideAsync() + } + + hideSplashScreen() + }, [appIsReady]) + + useEffect(() => { + if (!location) return + + const saveLocation = async () => { + await AsyncStorage.setItem('location', JSON.stringify(location)) + } + + saveLocation() + }, [location]) + + useEffect(() => { + requestTrackingPermissions() + }, []) + + const { SENTRY_DSN } = useEnvVars() + const client = setupApolloClient() + + // useEffect(() => { + // if (SENTRY_DSN) { + // Sentry.init({ + // dsn: SENTRY_DSN, + // enableInExpoDevelopment: true, + // debug: !isProduction, + // tracesSampleRate: 1.0 // to be changed to 0.2 in production + // }) + // } + // }, [SENTRY_DSN]) + + useEffect(() => { + // eslint-disable-next-line no-undef + if (__DEV__) return + ;(async () => { + const { isAvailable } = await Updates.checkForUpdateAsync() + if (isAvailable) { + try { + setIsUpdating(true) + const { isNew } = await Updates.fetchUpdateAsync() + if (isNew) { + await Updates.reloadAsync() + } + } catch (error) { + console.log('error while updating app', JSON.stringify(error)) + } finally { + setIsUpdating(false) + } + } + })() + }, []) + + if (isUpdating) { + return ( + + + Please wait while app is updating + + + + ) + } + + async function getActiveLocation() { + try { + const locationStr = await AsyncStorage.getItem('location') + if (locationStr) { + setLocation(JSON.parse(locationStr)) + } + } catch (err) { + console.log(err) + } + } + + async function permissionForPushNotificationsAsync() { + const { status: existingStatus } = await Notifications.getPermissionsAsync() + let finalStatus = existingStatus + // only ask if permissions have not already been determined, because + // iOS won't necessarily prompt the user a second time. + if (existingStatus !== 'granted') { + // Android remote notification permissions are granted during the app + // install, so this will only ask on iOS + const { status } = await Notifications.requestPermissionsAsync() + finalStatus = status + } + + // Stop here if the user did not grant permissions + if (finalStatus !== 'granted') { + return + } + + if (Platform.OS === 'android') { + Notifications.setNotificationChannelAsync('default', { + name: 'default', + importance: Notifications.AndroidImportance.HIGH, + vibrationPattern: [0, 250, 250, 250], + lightColor: '#FF231F7C' + }) + } + } + + if (appIsReady) { + return ( + + + + + + + + + + + + + + + + + + ) + } else { + return null + } +} + +const styles = StyleSheet.create({ + flex: { + flex: 1 + }, + mainContainer: { + justifyContent: 'center', + alignItems: 'center' + } +}) diff --git a/enatega-multivendor-app/app.json b/enatega-multivendor-app/app.json new file mode 100644 index 0000000..95fd545 --- /dev/null +++ b/enatega-multivendor-app/app.json @@ -0,0 +1,118 @@ +{ + "expo": { + "name": "Enatega Multivendor", + "scheme": "enategamultivendor", + "version": "1.0.38", + "description": "Enatega is a starter kit food ordering app built in React Native using Expo for IOS and Android. It's made keeping good aesthetics in mind as well keeping the best coding practices in mind. Its fully customisable to easily help you in your next food delivery project. https://market.nativebase.io/view/react-native-food-delivery-backend-app", + "slug": "enategamultivendor", + "owner": "ninjas_code", + "currentFullName": "@ninjas_code/enategamultivendor", + "originalFullName": "@ninjas_code/enategamultivendor", + "privacy": "public", + "androidStatusBar": { + "backgroundColor": "#000" + }, + "platforms": ["ios", "android"], + "orientation": "portrait", + "icon": "./assets/icon.png", + "splash": { + "image": "./assets/splash.png", + "resizeMode": "cover", + "backgroundColor": "#6FCF97" + }, + "assetBundlePatterns": ["**/*"], + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.enatega.multivendor", + "config": { + "googleMapsApiKey": "AIzaSyCzNP5qQql2a5y8lOoO-1yj1lj_tzjVImA" + }, + "usesAppleSignIn": true, + "infoPlist": { + "NSLocationWhenInUseUsageDescription": "Allow $(PRODUCT_NAME) to use location to determine the delivery address for your orders.", + "UIBackgroundModes": ["remote-notification"], + "NSUserTrackingUsageDescription": "Allow this app to collect app-related data that can be used for tracking you or your device.", + "CFBundleURLTypes": [ + { + "CFBundleURLSchemes": [ + "com.googleusercontent.apps.967541328677-nf8h4ou7rhmq9fahs87p057rggo95eah" + ] + } + ] + } + }, + "notification": { + "iosDisplayInForeground": true, + "color": "#6FCF97", + "icon": "./assets/not-icon.png", + "androidMode": "default", + "androidCollapsedTitle": "Enatega Multivendor" + }, + "android": { + "versionCode": 38, + "package": "com.enatega.multivendor", + "googleServicesFile": "./google-services.json", + "config": { + "googleMaps": { + "apiKey": "AIzaSyCzNP5qQql2a5y8lOoO-1yj1lj_tzjVImA" + } + }, + "permissions": [ + "android.permission.ACCESS_FINE_LOCATION", + "android.permission.ACCESS_COARSE_LOCATION", + "android.permission.RECORD_AUDIO", + "android.permission.FOREGROUND_SERVICE" + ] + }, + "hooks": { + "postPublish": [ + { + "file": "sentry-expo/upload-sourcemaps", + "config": { + "organization": "ninjas-code", + "project": "enatega-multivendor-app", + "authToken": "744ed798e04a40a896b0269c25f945de0e166db8362e41969b64d5e07ca80e65" + } + } + ] + }, + "plugins": [ + "@react-native-google-signin/google-signin", + [ + "expo-tracking-transparency", + { + "userTrackingPermission": "Allow this app to collect app-related data that can be used for tracking you or your device." + } + ], + [ + "expo-updates", + { + "username": "ninjas_code" + } + ], + [ + "expo-image-picker", + { + "photosPermission": "The app accesses your photos to let you share them with your friends." + } + ], + [ + "expo-location", + { + "locationAlwaysAndWhenInUsePermission": "Allow $Enatega Multivendor to use your location." + } + ] + ], + "extra": { + "eas": { + "projectId": "331d4e5b-b12a-434a-92ec-d6d283dc0e46" + } + }, + "runtimeVersion": { + "policy": "sdkVersion" + }, + "updates": { + "url": "https://u.expo.dev/331d4e5b-b12a-434a-92ec-d6d283dc0e46" + } + } +} \ No newline at end of file diff --git a/enatega-multivendor-app/assets/icon.png b/enatega-multivendor-app/assets/icon.png new file mode 100644 index 0000000..b6844c3 Binary files /dev/null and b/enatega-multivendor-app/assets/icon.png differ diff --git a/enatega-multivendor-app/assets/login-icon.png b/enatega-multivendor-app/assets/login-icon.png new file mode 100644 index 0000000..9d423aa Binary files /dev/null and b/enatega-multivendor-app/assets/login-icon.png differ diff --git a/enatega-multivendor-app/assets/mobile-login.svg b/enatega-multivendor-app/assets/mobile-login.svg new file mode 100644 index 0000000..74126cb --- /dev/null +++ b/enatega-multivendor-app/assets/mobile-login.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + SING UP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-app/assets/not-icon.png b/enatega-multivendor-app/assets/not-icon.png new file mode 100644 index 0000000..53c7d7c Binary files /dev/null and b/enatega-multivendor-app/assets/not-icon.png differ diff --git a/enatega-multivendor-app/assets/splash.png b/enatega-multivendor-app/assets/splash.png new file mode 100644 index 0000000..c6d479b Binary files /dev/null and b/enatega-multivendor-app/assets/splash.png differ diff --git a/enatega-multivendor-app/babel.config.js b/enatega-multivendor-app/babel.config.js new file mode 100644 index 0000000..c2d4a14 --- /dev/null +++ b/enatega-multivendor-app/babel.config.js @@ -0,0 +1,7 @@ +module.exports = function(api) { + api.cache(true) + return { + presets: ['babel-preset-expo'], + plugins: ['react-native-reanimated/plugin'] + } +} diff --git a/enatega-multivendor-app/dist/assetmap.json b/enatega-multivendor-app/dist/assetmap.json new file mode 100644 index 0000000..11a6e24 --- /dev/null +++ b/enatega-multivendor-app/dist/assetmap.json @@ -0,0 +1 @@ +{"c90fb4585dd852a3d67af39baf923f67":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets","httpServerLocation":"/assets/node_modules/@react-navigation/elements/src/assets","width":12,"height":21,"scales":[1,1.5,2,3,4],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@1x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@1.5x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@2x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@3x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@4x.ios.png"],"hash":"c90fb4585dd852a3d67af39baf923f67","name":"back-icon","type":"png","fileHashes":["7d40544b395c5949f4646f5e150fe020","cdd04e13d4ec83ff0cd13ec8dabdc341","a132ecc4ba5c1517ff83c0fb321bc7fc","0ea69b5077e7c4696db85dbcba75b0e1","f5b790e2ac193b3d41015edb3551f9b8"]},"5223c8d9b0d08b82a5670fb5f71faf78":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets","httpServerLocation":"/assets/node_modules/@react-navigation/elements/src/assets","width":50,"height":85,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon-mask.png"],"hash":"5223c8d9b0d08b82a5670fb5f71faf78","name":"back-icon-mask","type":"png","fileHashes":["5223c8d9b0d08b82a5670fb5f71faf78"]},"2a8b5fff19012916a50a2032b5b1cf07":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets","httpServerLocation":"/assets/node_modules/@react-navigation/drawer/src/views/assets","width":24,"height":24,"scales":[1,1.5,2,3,4],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@1x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@1.5x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@2x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@3x.ios.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@4x.ios.png"],"hash":"2a8b5fff19012916a50a2032b5b1cf07","name":"toggle-drawer-icon","type":"png","fileHashes":["a4e0725c66112486cc6f4ab4e0025528","d916e34c419b7246d59efe2dc965ff75","92342ace2ac52e29a7fce51b89c2cbd0","7c519c6f00d65602c16b98bdffddc6f4","ccb993f31c04afbcca02178df04f4170"]},"3a2ba31570920eeb9b1d217cabe58315":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/AntDesign.ttf"],"hash":"3a2ba31570920eeb9b1d217cabe58315","name":"AntDesign","type":"ttf","fileHashes":["3a2ba31570920eeb9b1d217cabe58315"]},"31b5ffea3daddc69dd01a1f3d6cf63c5":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Entypo.ttf"],"hash":"31b5ffea3daddc69dd01a1f3d6cf63c5","name":"Entypo","type":"ttf","fileHashes":["31b5ffea3daddc69dd01a1f3d6cf63c5"]},"140c53a7643ea949007aa9a282153849":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/EvilIcons.ttf"],"hash":"140c53a7643ea949007aa9a282153849","name":"EvilIcons","type":"ttf","fileHashes":["140c53a7643ea949007aa9a282153849"]},"a76d309774d33d9856f650bed4292a23":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Feather.ttf"],"hash":"a76d309774d33d9856f650bed4292a23","name":"Feather","type":"ttf","fileHashes":["a76d309774d33d9856f650bed4292a23"]},"b49ae8ab2dbccb02c4d11caaacf09eab":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Fontisto.ttf"],"hash":"b49ae8ab2dbccb02c4d11caaacf09eab","name":"Fontisto","type":"ttf","fileHashes":["b49ae8ab2dbccb02c4d11caaacf09eab"]},"b06871f281fee6b241d60582ae9369b9":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/FontAwesome.ttf"],"hash":"b06871f281fee6b241d60582ae9369b9","name":"FontAwesome","type":"ttf","fileHashes":["b06871f281fee6b241d60582ae9369b9"]},"1f77739ca9ff2188b539c36f30ffa2be":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"],"hash":"1f77739ca9ff2188b539c36f30ffa2be","name":"FontAwesome5_Regular","type":"ttf","fileHashes":["1f77739ca9ff2188b539c36f30ffa2be"]},"605ed7926cf39a2ad5ec2d1f9d391d3d":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"],"hash":"605ed7926cf39a2ad5ec2d1f9d391d3d","name":"FontAwesome5_Solid","type":"ttf","fileHashes":["605ed7926cf39a2ad5ec2d1f9d391d3d"]},"3b89dd103490708d19a95adcae52210e":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf"],"hash":"3b89dd103490708d19a95adcae52210e","name":"FontAwesome5_Brands","type":"ttf","fileHashes":["3b89dd103490708d19a95adcae52210e"]},"e20945d7c929279ef7a6f1db184a4470":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Foundation.ttf"],"hash":"e20945d7c929279ef7a6f1db184a4470","name":"Foundation","type":"ttf","fileHashes":["e20945d7c929279ef7a6f1db184a4470"]},"b3263095df30cb7db78c613e73f9499a":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Ionicons.ttf"],"hash":"b3263095df30cb7db78c613e73f9499a","name":"Ionicons","type":"ttf","fileHashes":["b3263095df30cb7db78c613e73f9499a"]},"b62641afc9ab487008e996a5c5865e56":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"],"hash":"b62641afc9ab487008e996a5c5865e56","name":"MaterialCommunityIcons","type":"ttf","fileHashes":["b62641afc9ab487008e996a5c5865e56"]},"8ef52a15e44481b41e7db3c7eaf9bb83":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/MaterialIcons.ttf"],"hash":"8ef52a15e44481b41e7db3c7eaf9bb83","name":"MaterialIcons","type":"ttf","fileHashes":["8ef52a15e44481b41e7db3c7eaf9bb83"]},"f7c53c47a66934504fcbc7cc164895a7":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Octicons.ttf"],"hash":"f7c53c47a66934504fcbc7cc164895a7","name":"Octicons","type":"ttf","fileHashes":["f7c53c47a66934504fcbc7cc164895a7"]},"d2285965fe34b05465047401b8595dd0":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"],"hash":"d2285965fe34b05465047401b8595dd0","name":"SimpleLineIcons","type":"ttf","fileHashes":["d2285965fe34b05465047401b8595dd0"]},"1681f34aaca71b8dfb70756bca331eb2":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","httpServerLocation":"/assets/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Zocial.ttf"],"hash":"1681f34aaca71b8dfb70756bca331eb2","name":"Zocial","type":"ttf","fileHashes":["1681f34aaca71b8dfb70756bca331eb2"]},"6a4582aa1a054cd883065d734dfe8085":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons","httpServerLocation":"/assets/node_modules/react-native-flash-message/src/icons","width":21,"height":21,"scales":[1,2,3],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_success.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_success@2x.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_success@3x.png"],"hash":"6a4582aa1a054cd883065d734dfe8085","name":"fm_icon_success","type":"png","fileHashes":["4dbc10fd34db70b75c821f766659cb81","80286c9b992fad5b500d5a1f06434b5f","84ad3fe438ba116b007697ae568e22de"]},"b3ba8421448ed5de3c73b15c3ea0e195":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons","httpServerLocation":"/assets/node_modules/react-native-flash-message/src/icons","width":21,"height":21,"scales":[1,2,3],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_info.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_info@2x.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_info@3x.png"],"hash":"b3ba8421448ed5de3c73b15c3ea0e195","name":"fm_icon_info","type":"png","fileHashes":["9098f279a79458551f75c67a0f741e7d","dfc580f63d59d8ffbe6a62d000388e86","25be4da7236d5add94db4c612d243b2c"]},"895ec59f4e20939f7bfc6cb0b6174df3":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons","httpServerLocation":"/assets/node_modules/react-native-flash-message/src/icons","width":21,"height":21,"scales":[1,2,3],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_warning.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_warning@2x.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_warning@3x.png"],"hash":"895ec59f4e20939f7bfc6cb0b6174df3","name":"fm_icon_warning","type":"png","fileHashes":["f52efad4d6a123c4c4e09241036b80ed","da4303c980b7f993076b634937adaa6b","121f3bcfa420e77f48064983d90ea544"]},"f4c4db1327125793635a1ae504a9d8c2":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons","httpServerLocation":"/assets/node_modules/react-native-flash-message/src/icons","width":21,"height":21,"scales":[1,2,3],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_danger.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_danger@2x.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-flash-message/src/icons/fm_icon_danger@3x.png"],"hash":"f4c4db1327125793635a1ae504a9d8c2","name":"fm_icon_danger","type":"png","fileHashes":["d37ddbcd08c865194a83f47664629ccd","07ff227fc7d39db4d4903e8367fa30e9","61b13cb6db14eea1a4e083c331ef816c"]},"e8581a38282b437bf50a9c8743d5827f":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/assets","httpServerLocation":"/assets/assets","width":409,"height":449,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/assets/login-icon.png"],"hash":"e8581a38282b437bf50a9c8743d5827f","name":"login-icon","type":"png","fileHashes":["e8581a38282b437bf50a9c8743d5827f"]},"12466ff36f23f268e95685369ab6883b":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-country-picker-modal/lib/assets/images","httpServerLocation":"/assets/node_modules/react-native-country-picker-modal/lib/assets/images","width":512,"height":512,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-country-picker-modal/lib/assets/images/close.android.png"],"hash":"12466ff36f23f268e95685369ab6883b","name":"close.android","type":"png","fileHashes":["12466ff36f23f268e95685369ab6883b"]},"0dc8a49d999a851497c910bbb0afbba2":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-country-picker-modal/lib/assets/images","httpServerLocation":"/assets/node_modules/react-native-country-picker-modal/lib/assets/images","width":512,"height":512,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-country-picker-modal/lib/assets/images/close.ios.png"],"hash":"0dc8a49d999a851497c910bbb0afbba2","name":"close","type":"png","fileHashes":["0dc8a49d999a851497c910bbb0afbba2"]},"e618202c0040ec9951ab2358be0833e4":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":607,"height":400,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/food_placeholder.png"],"hash":"e618202c0040ec9951ab2358be0833e4","name":"food_placeholder","type":"png","fileHashes":["e618202c0040ec9951ab2358be0833e4"]},"bc6f01f178e592e1c7d89bbff287ede1":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":64,"height":64,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/cashIcon.png"],"hash":"bc6f01f178e592e1c7d89bbff287ede1","name":"cashIcon","type":"png","fileHashes":["bc6f01f178e592e1c7d89bbff287ede1"]},"06708dfa66ae177bea04b1e23e92c2ae":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":78,"height":72,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/delivery.png"],"hash":"06708dfa66ae177bea04b1e23e92c2ae","name":"delivery","type":"png","fileHashes":["06708dfa66ae177bea04b1e23e92c2ae"]},"53a8ad92e6ec28c9b87bb0bea1de31b6":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":64,"height":64,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/masterIcon.png"],"hash":"53a8ad92e6ec28c9b87bb0bea1de31b6","name":"masterIcon","type":"png","fileHashes":["53a8ad92e6ec28c9b87bb0bea1de31b6"]},"4f9298c63efbb6c7338566f85e7d6f6b":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":64,"height":64,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/visaIcon.png"],"hash":"4f9298c63efbb6c7338566f85e7d6f6b","name":"visaIcon","type":"png","fileHashes":["4f9298c63efbb6c7338566f85e7d6f6b"]},"07d2c72d160870ec4b049291d3454847":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":64,"height":64,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/paypal.png"],"hash":"07d2c72d160870ec4b049291d3454847","name":"paypal","type":"png","fileHashes":["07d2c72d160870ec4b049291d3454847"]},"0c87a71d9f13708bc2afb77a8b544a0b":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-google-places-autocomplete/images","httpServerLocation":"/assets/node_modules/react-native-google-places-autocomplete/images","width":144,"height":18,"scales":[1,2,3],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-google-places-autocomplete/images/powered_by_google_on_white.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-google-places-autocomplete/images/powered_by_google_on_white@2x.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-google-places-autocomplete/images/powered_by_google_on_white@3x.png"],"hash":"0c87a71d9f13708bc2afb77a8b544a0b","name":"powered_by_google_on_white","type":"png","fileHashes":["5e1218b10c1558a03d57e2aa7746552b","3894e74f02d02e84351781c358026d5a","cd72971a8a0413f5519e6827d89763cf"]},"1da3b2b813b00e35c95c567939d8773d":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":46,"height":51,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/user.png"],"hash":"1da3b2b813b00e35c95c567939d8773d","name":"user","type":"png","fileHashes":["1da3b2b813b00e35c95c567939d8773d"]},"2379ae894c2c9f63b852a9f3676c2763":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-paper/src/assets","httpServerLocation":"/assets/node_modules/react-native-paper/src/assets","width":63,"height":63,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/react-native-paper/src/assets/back-chevron.png"],"hash":"2379ae894c2c9f63b852a9f3676c2763","name":"back-chevron","type":"png","fileHashes":["2379ae894c2c9f63b852a9f3676c2763"]},"b59da1f6dc561a40cf8f2cc5e371916b":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images","httpServerLocation":"/assets/src/assets/images","width":34,"height":37,"scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/images/res.png"],"hash":"b59da1f6dc561a40cf8f2cc5e371916b","name":"res","type":"png","fileHashes":["b59da1f6dc561a40cf8f2cc5e371916b"]},"ee01ab27438661d75d4098c4f9239ac2":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans","httpServerLocation":"/assets/src/assets/font/MuseoSans","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans300.ttf"],"hash":"ee01ab27438661d75d4098c4f9239ac2","name":"MuseoSans300","type":"ttf","fileHashes":["ee01ab27438661d75d4098c4f9239ac2"]},"00b9402278151d933c0c4e467bb759c4":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans","httpServerLocation":"/assets/src/assets/font/MuseoSans","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans500.ttf"],"hash":"00b9402278151d933c0c4e467bb759c4","name":"MuseoSans500","type":"ttf","fileHashes":["00b9402278151d933c0c4e467bb759c4"]},"af882e20c950f9cb6443dfc4162bba53":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans","httpServerLocation":"/assets/src/assets/font/MuseoSans","scales":[1],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans700.ttf"],"hash":"af882e20c950f9cb6443dfc4162bba53","name":"MuseoSans700","type":"ttf","fileHashes":["af882e20c950f9cb6443dfc4162bba53"]},"a364dc7a784101f7c8f6791c7b4514ce":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets","httpServerLocation":"/assets/node_modules/@react-navigation/elements/src/assets","width":24,"height":24,"scales":[1,1.5,2,3,4],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@1x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@1.5x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@2x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@3x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/elements/src/assets/back-icon@4x.android.png"],"hash":"a364dc7a784101f7c8f6791c7b4514ce","name":"back-icon","type":"png","fileHashes":["778ffc9fe8773a878e9c30a6304784de","376d6a4c7f622917c39feb23671ef71d","c79c3606a1cf168006ad3979763c7e0c","02bc1fa7c0313217bde2d65ccbff40c9","35ba0eaec5a4f5ed12ca16fabeae451d"]},"8ca25a8090835447d6d606ecaac9e240":{"__packager_asset":true,"fileSystemLocation":"/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets","httpServerLocation":"/assets/node_modules/@react-navigation/drawer/src/views/assets","width":24,"height":24,"scales":[1,1.5,2,3,4],"files":["/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@1x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@1.5x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@2x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@3x.android.png","/Users/ninjascode-4/Projects/Marketplace-Food-Delivery-Solution-1/enatega-multivendor-app/node_modules/@react-navigation/drawer/src/views/assets/toggle-drawer-icon@4x.android.png"],"hash":"8ca25a8090835447d6d606ecaac9e240","name":"toggle-drawer-icon","type":"png","fileHashes":["665d9d6a3227c85fcb50f3f86ccad80c","f39b4d4f351495ad948f880253d58943","ddf6610eb512edae2ba722a7212c3ecc","a5e0abbdbd82bc804c2eb86eff046d52","ae74bb20586a731af545e6b00fe14a09"]}} \ No newline at end of file diff --git a/enatega-multivendor-app/dist/debug.html b/enatega-multivendor-app/dist/debug.html new file mode 100644 index 0000000..cc1e27e --- /dev/null +++ b/enatega-multivendor-app/dist/debug.html @@ -0,0 +1,6 @@ + + + + Open up this file in Chrome. In the JavaScript developer console, navigate to the Source tab. + You can see a red colored folder containing the original source code from your bundle. + \ No newline at end of file diff --git a/enatega-multivendor-app/dist/metadata.json b/enatega-multivendor-app/dist/metadata.json new file mode 100644 index 0000000..8ad4e57 --- /dev/null +++ b/enatega-multivendor-app/dist/metadata.json @@ -0,0 +1 @@ +{"version":0,"bundler":"metro","fileMetadata":{"ios":{"bundle":"bundles/ios-7e144155ad52f2797b61c353fbdfa771.js","assets":[{"path":"assets/7d40544b395c5949f4646f5e150fe020","ext":"png"},{"path":"assets/cdd04e13d4ec83ff0cd13ec8dabdc341","ext":"png"},{"path":"assets/a132ecc4ba5c1517ff83c0fb321bc7fc","ext":"png"},{"path":"assets/0ea69b5077e7c4696db85dbcba75b0e1","ext":"png"},{"path":"assets/f5b790e2ac193b3d41015edb3551f9b8","ext":"png"},{"path":"assets/5223c8d9b0d08b82a5670fb5f71faf78","ext":"png"},{"path":"assets/a4e0725c66112486cc6f4ab4e0025528","ext":"png"},{"path":"assets/d916e34c419b7246d59efe2dc965ff75","ext":"png"},{"path":"assets/92342ace2ac52e29a7fce51b89c2cbd0","ext":"png"},{"path":"assets/7c519c6f00d65602c16b98bdffddc6f4","ext":"png"},{"path":"assets/ccb993f31c04afbcca02178df04f4170","ext":"png"},{"path":"assets/3a2ba31570920eeb9b1d217cabe58315","ext":"ttf"},{"path":"assets/31b5ffea3daddc69dd01a1f3d6cf63c5","ext":"ttf"},{"path":"assets/140c53a7643ea949007aa9a282153849","ext":"ttf"},{"path":"assets/a76d309774d33d9856f650bed4292a23","ext":"ttf"},{"path":"assets/b49ae8ab2dbccb02c4d11caaacf09eab","ext":"ttf"},{"path":"assets/b06871f281fee6b241d60582ae9369b9","ext":"ttf"},{"path":"assets/1f77739ca9ff2188b539c36f30ffa2be","ext":"ttf"},{"path":"assets/605ed7926cf39a2ad5ec2d1f9d391d3d","ext":"ttf"},{"path":"assets/3b89dd103490708d19a95adcae52210e","ext":"ttf"},{"path":"assets/e20945d7c929279ef7a6f1db184a4470","ext":"ttf"},{"path":"assets/b3263095df30cb7db78c613e73f9499a","ext":"ttf"},{"path":"assets/b62641afc9ab487008e996a5c5865e56","ext":"ttf"},{"path":"assets/8ef52a15e44481b41e7db3c7eaf9bb83","ext":"ttf"},{"path":"assets/f7c53c47a66934504fcbc7cc164895a7","ext":"ttf"},{"path":"assets/d2285965fe34b05465047401b8595dd0","ext":"ttf"},{"path":"assets/1681f34aaca71b8dfb70756bca331eb2","ext":"ttf"},{"path":"assets/4dbc10fd34db70b75c821f766659cb81","ext":"png"},{"path":"assets/80286c9b992fad5b500d5a1f06434b5f","ext":"png"},{"path":"assets/84ad3fe438ba116b007697ae568e22de","ext":"png"},{"path":"assets/9098f279a79458551f75c67a0f741e7d","ext":"png"},{"path":"assets/dfc580f63d59d8ffbe6a62d000388e86","ext":"png"},{"path":"assets/25be4da7236d5add94db4c612d243b2c","ext":"png"},{"path":"assets/f52efad4d6a123c4c4e09241036b80ed","ext":"png"},{"path":"assets/da4303c980b7f993076b634937adaa6b","ext":"png"},{"path":"assets/121f3bcfa420e77f48064983d90ea544","ext":"png"},{"path":"assets/d37ddbcd08c865194a83f47664629ccd","ext":"png"},{"path":"assets/07ff227fc7d39db4d4903e8367fa30e9","ext":"png"},{"path":"assets/61b13cb6db14eea1a4e083c331ef816c","ext":"png"},{"path":"assets/e8581a38282b437bf50a9c8743d5827f","ext":"png"},{"path":"assets/12466ff36f23f268e95685369ab6883b","ext":"png"},{"path":"assets/0dc8a49d999a851497c910bbb0afbba2","ext":"png"},{"path":"assets/e618202c0040ec9951ab2358be0833e4","ext":"png"},{"path":"assets/bc6f01f178e592e1c7d89bbff287ede1","ext":"png"},{"path":"assets/06708dfa66ae177bea04b1e23e92c2ae","ext":"png"},{"path":"assets/53a8ad92e6ec28c9b87bb0bea1de31b6","ext":"png"},{"path":"assets/4f9298c63efbb6c7338566f85e7d6f6b","ext":"png"},{"path":"assets/07d2c72d160870ec4b049291d3454847","ext":"png"},{"path":"assets/5e1218b10c1558a03d57e2aa7746552b","ext":"png"},{"path":"assets/3894e74f02d02e84351781c358026d5a","ext":"png"},{"path":"assets/cd72971a8a0413f5519e6827d89763cf","ext":"png"},{"path":"assets/1da3b2b813b00e35c95c567939d8773d","ext":"png"},{"path":"assets/2379ae894c2c9f63b852a9f3676c2763","ext":"png"},{"path":"assets/b59da1f6dc561a40cf8f2cc5e371916b","ext":"png"},{"path":"assets/ee01ab27438661d75d4098c4f9239ac2","ext":"ttf"},{"path":"assets/00b9402278151d933c0c4e467bb759c4","ext":"ttf"},{"path":"assets/af882e20c950f9cb6443dfc4162bba53","ext":"ttf"}]},"android":{"bundle":"bundles/android-804882c4b00466ebe072ed5448a03603.js","assets":[{"path":"assets/778ffc9fe8773a878e9c30a6304784de","ext":"png"},{"path":"assets/376d6a4c7f622917c39feb23671ef71d","ext":"png"},{"path":"assets/c79c3606a1cf168006ad3979763c7e0c","ext":"png"},{"path":"assets/02bc1fa7c0313217bde2d65ccbff40c9","ext":"png"},{"path":"assets/35ba0eaec5a4f5ed12ca16fabeae451d","ext":"png"},{"path":"assets/5223c8d9b0d08b82a5670fb5f71faf78","ext":"png"},{"path":"assets/665d9d6a3227c85fcb50f3f86ccad80c","ext":"png"},{"path":"assets/f39b4d4f351495ad948f880253d58943","ext":"png"},{"path":"assets/ddf6610eb512edae2ba722a7212c3ecc","ext":"png"},{"path":"assets/a5e0abbdbd82bc804c2eb86eff046d52","ext":"png"},{"path":"assets/ae74bb20586a731af545e6b00fe14a09","ext":"png"},{"path":"assets/3a2ba31570920eeb9b1d217cabe58315","ext":"ttf"},{"path":"assets/31b5ffea3daddc69dd01a1f3d6cf63c5","ext":"ttf"},{"path":"assets/140c53a7643ea949007aa9a282153849","ext":"ttf"},{"path":"assets/a76d309774d33d9856f650bed4292a23","ext":"ttf"},{"path":"assets/b49ae8ab2dbccb02c4d11caaacf09eab","ext":"ttf"},{"path":"assets/b06871f281fee6b241d60582ae9369b9","ext":"ttf"},{"path":"assets/1f77739ca9ff2188b539c36f30ffa2be","ext":"ttf"},{"path":"assets/605ed7926cf39a2ad5ec2d1f9d391d3d","ext":"ttf"},{"path":"assets/3b89dd103490708d19a95adcae52210e","ext":"ttf"},{"path":"assets/e20945d7c929279ef7a6f1db184a4470","ext":"ttf"},{"path":"assets/b3263095df30cb7db78c613e73f9499a","ext":"ttf"},{"path":"assets/b62641afc9ab487008e996a5c5865e56","ext":"ttf"},{"path":"assets/8ef52a15e44481b41e7db3c7eaf9bb83","ext":"ttf"},{"path":"assets/f7c53c47a66934504fcbc7cc164895a7","ext":"ttf"},{"path":"assets/d2285965fe34b05465047401b8595dd0","ext":"ttf"},{"path":"assets/1681f34aaca71b8dfb70756bca331eb2","ext":"ttf"},{"path":"assets/4dbc10fd34db70b75c821f766659cb81","ext":"png"},{"path":"assets/80286c9b992fad5b500d5a1f06434b5f","ext":"png"},{"path":"assets/84ad3fe438ba116b007697ae568e22de","ext":"png"},{"path":"assets/9098f279a79458551f75c67a0f741e7d","ext":"png"},{"path":"assets/dfc580f63d59d8ffbe6a62d000388e86","ext":"png"},{"path":"assets/25be4da7236d5add94db4c612d243b2c","ext":"png"},{"path":"assets/f52efad4d6a123c4c4e09241036b80ed","ext":"png"},{"path":"assets/da4303c980b7f993076b634937adaa6b","ext":"png"},{"path":"assets/121f3bcfa420e77f48064983d90ea544","ext":"png"},{"path":"assets/d37ddbcd08c865194a83f47664629ccd","ext":"png"},{"path":"assets/07ff227fc7d39db4d4903e8367fa30e9","ext":"png"},{"path":"assets/61b13cb6db14eea1a4e083c331ef816c","ext":"png"},{"path":"assets/e8581a38282b437bf50a9c8743d5827f","ext":"png"},{"path":"assets/12466ff36f23f268e95685369ab6883b","ext":"png"},{"path":"assets/0dc8a49d999a851497c910bbb0afbba2","ext":"png"},{"path":"assets/e618202c0040ec9951ab2358be0833e4","ext":"png"},{"path":"assets/bc6f01f178e592e1c7d89bbff287ede1","ext":"png"},{"path":"assets/06708dfa66ae177bea04b1e23e92c2ae","ext":"png"},{"path":"assets/53a8ad92e6ec28c9b87bb0bea1de31b6","ext":"png"},{"path":"assets/4f9298c63efbb6c7338566f85e7d6f6b","ext":"png"},{"path":"assets/07d2c72d160870ec4b049291d3454847","ext":"png"},{"path":"assets/5e1218b10c1558a03d57e2aa7746552b","ext":"png"},{"path":"assets/3894e74f02d02e84351781c358026d5a","ext":"png"},{"path":"assets/cd72971a8a0413f5519e6827d89763cf","ext":"png"},{"path":"assets/1da3b2b813b00e35c95c567939d8773d","ext":"png"},{"path":"assets/2379ae894c2c9f63b852a9f3676c2763","ext":"png"},{"path":"assets/b59da1f6dc561a40cf8f2cc5e371916b","ext":"png"},{"path":"assets/ee01ab27438661d75d4098c4f9239ac2","ext":"ttf"},{"path":"assets/00b9402278151d933c0c4e467bb759c4","ext":"ttf"},{"path":"assets/af882e20c950f9cb6443dfc4162bba53","ext":"ttf"}]}}} \ No newline at end of file diff --git a/enatega-multivendor-app/eas.json b/enatega-multivendor-app/eas.json new file mode 100644 index 0000000..37207f5 --- /dev/null +++ b/enatega-multivendor-app/eas.json @@ -0,0 +1,38 @@ +{ + "build": { + "development": { + "developmentClient": true, + "distribution": "internal", + "android": { + "buildType": "apk" + }, + "ios": { + "simulator": true + } + }, + "staging": { + "developmentClient": false, + "releaseChannel": "staging", + "distribution": "internal" + }, + "production": { + "channel": "production" + } + }, + "submit": { + "production": { + "android": { + "serviceAccountKeyPath": "./google-service-account.json", + "track": "production" + }, + "ios": { + "appleId": "sharan.gohar@icloud.com", + "ascAppId": "1526488093", + "appleTeamId": "GDFK7MVY6P" + } + } + }, + "cli": { + "version": ">= 0.43.0" + } +} diff --git a/enatega-multivendor-app/environment.js b/enatega-multivendor-app/environment.js new file mode 100644 index 0000000..a0665ea --- /dev/null +++ b/enatega-multivendor-app/environment.js @@ -0,0 +1,51 @@ +// /***************************** +// * environment.js +// * path: '/environment.js' (root of your project) +// ******************************/ + +import { useContext } from 'react' +import ConfigurationContext from './src/context/Configuration' +import * as Updates from 'expo-updates' + +const useEnvVars = (env = Updates.releaseChannel) => { + const configuration = useContext(ConfigurationContext) + + if (env === 'production' || env === 'staging') { + return { + GRAPHQL_URL: 'https://enatega-multivendor.up.railway.app/graphql', + WS_GRAPHQL_URL: 'wss://enatega-multivendor.up.railway.app/graphql', + SERVER_URL: 'https://enatega-multivendor.up.railway.app/', + IOS_CLIENT_ID_GOOGLE: configuration.iosClientIdGoogle, + ANDROID_CLIENT_ID_GOOGLE: configuration.androidClientIdGoogle, + AMPLITUDE_API_KEY: configuration.appAmplitudeApiKey, + GOOGLE_MAPS_KEY: configuration.googleApiKey, + EXPO_CLIENT_ID: configuration.expoClientId, + SENTRY_DSN: configuration.customerAppSentryUrl, + TERMS_AND_CONDITIONS: configuration.termsAndConditions, + PRIVACY_POLICY: configuration.privacyPolicy, + TEST_OTP: configuration.testOtp, + GOOGLE_PACES_API_BASE_URL: configuration.googlePlacesApiBaseUrl + } + } + + return { + GRAPHQL_URL: 'https://enatega-multivendor.up.railway.app/graphql', + WS_GRAPHQL_URL: 'wss://enatega-multivendor.up.railway.app/graphql', + SERVER_URL: 'https://enatega-multivendor.up.railway.app/', + // GRAPHQL_URL: 'http://10.97.37.244:8001/graphql', + // WS_GRAPHQL_URL: 'ws://10.97.37.244:8001/graphql', + // SERVER_URL: 'http://10.97.37.244:8001/', + IOS_CLIENT_ID_GOOGLE: configuration.iOSClientID, + ANDROID_CLIENT_ID_GOOGLE: configuration.androidClientID, + AMPLITUDE_API_KEY: configuration.appAmplitudeApiKey, + GOOGLE_MAPS_KEY: configuration.googleApiKey, + EXPO_CLIENT_ID: configuration.expoClientID, + SENTRY_DSN: configuration.customerAppSentryUrl, + TERMS_AND_CONDITIONS: configuration.termsAndConditions, + PRIVACY_POLICY: configuration.privacyPolicy, + TEST_OTP: configuration.testOtp, + GOOGLE_PACES_API_BASE_URL: configuration.googlePlacesApiBaseUrl + } +} + +export default useEnvVars diff --git a/enatega-multivendor-app/environment.js.example b/enatega-multivendor-app/environment.js.example new file mode 100644 index 0000000..546ee39 --- /dev/null +++ b/enatega-multivendor-app/environment.js.example @@ -0,0 +1,38 @@ +/***************************** +* environment.js +* path: '/environment.js' (root of your project) +******************************/ + +import Constants from 'expo-constants'; + +const ENV = { + development: { + GRAPHQL_URL:'' , + SERVER_URL: '', // put / at the end of server url + IOS_CLIENT_ID_GOOGLE: "", + ANDROID_CLIENT_ID_GOOGLE: "", + AMPLITUDE_API_KEY: "", + }, + production: { + GRAPHQL_URL:'' , + SERVER_URL: '', // put / at the end of server url + IOS_CLIENT_ID_GOOGLE: "", + ANDROID_CLIENT_ID_GOOGLE: "", + AMPLITUDE_API_KEY: "", + } +}; + +const getEnvVars = (env = Constants.manifest.releaseChannel) => { + // What is __DEV__ ? + // This variable is set to true when react-native is running in Dev mode. + // __DEV__ is true when run locally, but false when published. + if (__DEV__) { + return ENV.development; + } else if (env === 'production') { + return ENV.production; + } else { + return ENV.development; + } +}; + +export default getEnvVars; \ No newline at end of file diff --git a/enatega-multivendor-app/i18next.js b/enatega-multivendor-app/i18next.js new file mode 100644 index 0000000..5657636 --- /dev/null +++ b/enatega-multivendor-app/i18next.js @@ -0,0 +1,45 @@ +import i18next from 'i18next' +import { initReactI18next } from 'react-i18next' +import * as Localization from 'expo-localization' +import { Platform } from 'react-native' +import { en } from './translations/en' +import { de } from './translations/de' +import { fr } from './translations/fr' +import { km } from './translations/km' +import { zh } from './translations/zh' +import { ar } from './translations/ar' +import AsyncStorage from '@react-native-async-storage/async-storage' +export const languageResources = { + en: { translation: en }, + zh: { translation: zh }, + de: { translation: de }, + fr: { translation: fr }, + km: { translation: km }, + ar: { translation: ar } +} +const getStoredLanguage = async () => { + const lng = await AsyncStorage.getItem('enatega-language') + console.log(lng) + i18next.use(initReactI18next).init({ + compatibilityJSON: 'v3', + lng: lng, + fallbackLng: 'en', + resources: languageResources + }) +} +if (Platform.OS === 'android') { + getStoredLanguage() +} +if (Platform.OS === 'ios') { + i18next.locale = Localization.locale + i18next.use(initReactI18next).init({ + compatibilityJSON: 'v3', + lng: i18next.locale, + fallbackLng: 'en', + resources: languageResources + }) + + i18next.changeLanguage(i18next.locale) +} + +export default i18next diff --git a/enatega-multivendor-app/index.js b/enatega-multivendor-app/index.js new file mode 100644 index 0000000..ef3e322 --- /dev/null +++ b/enatega-multivendor-app/index.js @@ -0,0 +1,11 @@ +import 'expo-dev-client' + +import 'react-native-gesture-handler' +import { registerRootComponent } from 'expo' + +import App from './App' + +// registerRootComponent calls AppRegistry.registerComponent('main', () => App); +// It also ensures that whether you load the app in Expo Go or in a native build, +// the environment is set up appropriately +registerRootComponent(App) diff --git a/enatega-multivendor-app/metro.config.js b/enatega-multivendor-app/metro.config.js new file mode 100644 index 0000000..039dc76 --- /dev/null +++ b/enatega-multivendor-app/metro.config.js @@ -0,0 +1,4 @@ +const { getDefaultConfig } = require('@expo/metro-config') +const defaultConfig = getDefaultConfig(__dirname) +defaultConfig.resolver.sourceExts.push('cjs') +module.exports = defaultConfig diff --git a/enatega-multivendor-app/package-lock.json b/enatega-multivendor-app/package-lock.json new file mode 100644 index 0000000..5b3dbd0 --- /dev/null +++ b/enatega-multivendor-app/package-lock.json @@ -0,0 +1,18058 @@ +{ + "name": "enatega-full-app", + "version": "5.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "enatega-full-app", + "version": "5.0.0", + "hasInstallScript": true, + "dependencies": { + "@amplitude/analytics-react-native": "^1.1.1", + "@apollo/client": "^3.5.6", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@expo/vector-icons": "^14.0.0", + "@react-native-async-storage/async-storage": "1.21.0", + "@react-native-community/datetimepicker": "7.6.1", + "@react-native-google-signin/google-signin": "^11.0.0", + "@react-navigation/drawer": "^6.3.0", + "@react-navigation/elements": "^1.2.1", + "@react-navigation/native": "^6.0.6", + "@react-navigation/stack": "^6.0.11", + "@sentry/react-native": "5.17.0", + "@twotalltotems/react-native-otp-input": "^1.3.11", + "core-js": "^3.33.3", + "deprecated-react-native-prop-types": "^5.0.0", + "expo": "~50.0.3", + "expo-apple-authentication": "~6.3.0", + "expo-application": "~5.8.3", + "expo-constants": "~15.4.5", + "expo-crypto": "~12.8.0", + "expo-dev-client": "~3.3.8", + "expo-device": "~5.9.3", + "expo-font": "~11.10.2", + "expo-image-picker": "~14.7.1", + "expo-linking": "~6.2.2", + "expo-localization": "~14.8.3", + "expo-location": "~16.5.2", + "expo-notifications": "~0.27.5", + "expo-random": "~13.6.0", + "expo-splash-screen": "~0.26.4", + "expo-system-ui": "~2.9.3", + "expo-tracking-transparency": "~3.3.0", + "expo-updates": "~0.24.10", + "expo-web-browser": "~12.8.2", + "graphql": "^16.8.1", + "graphql-tag": "^2.10.1", + "i18n-js": "^4.3.2", + "i18next": "^23.7.6", + "install": "^0.13.0", + "moment": "^2.29.1", + "patch-package": "^8.0.0", + "react": "18.2.0", + "react-i18next": "^14.0.1", + "react-native": "0.73.4", + "react-native-button": "^3.0.1", + "react-native-country-picker-modal": "^2.0.0", + "react-native-flash-message": "^0.4.2", + "react-native-gesture-handler": "~2.14.0", + "react-native-gifted-chat": "^2.4.0", + "react-native-google-places-autocomplete": "^2.1.1", + "react-native-maps": "1.10.0", + "react-native-material-textfield": "^0.16.1", + "react-native-modal": "^13.0.1", + "react-native-modalize": "^2.0.13", + "react-native-paper": "^5.8.0", + "react-native-phone-number-input": "^2.1.0", + "react-native-reanimated": "~3.6.2", + "react-native-safe-area-context": "4.8.2", + "react-native-screens": "~3.29.0", + "react-native-star-rating": "^1.1.0", + "react-native-svg": "14.1.0", + "react-native-webview": "13.6.4", + "react-navigation-collapsible": "^6.3.0", + "rn-placeholder": "^3.0.1", + "sentry-expo": "~7.2.0", + "subscriptions-transport-ws": "^0.11.0", + "uglify-js": "^3.17.4", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@expo/metro-config": "^0.17.3", + "babel-preset-expo": "^10.0.0", + "babel-preset-react-native": "^4.0.1", + "eslint": "^8.56.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.20.0", + "eslint-plugin-standard": "^5.0.0", + "husky": "^8.0.3", + "lint-staged": "^15.2.0", + "metro-react-native-babel-preset": "^0.77.0", + "prettier": "^3.2.4", + "prettier-config-standard": "^7.0.0", + "react-test-renderer": "^18.2.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@amplitude/analytics-client-common": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-client-common/-/analytics-client-common-1.2.2.tgz", + "integrity": "sha512-vwGgVXl9FKEi99OzjqqhX8RrulQQ55aAllhgbdyxpyyAQ5NbbZOPdrxp1ow0oliCVvbSDgUYOAeAwTChIgnStA==", + "dependencies": { + "@amplitude/analytics-connector": "^1.5.0", + "@amplitude/analytics-core": "^1.2.5", + "@amplitude/analytics-types": "^1.3.4", + "tslib": "^2.4.1" + } + }, + "node_modules/@amplitude/analytics-connector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-connector/-/analytics-connector-1.5.0.tgz", + "integrity": "sha512-T8mOYzB9RRxckzhL0NTHwdge9xuFxXEOplC8B1Y3UX3NHa3BLh7DlBUZlCOwQgMc2nxDfnSweDL5S3bhC+W90g==" + }, + "node_modules/@amplitude/analytics-core": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-core/-/analytics-core-1.2.5.tgz", + "integrity": "sha512-V7CVlHVN+1diKiOpdp2bCPZ0mbS4CmUYF+v+eXDwVfJL3M/t3sVcT1apXnmVYGYi14cGu9hQOD11rD6qKbUOsw==", + "dependencies": { + "@amplitude/analytics-types": "^1.3.4", + "tslib": "^2.4.1" + } + }, + "node_modules/@amplitude/analytics-react-native": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-react-native/-/analytics-react-native-1.4.7.tgz", + "integrity": "sha512-3Fiu+O1rsfAY37Zh3oUMxaDwV0KCDdoshsHphpjtE0WJc8AMjCC2mcSlBgC/FUqrz/8H6UY+8D8FZeN8wpqujA==", + "dependencies": { + "@amplitude/analytics-client-common": "^1.2.2", + "@amplitude/analytics-core": "^1.2.5", + "@amplitude/analytics-types": "^1.3.4", + "@amplitude/ua-parser-js": "^0.7.31", + "@react-native-async-storage/async-storage": "^1.17.11", + "tslib": "^2.4.1" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@amplitude/analytics-types": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@amplitude/analytics-types/-/analytics-types-1.3.4.tgz", + "integrity": "sha512-tR70gzqFkEzX9QpxvWYMfLCledT7vMhgd3d4/bkp3nnGXTOORaVUOCcSgOyxyuFdSx84T61aP/eZPKIcZcaP+A==" + }, + "node_modules/@amplitude/ua-parser-js": { + "version": "0.7.33", + "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.33.tgz", + "integrity": "sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apollo/client": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.9.7.tgz", + "integrity": "sha512-OEEwt55bkFhqihCT5d75KUxZt50JZ9MuIYwG7VZlyPPIAb9K+qzVWlXWlf3tB5DaV43yXkUSLQfNpdIBFOB55Q==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/caches": "^1.0.0", + "@wry/equality": "^0.5.6", + "@wry/trie": "^0.5.0", + "graphql-tag": "^2.12.6", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.18.0", + "prop-types": "^15.7.2", + "rehackt": "0.0.6", + "response-iterator": "^0.2.6", + "symbol-observable": "^4.0.0", + "ts-invariant": "^0.10.3", + "tslib": "^2.3.0", + "zen-observable-ts": "^1.2.5" + }, + "peerDependencies": { + "graphql": "^15.0.0 || ^16.0.0", + "graphql-ws": "^5.5.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", + "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.0.tgz", + "integrity": "sha512-LiT1RqZWeij7X+wGxCoYh3/3b8nVOX6/7BZ9wiQgAIyjoeQWdROaodJCgT+dwtbjHaz0r7bEbHJzjSbVfcOyjQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-decorators": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz", + "integrity": "sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-default-from": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.0.tgz", + "integrity": "sha512-MXW3pQCu9gUiVGzqkGqsgiINDVYXoAnrY8FYF/rmb+OfufNF0zHMpHPN4ulRrinxYT8Vk/aZJxYqOKsDECjKAw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz", + "integrity": "sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-assign": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.23.3.tgz", + "integrity": "sha512-TPJ6O7gVC2rlQH2hvQGRH273G1xdoloCj9Pc07Q7JbIZYDi+Sv5gaE2fu+r5E7qK4zyt6vj0FbZaZTRU5C3OMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.0.tgz", + "integrity": "sha512-cum/nSi82cDaSJ21I4PgLTVlj0OXovFk6GRguJYe/IKg6y6JHLTbJhybtX4k35WT9wdeJfEVjycTixMhBHd0Dg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-transform-flow-strip-types": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", + "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@callstack/react-theme-provider": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-3.0.3.tgz", + "integrity": "sha512-B+9JBK7zsND/AdVkjwHvbb4cR05fJofLFG30hOeoXke8WkKAWN36yFljauAhI8qwlXlGFGZMYE1wQvsqBSccrA==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "deepmerge": "^3.2.0", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "react": "^16.3.0" + } + }, + "node_modules/@callstack/react-theme-provider/node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@expo/bunyan": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.0.tgz", + "integrity": "sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==", + "engines": [ + "node >=0.10.0" + ], + "dependencies": { + "uuid": "^8.0.0" + }, + "optionalDependencies": { + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "node_modules/@expo/bunyan/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@expo/cli": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.17.8.tgz", + "integrity": "sha512-yfkoghCltbGPDbRI71Qu3puInjXx4wO82+uhW82qbWLvosfIN7ep5Gr0Lq54liJpvlUG6M0IXM1GiGqcCyP12w==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "~8.5.0", + "@expo/config-plugins": "~7.8.0", + "@expo/devcert": "^1.0.0", + "@expo/env": "~0.2.2", + "@expo/image-utils": "^0.4.0", + "@expo/json-file": "^8.2.37", + "@expo/metro-config": "~0.17.0", + "@expo/osascript": "^2.0.31", + "@expo/package-manager": "^1.1.1", + "@expo/plist": "^0.1.0", + "@expo/prebuild-config": "6.7.4", + "@expo/rudder-sdk-node": "1.1.1", + "@expo/spawn-async": "1.5.0", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "^0.73.6", + "@urql/core": "2.3.6", + "@urql/exchange-retry": "0.3.0", + "accepts": "^1.3.8", + "arg": "5.0.2", + "better-opn": "~3.0.2", + "bplist-parser": "^0.3.1", + "cacache": "^15.3.0", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "find-yarn-workspace-root": "~2.0.0", + "form-data": "^3.0.1", + "freeport-async": "2.0.0", + "fs-extra": "~8.1.0", + "getenv": "^1.0.0", + "glob": "^7.1.7", + "graphql": "15.8.0", + "graphql-tag": "^2.10.1", + "https-proxy-agent": "^5.0.1", + "internal-ip": "4.3.0", + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1", + "js-yaml": "^3.13.1", + "json-schema-deref-sync": "^0.13.0", + "lodash.debounce": "^4.0.8", + "md5hex": "^1.0.0", + "minimatch": "^3.0.4", + "minipass": "3.3.6", + "node-fetch": "^2.6.7", + "node-forge": "^1.3.1", + "npm-package-arg": "^7.0.0", + "open": "^8.3.0", + "ora": "3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "5.6.0", + "progress": "2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.2", + "semver": "^7.5.3", + "send": "^0.18.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^6.0.5", + "temp-dir": "^2.0.0", + "tempy": "^0.7.1", + "terminal-link": "^2.1.1", + "text-table": "^0.2.0", + "url-join": "4.0.0", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + } + }, + "node_modules/@expo/cli/node_modules/@expo/spawn-async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz", + "integrity": "sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==", + "dependencies": { + "cross-spawn": "^6.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@expo/cli/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/@expo/cli/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@expo/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@expo/cli/node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@expo/cli/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@expo/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/cli/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/cli/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/cli/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/cli/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@expo/cli/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/@expo/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/@expo/config": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-8.5.4.tgz", + "integrity": "sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~7.8.2", + "@expo/config-types": "^50.0.0", + "@expo/json-file": "^8.2.37", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "7.5.3", + "slugify": "^1.3.4", + "sucrase": "3.34.0" + } + }, + "node_modules/@expo/config-plugins": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-7.8.4.tgz", + "integrity": "sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg==", + "dependencies": { + "@expo/config-types": "^50.0.0-alpha.1", + "@expo/fingerprint": "^0.6.0", + "@expo/json-file": "~8.3.0", + "@expo/plist": "^0.1.0", + "@expo/sdk-runtime-versions": "^1.0.0", + "@react-native/normalize-color": "^2.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.1", + "find-up": "~5.0.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config-plugins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@expo/config-types": { + "version": "50.0.0", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-50.0.0.tgz", + "integrity": "sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw==" + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/config/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@expo/devcert": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.1.0.tgz", + "integrity": "sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==", + "dependencies": { + "application-config-path": "^0.1.0", + "command-exists": "^1.2.4", + "debug": "^3.1.0", + "eol": "^0.9.1", + "get-port": "^3.2.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "password-prompt": "^1.0.4", + "rimraf": "^2.6.2", + "sudo-prompt": "^8.2.0", + "tmp": "^0.0.33", + "tslib": "^2.4.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/env": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.2.2.tgz", + "integrity": "sha512-m9nGuaSpzdvMzevQ1H60FWgf4PG5s4J0dfKUzdAGnDu7sMUerY/yUeDaA4+OBo3vBwGVQ+UHcQS9vPSMBNaPcg==", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.0.3", + "dotenv-expand": "~10.0.0", + "getenv": "^1.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.6.0.tgz", + "integrity": "sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==", + "dependencies": { + "@expo/spawn-async": "^1.5.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "find-up": "^5.0.0", + "minimatch": "^3.0.4", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.4.1.tgz", + "integrity": "sha512-EZb+VHSmw+a5s2hS9qksTcWylY0FDaIAVufcxoaRS9tHIXLjW5zcKW7Rhj9dSEbZbRVy9yXXdHKa3GQdUQIOFw==", + "dependencies": { + "@expo/spawn-async": "1.5.0", + "chalk": "^4.0.0", + "fs-extra": "9.0.0", + "getenv": "^1.0.0", + "jimp-compact": "0.16.1", + "node-fetch": "^2.6.0", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "tempy": "0.3.0" + } + }, + "node_modules/@expo/image-utils/node_modules/@expo/spawn-async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz", + "integrity": "sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==", + "dependencies": { + "cross-spawn": "^6.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/@expo/image-utils/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@expo/image-utils/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/image-utils/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/image-utils/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/image-utils/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/@expo/json-file": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.0.tgz", + "integrity": "sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.2", + "write-file-atomic": "^2.3.0" + } + }, + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/metro-config": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.17.6.tgz", + "integrity": "sha512-WaC1C+sLX/Wa7irwUigLhng3ckmXIEQefZczB8DfYmleV6uhfWWo2kz/HijFBpV7FKs2cW6u8J/aBQpFkxlcqg==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "@expo/config": "~8.5.0", + "@expo/env": "~0.2.2", + "@expo/json-file": "~8.3.0", + "@expo/spawn-async": "^1.7.2", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "find-yarn-workspace-root": "~2.0.0", + "fs-extra": "^9.1.0", + "getenv": "^1.0.0", + "glob": "^7.2.3", + "jsc-safe-url": "^0.2.4", + "lightningcss": "~1.19.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0", + "sucrase": "3.34.0" + }, + "peerDependencies": { + "@react-native/babel-preset": "*" + } + }, + "node_modules/@expo/osascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.0.tgz", + "integrity": "sha512-bOhuFnlRaS7CU33+rFFIWdcET/Vkyn1vsN8BYFwCDEF5P1fVVvYN7bFOsQLTMD3nvi35C1AGmtqUr/Wfv8Xaow==", + "dependencies": { + "@expo/spawn-async": "^1.5.0", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.4.2.tgz", + "integrity": "sha512-LKdo/6y4W7llZ6ghsg1kdx2CeH/qR/c6QI/JI8oPUvppsZoeIYjSkdflce978fAMfR8IXoi0wt0jA2w0kWpwbg==", + "dependencies": { + "@expo/json-file": "^8.2.37", + "@expo/spawn-async": "^1.5.0", + "ansi-regex": "^5.0.0", + "chalk": "^4.0.0", + "find-up": "^5.0.0", + "find-yarn-workspace-root": "~2.0.0", + "js-yaml": "^3.13.1", + "micromatch": "^4.0.2", + "npm-package-arg": "^7.0.0", + "ora": "^3.4.0", + "split": "^1.0.1", + "sudo-prompt": "9.1.1" + } + }, + "node_modules/@expo/package-manager/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@expo/package-manager/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@expo/package-manager/node_modules/sudo-prompt": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" + }, + "node_modules/@expo/plist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.0.tgz", + "integrity": "sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g==", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.7.4.tgz", + "integrity": "sha512-x8EUdCa8DTMZ/dtEXjHAdlP+ljf6oSeSKNzhycXiHhpMSMG9jEhV28ocCwc6cKsjK5GziweEiHwvrj6+vsBlhA==", + "dependencies": { + "@expo/config": "~8.5.0", + "@expo/config-plugins": "~7.8.0", + "@expo/config-types": "^50.0.0-alpha.1", + "@expo/image-utils": "^0.4.0", + "@expo/json-file": "^8.2.37", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "7.5.3", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo-modules-autolinking": ">=0.8.1" + } + }, + "node_modules/@expo/prebuild-config/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@expo/react-native-action-sheet": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@expo/react-native-action-sheet/-/react-native-action-sheet-4.0.1.tgz", + "integrity": "sha512-FwCFpjpB6yzrK8CIWssLlh/i6zQFytFBiJfNdz0mJ2ckU4hWk8SrjB37P0Q4kF7w0bnIdYzPgRbdPR9hnfFqPw==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/@expo/rudder-sdk-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "dependencies": { + "@expo/bunyan": "^4.0.0", + "@segment/loosely-validate-event": "^2.0.0", + "fetch-retry": "^4.1.1", + "md5": "^2.2.1", + "node-fetch": "^2.6.1", + "remove-trailing-slash": "^0.1.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/rudder-sdk-node/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==" + }, + "node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/vector-icons": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.0.0.tgz", + "integrity": "sha512-5orm59pdnBQlovhU9k4DbjMUZBHNlku7IRgFY56f7pcaaCnXq9yaLJoOQl9sMwNdFzf4gnkTyHmR5uN10mI9rA==" + }, + "node_modules/@expo/xcpretty": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz", + "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true + }, + "node_modules/@ide/backoff": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz", + "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==" + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.21.0.tgz", + "integrity": "sha512-JL0w36KuFHFCvnbOXRekqVAUplmOyT/OuCQkogo6X98MtpSaJOKEAeZnYO8JB0U/RIEixZaGI5px73YbRm/oag==", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" + } + }, + "node_modules/@react-native-community/cli": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.2.tgz", + "integrity": "sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==", + "dependencies": { + "@react-native-community/cli-clean": "12.3.2", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-doctor": "12.3.2", + "@react-native-community/cli-hermes": "12.3.2", + "@react-native-community/cli-plugin-metro": "12.3.2", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native-community/cli-types": "12.3.2", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz", + "integrity": "sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==", + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.2.tgz", + "integrity": "sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==", + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^4.3.0", + "glob": "^7.1.3", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz", + "integrity": "sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz", + "integrity": "sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==", + "dependencies": { + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.10.0", + "execa": "^5.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz", + "integrity": "sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==", + "dependencies": { + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz", + "integrity": "sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==", + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.2.4", + "glob": "^7.1.3", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz", + "integrity": "sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==", + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz", + "integrity": "sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==" + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz", + "integrity": "sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==", + "dependencies": { + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^7.5.1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz", + "integrity": "sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==", + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==" + }, + "node_modules/@react-native-community/cli-tools/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/cli-types": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.2.tgz", + "integrity": "sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==", + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@react-native-community/cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-community/cli/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@react-native-community/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@react-native-community/clipboard": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@react-native-community/clipboard/-/clipboard-1.5.1.tgz", + "integrity": "sha512-AHAmrkLEH5UtPaDiRqoULERHh3oNv7Dgs0bTC0hO5Z2GdNokAMPT5w8ci8aMcRemcwbtdHjxChgtjbeA38GBdA==", + "peerDependencies": { + "react": ">=16.0", + "react-native": ">=0.57.0" + } + }, + "node_modules/@react-native-community/datetimepicker": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-7.6.1.tgz", + "integrity": "sha512-g66Q2Kd9Uw3eRL7kkrTsGhi+eXxNoPDRFYH6z78sZQuYjPkUQgJDDMUYgBmaBsQx/fKMtemPrCj1ulGmyi0OSw==", + "dependencies": { + "invariant": "^2.2.4" + } + }, + "node_modules/@react-native-google-signin/google-signin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@react-native-google-signin/google-signin/-/google-signin-11.0.0.tgz", + "integrity": "sha512-J8BFFGr5HcEWE2gRaVSJ0rQN8ztxYIr2wdWMG4PS1vhQZJqUzmRr6vpu12O1GppItq8ai7AA0rl/ja7hSytSXA==", + "peerDependencies": { + "expo": ">=47.0.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.73.1", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.73.1.tgz", + "integrity": "sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", + "dependencies": { + "@react-native/codegen": "0.73.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.73.4", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.73.16", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.16.tgz", + "integrity": "sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==", + "dependencies": { + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native/dev-middleware": "0.73.7", + "@react-native/metro-babel-transformer": "0.73.15", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { + "version": "0.73.7", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz", + "integrity": "sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.73.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^1.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "open": "^7.0.3", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz", + "integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.73.8", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz", + "integrity": "sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg==", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.73.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^1.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "open": "^7.0.3", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz", + "integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.73.1", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz", + "integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.73.15", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", + "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.73.21", + "hermes-parser": "0.15.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/normalize-color": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz", + "integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==" + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.73.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz", + "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz", + "integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@react-navigation/core": { + "version": "6.4.16", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.16.tgz", + "integrity": "sha512-UDTJBsHxnzgFETR3ZxhctP+RWr4SkyeZpbhpkQoIGOuwSCkt1SE0qjU48/u6r6w6XlX8OqVudn1Ab0QFXTHxuQ==", + "dependencies": { + "@react-navigation/routers": "^6.1.9", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.1.3", + "react-is": "^16.13.0", + "use-latest-callback": "^0.1.9" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@react-navigation/drawer": { + "version": "6.6.15", + "resolved": "https://registry.npmjs.org/@react-navigation/drawer/-/drawer-6.6.15.tgz", + "integrity": "sha512-GLkFQNxjtmxB/qXSHmu1DfoB89jCzW64tmX68iPndth+9U+0IP27GcCCaMZxQfwj+nI8Kn2zlTlXAZDIIHE+DQ==", + "dependencies": { + "@react-navigation/elements": "^1.3.30", + "color": "^4.2.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-gesture-handler": ">= 1.0.0", + "react-native-reanimated": ">= 1.0.0", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/elements": { + "version": "1.3.30", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.30.tgz", + "integrity": "sha512-plhc8UvCZs0UkV+sI+3bisIyn78wz9O/BiWZXpounu72k/R/Sj5PuZYFJ1fi6psvriUveMCGh4LeZckAZu2qiQ==", + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/native": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.17.tgz", + "integrity": "sha512-mer3OvfwWOHoUSMJyLa4vnBH3zpFmCwuzrBPlw7feXklurr/ZDiLjLxUScOot6jLRMz/67GyilEYMmP99LL0RQ==", + "dependencies": { + "@react-navigation/core": "^6.4.16", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-navigation/routers": { + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", + "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==", + "dependencies": { + "nanoid": "^3.1.23" + } + }, + "node_modules/@react-navigation/stack": { + "version": "6.3.29", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.3.29.tgz", + "integrity": "sha512-tzlGkoRgB6P7vgw7rHuWo3TL7Gzu6xh5LMf+zSdCuEiKp/qASzxYfnTEr9tOLbVs/gf+qeukEDheCSAJKVpBXw==", + "dependencies": { + "@react-navigation/elements": "^1.3.30", + "color": "^4.2.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-gesture-handler": ">= 1.0.0", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "dependencies": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.81.1.tgz", + "integrity": "sha512-E5xm27xrLXL10knH2EWDQsQYh5nb4SxxZzJ3sJwDGG9XGKzBdlp20UUhKqx00wixooVX9uCj3e4Jg8SvNB1hKg==", + "dependencies": { + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.81.1.tgz", + "integrity": "sha512-DNtS7bZEnFPKVoGazKs5wHoWC0FwsOFOOMNeDvEfouUqKKbjO7+RDHbr7H6Bo83zX4qmZWRBf8V+3n3YPIiJFw==", + "dependencies": { + "@sentry-internal/tracing": "7.81.1", + "@sentry/core": "7.81.1", + "@sentry/replay": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/cli": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.25.2.tgz", + "integrity": "sha512-lgt1QPaCfs/QZNXwyw3gvuBR2/CLwFSdU/oT7Bpxwizz8XVXhlKS98zJF1UVCy7SecsDSoOI0Z+B+X658cpquQ==", + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.25.2", + "@sentry/cli-linux-arm": "2.25.2", + "@sentry/cli-linux-arm64": "2.25.2", + "@sentry/cli-linux-i686": "2.25.2", + "@sentry/cli-linux-x64": "2.25.2", + "@sentry/cli-win32-i686": "2.25.2", + "@sentry/cli-win32-x64": "2.25.2" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.25.2.tgz", + "integrity": "sha512-o1d5NnVUrc1dxDm56k7Co8tSTcOuxbApdxweVXXsiq20HblZCyIi7WxxRkAg4RfKx594sKGiw9uCVvECi+9UpA==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.25.2.tgz", + "integrity": "sha512-n398jd87Ymejt5k/6RjCEjXAvntOWuqhBDANxzhgr5/9FzbODJ844g1mOpcxiIlduzKSzWlPbTEKQulMp2Mt4w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.25.2.tgz", + "integrity": "sha512-lm5jaigV6xu9Gwo0wNk+bX6yVkl5k3gNXcSXcKCISFo+Teb7Zhf9IyXANPm4VY2DdiZAjPJt8gS1bu+Mn7irtQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.25.2.tgz", + "integrity": "sha512-/YYx2gfqO5mkxyBgFcnDbZzkZ2+2xNarwrqWcqq3Qw0XlO9DWAQB2G+twV1RW/UfSU6fFIWErn94efh2EWmyzQ==", + "cpu": [ + "x86", + "ia32" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.25.2.tgz", + "integrity": "sha512-rRafqy84R5mYA4JEfNsUeN10af5euJnK7fgqYM0mJIaplHC2YEXT9aUYWoryWPZiYqmdNUhsA6lX7iynSW9pZw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.25.2.tgz", + "integrity": "sha512-plT/gi41F+67g9AwrEm4avRXnjCtHCcnRnJ6zPu/iINGap8mvYQJSU/qM0oGwV6hRGg3JJN66XIvJPIuIs8P8w==", + "cpu": [ + "x86", + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.25.2.tgz", + "integrity": "sha512-Mb6mAyPi9gIfpzF5MTk0JXgFP9nxka3Fb7JYn6AY4RW++sOjapkTrcXL2Gp3ZfQkWj5rFTgln4+eNmZPsD2gzA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.81.1.tgz", + "integrity": "sha512-tU37yAmckOGCw/moWKSwekSCWWJP15O6luIq+u7wal22hE88F3Vc5Avo8SeF3upnPR+4ejaOFH+BJTr6bgrs6Q==", + "dependencies": { + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/hub": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-7.81.1.tgz", + "integrity": "sha512-25cvsI3HKiRLJBZGFC8ntuy7/yB8M1w8YLTjr3tIqydYmjFUX7f18w0iuWEtd204d8OQSPBJDapbGMdfkE5x6w==", + "dependencies": { + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.81.1.tgz", + "integrity": "sha512-DN5ONn0/LX5HHVPf1EBGHFssIZaZmLgkqUIeMqCNYBpB4DiOrJANnGwTcWKDPphqhdPxjnPv9AGRLaU0PdvvZQ==", + "dependencies": { + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/react": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.81.1.tgz", + "integrity": "sha512-kk0plP/mf8KgVLOiImIpp1liYysmh3Un8uXcVAToomSuHZPGanelFAdP0XhY+0HlWU9KIfxTjhMte1iSwQ8pYw==", + "dependencies": { + "@sentry/browser": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x" + } + }, + "node_modules/@sentry/react-native": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@sentry/react-native/-/react-native-5.17.0.tgz", + "integrity": "sha512-d0TLASMcpUtvw0A8zNznRyCskfH0kwfb3GzqMXXpfPJAG8vsBnY15EFOIc+czOLt6FbV9o3567bHYWhSW51Ssg==", + "dependencies": { + "@sentry/browser": "7.81.1", + "@sentry/cli": "2.25.2", + "@sentry/core": "7.81.1", + "@sentry/hub": "7.81.1", + "@sentry/integrations": "7.81.1", + "@sentry/react": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "bin": { + "sentry-expo-upload-sourcemaps": "scripts/expo-upload-sourcemaps.js" + }, + "peerDependencies": { + "expo": ">=49.0.0", + "react": ">=17.0.0", + "react-native": ">=0.65.0" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, + "node_modules/@sentry/replay": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.81.1.tgz", + "integrity": "sha512-4ueT0C4bYjngN/9p0fEYH10dTMLovHyk9HxJ6zSTgePvGVexhg+cSEHXisoBDwHeRZVnbIvsVM0NA7rmEDXJJw==", + "dependencies": { + "@sentry-internal/tracing": "7.81.1", + "@sentry/core": "7.81.1", + "@sentry/types": "7.81.1", + "@sentry/utils": "7.81.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.81.1.tgz", + "integrity": "sha512-dvJvGyctiaPMIQqa46k56Re5IODWMDxiHJ1UjBs/WYDLrmWFPGrEbyJ8w8CYLhYA+7qqrCyIZmHbWSTRIxstHw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.81.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.81.1.tgz", + "integrity": "sha512-gq+MDXIirHKxNZ+c9/lVvCXd6y2zaZANujwlFggRH2u9SRiPaIXVilLpvMm4uJqmqBMEcY81ArujExtHvkbCqg==", + "dependencies": { + "@sentry/types": "7.81.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@twotalltotems/react-native-otp-input": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@twotalltotems/react-native-otp-input/-/react-native-otp-input-1.3.11.tgz", + "integrity": "sha512-xSsEMa8llYHITKgx1FGwU3uK56Kk6+abgkJpo57pLnUpYC2CZpvhkvRKhFa7Ui6BhdRuh0Ob1O7q234d3CksRg==", + "dependencies": { + "@react-native-community/clipboard": "^1.2.2" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/hammerjs": { + "version": "2.0.45", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.45.tgz", + "integrity": "sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ==" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.11.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.29.tgz", + "integrity": "sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + }, + "node_modules/@types/react": { + "version": "18.2.67", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.67.tgz", + "integrity": "sha512-vkIE2vTIMHQ/xL0rgmuoECBCkZFZeHr49HeWSc24AptMbNRo7pwSBvj73rlJJs9fGKj0koS+V7kQB1jHS0uCgw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@urql/core": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", + "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.0", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", + "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", + "dependencies": { + "@urql/core": ">=2.3.1", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/@wry/caches": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", + "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/context": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", + "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", + "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", + "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" + }, + "node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dev": true, + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ansi-fragments/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/ansi-fragments/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" + }, + "node_modules/ansi-fragments/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-fragments/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-fragments/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==" + }, + "node_modules/application-config-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", + "integrity": "sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-code-frame/node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "node_modules/babel-code-frame/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-code-frame/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", + "dev": true, + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha512-02I9jDjnVEuGy2BR3LRm9nPRb/+Ja0pvZVLr1eI5TYAA/dB0Xoc+WBo50+aDfhGDLhlBY1+QURjn9uvcFd8gzg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "node_modules/babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", + "dev": true, + "dependencies": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", + "dev": true, + "dependencies": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz", + "integrity": "sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==" + }, + "node_modules/babel-plugin-react-transform": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-transform/-/babel-plugin-react-transform-3.0.0.tgz", + "integrity": "sha512-4vJGddwPiHAOgshzZdGwYy4zRjjIr5SMY7gkOaCyIASjgpcsyLTlZNuB5rHOFoaTvGlhfo8/g4pobXPyHqm/3w==", + "dev": true, + "dependencies": { + "lodash": "^4.6.1" + } + }, + "node_modules/babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", + "dev": true + }, + "node_modules/babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true + }, + "node_modules/babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha512-HbTDIoG1A1op7Tl/wIFQPULIBA61tsJ8Ntq2FAhLwuijrzosM/92kAfgU1Q3Kc7DH/cprJg5vDfuTY4QUL4rDA==", + "dev": true + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", + "dev": true + }, + "node_modules/babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==", + "dev": true + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "node_modules/babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", + "dev": true, + "dependencies": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", + "dev": true, + "dependencies": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "dependencies": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", + "dev": true, + "dependencies": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha512-TxIM0ZWNw9oYsoTthL3lvAK3+eTujzktoXJg4ubGvICGbVuXVYv5hHv0XXpz8fbqlJaGYY4q5SVzaSmsg3t4Fg==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-object-assign": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz", + "integrity": "sha512-N6Pddn/0vgLjnGr+mS7ttlFkQthqcnINE9EMOxB0CF8F4t6kuJXz6NUeLfSoRbLmkGh0mgDs9i2isdaZj0Ghtg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "node_modules/babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha512-QLYkLiZeeED2PKd4LuXGg5y9fCgPB5ohF8olWUuETE2ryHNRqqnXlEVP7RPuef89+HTfd3syptMGVHeoAu0Wig==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha512-s+q/Y2u2OgDPHRuod3t6zyLoV8pUHc64i/O7ZNgIOEdYTq+ChPeybcKBi/xk9VI60VriILzFPW+dUxAEbTxh2w==", + "dev": true, + "dependencies": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha512-pcDNDsZ9q/6LJmujQ/OhjeoIlp5Nl546HJ2yiFIJK3mYpgNXhI5/S9mXfVxu5yqWAi7HdI7e/q6a9xtzwL69Vw==", + "dev": true, + "dependencies": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "node_modules/babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.10.0" + } + }, + "node_modules/babel-plugin-transform-regenerator/node_modules/regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "node_modules/babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "node_modules/babel-preset-expo": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-10.0.1.tgz", + "integrity": "sha512-uWIGmLfbP3dS5+8nesxaW6mQs41d4iP7X82ZwRdisB/wAhKQmuJM9Y1jQe4006uNYkw6Phf2TT03ykLVro7KuQ==", + "dependencies": { + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/preset-env": "^7.20.0", + "@babel/preset-react": "^7.22.15", + "@react-native/babel-preset": "^0.73.18", + "babel-plugin-react-native-web": "~0.18.10", + "react-refresh": "0.14.0" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-native": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-native/-/babel-preset-react-native-4.0.1.tgz", + "integrity": "sha512-uhFXnl1WbEWNG4W8QB/jeQaVXkd0a0AD+wh4D2VqtdRnEyvscahqyHExnwKLU9N0sXRYwDyed4JfbiBtiOSGgA==", + "dev": true, + "dependencies": { + "babel-plugin-check-es2015-constants": "^6.5.0", + "babel-plugin-react-transform": "^3.0.0", + "babel-plugin-syntax-async-functions": "^6.5.0", + "babel-plugin-syntax-class-properties": "^6.5.0", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-syntax-flow": "^6.5.0", + "babel-plugin-syntax-jsx": "^6.5.0", + "babel-plugin-syntax-trailing-function-commas": "^6.5.0", + "babel-plugin-transform-class-properties": "^6.5.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.5.0", + "babel-plugin-transform-es2015-block-scoping": "^6.5.0", + "babel-plugin-transform-es2015-classes": "^6.5.0", + "babel-plugin-transform-es2015-computed-properties": "^6.5.0", + "babel-plugin-transform-es2015-destructuring": "^6.5.0", + "babel-plugin-transform-es2015-for-of": "^6.5.0", + "babel-plugin-transform-es2015-function-name": "^6.5.0", + "babel-plugin-transform-es2015-literals": "^6.5.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.5.0", + "babel-plugin-transform-es2015-parameters": "^6.5.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.5.0", + "babel-plugin-transform-es2015-spread": "^6.5.0", + "babel-plugin-transform-es2015-template-literals": "^6.5.0", + "babel-plugin-transform-exponentiation-operator": "^6.5.0", + "babel-plugin-transform-flow-strip-types": "^6.5.0", + "babel-plugin-transform-object-assign": "^6.5.0", + "babel-plugin-transform-object-rest-spread": "^6.5.0", + "babel-plugin-transform-react-display-name": "^6.5.0", + "babel-plugin-transform-react-jsx": "^6.5.0", + "babel-plugin-transform-react-jsx-source": "^6.5.0", + "babel-plugin-transform-regenerator": "^6.5.0", + "babel-template": "^6.24.1", + "react-transform-hmr": "^1.0.4" + } + }, + "node_modules/babel-preset-react-native/node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", + "dev": true + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "dev": true, + "hasInstallScript": true + }, + "node_modules/babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "node_modules/babel-traverse/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/babel-traverse/node_modules/globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-traverse/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babel-types/node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" + }, + "node_modules/badgin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/badgin/-/badgin-1.2.3.tgz", + "integrity": "sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", + "integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/chromium-edge-launcher/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-edge-launcher/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compare-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-urls/-/compare-urls-2.0.0.tgz", + "integrity": "sha512-eCJcWn2OYFEIqbm70ta7LQowJOOZZqq1a2YbbFCFI1uwSvj+TWMwXVn7vPR1ceFNcAIt5RSTDbwdlX82gYLTkA==", + "dependencies": { + "normalize-url": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/component-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", + "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dag-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecated-react-native-prop-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz", + "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==", + "dependencies": { + "@react-native/normalize-colors": "^0.73.0", + "invariant": "^2.2.4", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.710", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.710.tgz", + "integrity": "sha512-w+9yAVHoHhysCa+gln7AzbO9CdjFcL/wN/5dd+XW/Msl2d/4+WisEaCF1nty0xbAKaxdaJfgLB2296U7zZB7BA==" + }, + "node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/envinfo": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eol": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", + "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dependencies": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz", + "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==", + "deprecated": "standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: https://github.com/standard/standard/issues/1316", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/exec-async": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==" + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expo": { + "version": "50.0.13", + "resolved": "https://registry.npmjs.org/expo/-/expo-50.0.13.tgz", + "integrity": "sha512-p0FYrhUJZe92YOwOXx6GZ/WaxF6YtsLXtWkql9pFIIocYBN6iQ3OMGsbQCRSu0ao8rlxsk7HgQDEWK4D+y9tAg==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "0.17.8", + "@expo/config": "8.5.4", + "@expo/config-plugins": "7.8.4", + "@expo/metro-config": "0.17.6", + "@expo/vector-icons": "^14.0.0", + "babel-preset-expo": "~10.0.1", + "expo-asset": "~9.0.2", + "expo-file-system": "~16.0.8", + "expo-font": "~11.10.3", + "expo-keep-awake": "~12.8.2", + "expo-modules-autolinking": "1.10.3", + "expo-modules-core": "1.11.12", + "fbemitter": "^3.0.0", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli" + } + }, + "node_modules/expo-apple-authentication": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/expo-apple-authentication/-/expo-apple-authentication-6.3.0.tgz", + "integrity": "sha512-eYoRMlh7qKkWdbNe5TV5n0/1mLMRDFDxt+uetyu0XMdn70vZSTaPr5yewyGzoFHRx5t4QCEj8wTobcjoqH5PGw==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-application": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-5.8.3.tgz", + "integrity": "sha512-IISxzpPX+Xe4ynnwX8yY52T6dm1g9sME1GCj4lvUlrdc5xeTPM6U35x7Wj82V7lLWBaVGe+/Tg9EeKqfylCEwA==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-asset": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-9.0.2.tgz", + "integrity": "sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow==", + "dependencies": { + "@react-native/assets-registry": "~0.73.1", + "blueimp-md5": "^2.10.0", + "expo-constants": "~15.4.0", + "expo-file-system": "~16.0.0", + "invariant": "^2.2.4", + "md5-file": "^3.2.3" + } + }, + "node_modules/expo-constants": { + "version": "15.4.5", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-15.4.5.tgz", + "integrity": "sha512-1pVVjwk733hbbIjtQcvUFCme540v4gFemdNlaxM2UXKbfRCOh2hzgKN5joHMOysoXQe736TTUrRj7UaZI5Yyhg==", + "dependencies": { + "@expo/config": "~8.5.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-crypto": { + "version": "12.8.1", + "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-12.8.1.tgz", + "integrity": "sha512-EJEzmfBUSkGfALTlZRKUbh1RMKF7mWI12vkhO2w6bhGO4bjgGB8XzUHgLfrvSjphDFMx/lwaR6bAQDmXKO9UkQ==", + "dependencies": { + "base64-js": "^1.3.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-client": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-3.3.10.tgz", + "integrity": "sha512-UhZOJ+O90dRo7S/rmFmVIWwa/HxOqoQ4ySCqvWh87O3pFQuluPfVI9PdKicF4djYrNHZZmE8UXqBDN41hiYtAA==", + "dependencies": { + "expo-dev-launcher": "3.6.8", + "expo-dev-menu": "4.5.7", + "expo-dev-menu-interface": "1.7.2", + "expo-manifests": "~0.13.0", + "expo-updates-interface": "~0.15.1" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-3.6.8.tgz", + "integrity": "sha512-lFyxRXpUk0z7V7BDd1tFg/M9eFPzo+WRq7kQBA4F8bFPX6drYuTjPqs/bEF/6A5S38oA1wcA34bY9TNgkiKf5w==", + "dependencies": { + "ajv": "8.11.0", + "expo-dev-menu": "4.5.7", + "expo-manifests": "~0.13.0", + "resolve-from": "^5.0.0", + "semver": "^7.5.3" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-launcher/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/expo-dev-launcher/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/expo-dev-launcher/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-dev-launcher/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-dev-launcher/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/expo-dev-menu": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-4.5.7.tgz", + "integrity": "sha512-yIAsiKIhxvAmzd6x25HTvANeengGg2Uax6JnKy7+YfxgynKtqmWUlGCyc9EECoQI4+ItxbfjU4fSTxTiQYGFug==", + "dependencies": { + "expo-dev-menu-interface": "1.7.2", + "semver": "^7.5.3" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu-interface": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-1.7.2.tgz", + "integrity": "sha512-V/geSB9rW0IPTR+d7E5CcvkV0uVUCE7SMHZqE/J0/dH06Wo8AahB16fimXeh5/hTL2Qztq8CQ41xpFUBoA9TEw==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-dev-menu/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-dev-menu/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-dev-menu/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/expo-device": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-5.9.3.tgz", + "integrity": "sha512-azH5rz8krDZUJb/arqkcA6oZGaX2T5s4aaXIMFsDDzvq8TW0CttZZy2HFp6itmFdiKGdRpFX3/Gj0n6ZmPoJ/w==", + "dependencies": { + "ua-parser-js": "^0.7.33" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-eas-client": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-0.11.2.tgz", + "integrity": "sha512-SY7rVFxb4ut/OMTgR7A39Jg+8+hXwQNRpZd+RBpB+B5XV2STj/pWXHnGFhBayEF4umI4SxrOvisY90rlPWVO9Q==" + }, + "node_modules/expo-file-system": { + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-16.0.8.tgz", + "integrity": "sha512-yDbVT0TUKd7ewQjaY5THum2VRFx2n/biskGhkUmLh3ai21xjIVtaeIzHXyv9ir537eVgt4ReqDNWi7jcXjdUcA==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-font": { + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-11.10.3.tgz", + "integrity": "sha512-q1Td2zUvmLbCA9GV4OG4nLPw5gJuNY1VrPycsnemN1m8XWTzzs8nyECQQqrcBhgulCgcKZZJJ6U0kC2iuSoQHQ==", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-loader": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-4.6.0.tgz", + "integrity": "sha512-RHQTDak7/KyhWUxikn2yNzXL7i2cs16cMp6gEAgkHOjVhoCJQoOJ0Ljrt4cKQ3IowxgCuOrAgSUzGkqs7omj8Q==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-14.7.1.tgz", + "integrity": "sha512-ILQVOJgI3aEzrDmCFGDPtpAepYkn8mot8G7vfQ51BfFdQbzL6N3Wm1fS/ofdWlAZJl/qT2DwaIh5xYmf3SyGZA==", + "dependencies": { + "expo-image-loader": "~4.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-json-utils": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.12.3.tgz", + "integrity": "sha512-4pypQdinpNc6XY9wsZk56njvzDh+B/9mISr7FPP3CVk1QGB1nSLh883/BCDSgnsephATZkC5HG+cdE60kCAR6A==" + }, + "node_modules/expo-keep-awake": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-12.8.2.tgz", + "integrity": "sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-linking": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-6.2.2.tgz", + "integrity": "sha512-FEe6lP4f7xFT/vjoHRG+tt6EPVtkEGaWNK1smpaUevmNdyCJKqW0PDB8o8sfG6y7fly8ULe8qg3HhKh5J7aqUQ==", + "dependencies": { + "expo-constants": "~15.4.3", + "invariant": "^2.2.4" + } + }, + "node_modules/expo-localization": { + "version": "14.8.3", + "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-14.8.3.tgz", + "integrity": "sha512-leg1e+7ocUgfNWa7Men/g16waXtdSpBMR9tCdv3CG4wztmFU8C+87VAnnVkvHi4CCUkTLzhP3y0FcE6KIWTwdw==", + "dependencies": { + "rtl-detect": "^1.0.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-location": { + "version": "16.5.5", + "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-16.5.5.tgz", + "integrity": "sha512-dXEd1HaZgdi6yHVF8R+SMnGlKDYrD+Hkkzd/b9edjMSUBLxF2y824AFSSNUf6BVOM53tJBOFEELneXkU1uj9nA==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-manifests": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.13.2.tgz", + "integrity": "sha512-l0Sia1WmLULx8V41K8RzGLsFoTe4qqthPRGpHjItsYn8ZB6lRrdTBM9OYp2McIflgqN1HAimUCQMFIwJyH+UmA==", + "dependencies": { + "@expo/config": "~8.5.0", + "expo-json-utils": "~0.12.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz", + "integrity": "sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw==", + "dependencies": { + "@expo/config": "~8.5.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "fast-glob": "^3.2.5", + "find-up": "^5.0.0", + "fs-extra": "^9.1.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-core": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.11.12.tgz", + "integrity": "sha512-/e8g4kis0pFLer7C0PLyx98AfmztIM6gU9jLkYnB1pU9JAfQf904XEi3bmszO7uoteBQwSL6FLp1m3TePKhDaA==", + "dependencies": { + "invariant": "^2.2.4" + } + }, + "node_modules/expo-notifications": { + "version": "0.27.6", + "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.27.6.tgz", + "integrity": "sha512-F2iu/lzsrvfMyHA5BfnbZfE8fVLV8aQmNLk3NPztZ0g7911QEriZzH7BK/NKOZ5UHhJYI+hhYvcZCq2nFm1NLA==", + "dependencies": { + "@expo/image-utils": "^0.4.0", + "@ide/backoff": "^1.0.0", + "abort-controller": "^3.0.0", + "assert": "^2.0.0", + "badgin": "^1.1.5", + "expo-application": "~5.8.0", + "expo-constants": "~15.4.0", + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-random": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/expo-random/-/expo-random-13.6.0.tgz", + "integrity": "sha512-c4Ikio+a2sUyJC0386K6JplqjVDelsyqQfjiy4yCx+0epEu44AP99ipF+HsmZVOvsWsWkd/lkpq5kGnJON5EfA==", + "dependencies": { + "base64-js": "^1.3.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-splash-screen": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.26.4.tgz", + "integrity": "sha512-2DwofTQ0FFQCsvDysm/msENsbyNsJiAJwK3qK/oXeizECAPqD7bK19J4z9kuEbr7ORPX9MLnTQYKl6kmX3keUg==", + "dependencies": { + "@expo/prebuild-config": "6.7.4" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-structured-headers": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/expo-structured-headers/-/expo-structured-headers-3.7.2.tgz", + "integrity": "sha512-/nGOyeWUXSUy4aIYKJTwQOznRNs0yKqKPAyEE6jtwvOl9qvfDWx9xskNtShioggBhFAssFkV6RBbPn+xZMQtvw==" + }, + "node_modules/expo-system-ui": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-2.9.3.tgz", + "integrity": "sha512-RNFNBLJ9lhnjOGrHhtfDc15Ry/lF+SA4kwulmHzYGqaTeYvsL9q0K0+m9qmxuDdrbKJkuurvzvjVylDNnKNFVg==", + "dependencies": { + "@react-native/normalize-color": "^2.0.0", + "debug": "^4.3.2" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-tracking-transparency": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/expo-tracking-transparency/-/expo-tracking-transparency-3.3.0.tgz", + "integrity": "sha512-aFeDm1Y/4N8CigCdDKQPCIzCMAHDIAhdpb8PopuH1Lz7jtq+K+D2OgAUJsgyI6pyKO/MqcXMsa0s/JkIzi593Q==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates": { + "version": "0.24.12", + "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.24.12.tgz", + "integrity": "sha512-35ZpAMSqHIyVGT5mEptaZJBxytu0mv4PIG28i3BQe+GG4ifQtY94aCOCrUwZe8Myzaf4dNVGEUXWTPo+JPCgcw==", + "dependencies": { + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "~8.5.0", + "@expo/config-plugins": "~7.8.0", + "arg": "4.1.0", + "chalk": "^4.1.2", + "expo-eas-client": "~0.11.0", + "expo-manifests": "~0.13.0", + "expo-structured-headers": "~3.7.0", + "expo-updates-interface": "~0.15.1", + "fbemitter": "^3.0.0", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-updates": "bin/cli.js" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates-interface": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-0.15.3.tgz", + "integrity": "sha512-uLvsbaCmUsXgJqeen8rYH/jPr874ZUCXEvWpKHxrCv5/XATPlYEaDuecbNSGQ+cu78i6MdtB4BHOwZmoH2d47A==", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-updates/node_modules/arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" + }, + "node_modules/expo-web-browser": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-12.8.2.tgz", + "integrity": "sha512-Mw8WoFMSADecNjtC4PZVsVj1/lYdxIAH1jOVV+F8v8SEWYxORWofoShfXg7oUxRLu0iUG8JETfO5y4m8+fOgdg==", + "dependencies": { + "compare-urls": "^2.0.0", + "url": "^0.11.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz", + "integrity": "sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/fbjs/node_modules/ua-parser-js": { + "version": "1.0.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", + "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/fetch-retry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", + "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==" + }, + "node_modules/flow-parser": { + "version": "0.206.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", + "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.5.tgz", + "integrity": "sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/google-libphonenumber": { + "version": "3.2.34", + "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.34.tgz", + "integrity": "sha512-CLwkp0lZvMywh6dCh0T3Fm8XsfJhLAupc8AECwYkJNQBPW8wQPrv/tV0oFKCs8FMw+pTQyNPZoycgBzYjqtTZQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz", + "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==" + }, + "node_modules/hermes-parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz", + "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==", + "dependencies": { + "hermes-estree": "0.15.0" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18n-js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.4.3.tgz", + "integrity": "sha512-QIIyvJ+wOKdigL4BlgwiFFrpoXeGdlC8EYgori64YSWm1mnhNYYjIfRu5wETFrmiNP2fyD6xIjVG8dlzaiQr/A==", + "dependencies": { + "bignumber.js": "*", + "lodash": "*", + "make-plural": "*" + } + }, + "node_modules/i18next": { + "version": "23.10.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", + "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterall": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", + "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==" + }, + "node_modules/joi": { + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==" + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==" + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-schema-deref-sync": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", + "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", + "dependencies": { + "clone": "^2.1.2", + "dag-map": "~1.0.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.13", + "md5": "~2.2.0", + "memory-cache": "~0.2.0", + "traverse": "~0.6.6", + "valid-url": "~1.0.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/json-schema-deref-sync/node_modules/md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "dependencies": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/lightningcss": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz", + "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.19.0", + "lightningcss-darwin-x64": "1.19.0", + "lightningcss-linux-arm-gnueabihf": "1.19.0", + "lightningcss-linux-arm64-gnu": "1.19.0", + "lightningcss-linux-arm64-musl": "1.19.0", + "lightningcss-linux-x64-gnu": "1.19.0", + "lightningcss-linux-x64-musl": "1.19.0", + "lightningcss-win32-x64-msvc": "1.19.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", + "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", + "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", + "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", + "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", + "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", + "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz", + "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", + "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lint-staged": { + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/logkitty/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/logkitty/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logkitty/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-plural": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", + "integrity": "sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5-file": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", + "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", + "dependencies": { + "buffer-alloc": "^1.1.0" + }, + "bin": { + "md5-file": "cli.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/md5hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", + "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==" + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mem/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==" + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.6.tgz", + "integrity": "sha512-f6Nhnht9TxVRP6zdBq9J2jNdeDBxRmJFnjxhQS1GeCpokBvI6fTXq+wHTLz5jZA+75fwbkPSzBxBJzQa6xi0AQ==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.19.1", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.80.6", + "metro-cache": "0.80.6", + "metro-cache-key": "0.80.6", + "metro-config": "0.80.6", + "metro-core": "0.80.6", + "metro-file-map": "0.80.6", + "metro-resolver": "0.80.6", + "metro-runtime": "0.80.6", + "metro-source-map": "0.80.6", + "metro-symbolicate": "0.80.6", + "metro-transform-plugins": "0.80.6", + "metro-transform-worker": "0.80.6", + "mime-types": "^2.1.27", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "rimraf": "^3.0.2", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.1", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.6.tgz", + "integrity": "sha512-ssuoVC4OzqaOt3LpwfUbDfBlFGRu9v1Yf2JJnKPz0ROYHNjSBws4aUesqQQ/Ea8DbiH7TK4j4cJmm+XjdHmgqA==", + "dependencies": { + "@babel/core": "^7.20.0", + "hermes-parser": "0.19.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", + "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", + "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", + "dependencies": { + "hermes-estree": "0.19.1" + } + }, + "node_modules/metro-cache": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.6.tgz", + "integrity": "sha512-NP81pHSPkzs+iNlpVkJqijrpcd6lfuDAunYH9/Rn8oLNz0yLfkl8lt+xOdUU4IkFt3oVcTBEFCnzAzv4B8YhyA==", + "dependencies": { + "metro-core": "0.80.6", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache-key": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.6.tgz", + "integrity": "sha512-DFmjQacC8m/S3HpELklLMWkPGP/fZPX3BSgjd0xQvwIvWyFwk8Nn/lfp/uWdEVDtDSIr64/anXU5uWohGwlWXw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro-config": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.6.tgz", + "integrity": "sha512-vHYYvJpRTWYbmvqlR7i04xQpZCHJ6yfZ/xIcPdz2ssbdJGGJbiT1Aar9wr8RAhsccSxdJgfE5B1DB8Mo+DnhIg==", + "dependencies": { + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "jest-validate": "^29.6.3", + "metro": "0.80.6", + "metro-cache": "0.80.6", + "metro-core": "0.80.6", + "metro-runtime": "0.80.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-core": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.6.tgz", + "integrity": "sha512-fn4rryTUAwzFJWj7VIPDH4CcW/q7MV4oGobqR6NsuxZoIGYrVpK7pBasumu5YbCqifuErMs5s23BhmrDNeZURw==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.80.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-file-map": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.6.tgz", + "integrity": "sha512-S3CUqvpXpc+q3q+hCEWvFKhVqgq0VmXdZQDF6u7ue86E2elq1XLnfLOt9JSpwyhpMQRyysjSCnd/Yh6GZMNHoQ==", + "dependencies": { + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro-minify-terser": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.6.tgz", + "integrity": "sha512-83eZaH2+B+jP92KuodPqXknzwmiboKAuZY4doRfTEEXAG57pNVNN6cqSRJlwDnmaTBKRffxoncBXbYqHQgulgg==", + "dependencies": { + "terser": "^5.15.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-react-native-babel-preset": { + "version": "0.77.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.77.0.tgz", + "integrity": "sha512-HPPD+bTxADtoE4y/4t1txgTQ1LVR6imOBy7RMHUsqMVTbekoi8Ph5YI9vKX2VMPtVWeFt0w9YnCSLPa76GcXsA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro-react-native-babel-preset/node_modules/react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-resolver": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.6.tgz", + "integrity": "sha512-R7trfglG4zY4X9XyM9cvuffAhQ9W1reWoahr1jdEWa6rOI8PyM0qXjcsb8l+fsOQhdSiVlkKcYAmkyrs1S/zrA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-runtime": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.6.tgz", + "integrity": "sha512-21GQVd0pp2nACoK0C2PL8mBsEhIFUFFntYrWRlYNHtPQoqDzddrPEIgkyaABGXGued+dZoBlFQl+LASlmmfkvw==", + "dependencies": { + "@babel/runtime": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-source-map": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.6.tgz", + "integrity": "sha512-lqDuSLctWy9Qccu4Zl0YB1PzItpsqcKGb1nK0aDY+lzJ26X65OCib2VzHlj+xj7e4PiIKOfsvDCczCBz4cnxdg==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.80.6", + "nullthrows": "^1.1.1", + "ob1": "0.80.6", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.6.tgz", + "integrity": "sha512-SGwKeBi+lK7NmM5+EcW6DyRRa9HmGSvH0LJtlT4XoRMbpxzsLYs0qUEA+olD96pOIP+ta7I8S30nQr2ttqgO8A==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.80.6", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.6.tgz", + "integrity": "sha512-e04tdTC5Fy1vOQrTTXb5biao0t7nR/h+b1IaBTlM5UaHaAJZr658uVOoZhkRxKjbhF2mIwJ/8DdorD2CA15BCg==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.6.tgz", + "integrity": "sha512-jV+VgCLiCj5jQadW/h09qJaqDreL6XcBRY52STCoz2xWn6WWLLMB5nXzQtvFNPmnIOps+Xu8+d5hiPcBNOhYmA==", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "metro": "0.80.6", + "metro-babel-transformer": "0.80.6", + "metro-cache": "0.80.6", + "metro-cache-key": "0.80.6", + "metro-minify-terser": "0.80.6", + "metro-source-map": "0.80.6", + "metro-transform-plugins": "0.80.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", + "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", + "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", + "dependencies": { + "hermes-estree": "0.19.1" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/metro/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/modal-react-native-web": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/modal-react-native-web/-/modal-react-native-web-0.2.0.tgz", + "integrity": "sha512-sC0/jL3ZL4bGtv1VS43TnrH7/FHUqgb7IU3VYWNDzuR223fYlpG5Gc974GsTP172Vi+lnnBL/G70xONmaggxeQ==", + "dependencies": { + "warning": "^4.0.1" + }, + "peerDependencies": { + "react": "16.x.x", + "react-art": "16.x.x", + "react-dom": "16.x.x", + "react-native-web": "0.9.x" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", + "optional": true, + "dependencies": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/mv/node_modules/glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "optional": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mv/node_modules/rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "optional": true, + "dependencies": { + "glob": "^6.0.1" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "optional": true, + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dependencies": { + "lodash.toarray": "^4.4.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-url/node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url/node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", + "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "dependencies": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ob1": { + "version": "0.80.6", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.6.tgz", + "integrity": "sha512-nlLGZPMQ/kbmkdIb5yvVzep1jKUII2x6ehNsHpgy71jpnJMW7V+KsB3AjYI2Ajb7UqMAMNjlssg6FUodrEMYzg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimism": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", + "dependencies": { + "@wry/caches": "^1.0.0", + "@wry/context": "^0.7.0", + "@wry/trie": "^0.4.3", + "tslib": "^2.3.0" + } + }, + "node_modules/optimism/node_modules/@wry/trie": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.4.3.tgz", + "integrity": "sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/ora/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dependencies": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/os-locale/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/os-locale/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/os-locale/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/password-prompt": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.3.tgz", + "integrity": "sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==", + "dependencies": { + "ansi-escapes": "^4.3.2", + "cross-spawn": "^7.0.3" + } + }, + "node_modules/password-prompt/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/password-prompt/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/plist/node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.36.tgz", + "integrity": "sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-config-standard": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/prettier-config-standard/-/prettier-config-standard-7.0.0.tgz", + "integrity": "sha512-NgZy4TYupJR6aMMuV/Aqs0ONnVhlFT8PXVkYRskxREq8EUhJHOddVfBxPV6fWpgcASpJSgvvhVLk0CBO5M3Hvw==", + "dev": true, + "peerDependencies": { + "prettier": "^2.6.0 || ^3.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-async-hook": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/react-async-hook/-/react-async-hook-3.6.1.tgz", + "integrity": "sha512-YWBB2feVQF79t5u2raMPHlZ8975Jds+guCvkWVC4kRLDlSCouLsYpQm4DGSqPeHvoHYVVcDfqNayLZAXQmnxnw==", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-deep-force-update": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz", + "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==", + "dev": true + }, + "node_modules/react-devtools-core": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", + "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-freeze": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", + "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-i18next": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz", + "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-native": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.4.tgz", + "integrity": "sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==", + "dependencies": { + "@jest/create-cache-key-function": "^29.6.3", + "@react-native-community/cli": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native/assets-registry": "0.73.1", + "@react-native/codegen": "0.73.3", + "@react-native/community-cli-plugin": "0.73.16", + "@react-native/gradle-plugin": "0.73.4", + "@react-native/js-polyfills": "0.73.1", + "@react-native/normalize-colors": "0.73.2", + "@react-native/virtualized-lists": "0.73.4", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "base64-js": "^1.5.1", + "chalk": "^4.0.0", + "deprecated-react-native-prop-types": "^5.0.0", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "jest-environment-node": "^29.6.3", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^4.27.7", + "react-refresh": "^0.14.0", + "react-shallow-renderer": "^16.15.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-native-animatable": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.3.tgz", + "integrity": "sha512-2ckIxZQAsvWn25Ho+DK3d1mXIgj7tITkrS4pYDvx96WyOttSvzzFeQnM2od0+FUMzILbdHDsDEqZvnz1DYNQ1w==", + "dependencies": { + "prop-types": "^15.7.2" + } + }, + "node_modules/react-native-button": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-native-button/-/react-native-button-3.1.0.tgz", + "integrity": "sha512-z/KUH1zXHTYoGfldGRm8DKTdYO/5DgNYJDdi/kRdDesb7rx9PiM1ZMq1PUjT+/B0uy/BltJnSLhLCvs4pTL7uQ==", + "dependencies": { + "deprecated-react-native-prop-types": "^3.0.1", + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/react-native-button/node_modules/deprecated-react-native-prop-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-3.0.2.tgz", + "integrity": "sha512-JoZY5iNM+oJlN2Ldpq0KSi0h3Nig4hlNJj5nWzWp8eL3uikMCvHwjSGPitwkEw0arL5JFra5nuGJQpXRbEjApg==", + "dependencies": { + "@react-native/normalize-color": "^2.1.0", + "invariant": "^2.2.4", + "prop-types": "^15.8.1" + } + }, + "node_modules/react-native-communications": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-native-communications/-/react-native-communications-2.2.1.tgz", + "integrity": "sha512-5+C0X9mopI0+qxyQHzOPEi5v5rxNBQjxydPPiKMQSlX1RBIcJ8uTcqUPssQ9Mo8p6c1IKIWJUSqCj4jAmD0qVQ==" + }, + "node_modules/react-native-country-picker-modal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-native-country-picker-modal/-/react-native-country-picker-modal-2.0.0.tgz", + "integrity": "sha512-p0wfkKx1mOCEkn3Qm2/FA8TrxSdUw/nqaCcT6KYvIGmPtPdia1Ce+iWh5G0j2hZcDs6yJSkYAx+7lrZ0HwixAw==", + "dependencies": { + "@callstack/react-theme-provider": "3.0.3", + "fuse.js": "3.4.5", + "modal-react-native-web": "0.2.0", + "node-emoji": "1.10.0", + "prop-types": "15.7.2", + "react-async-hook": "3.6.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-native": "*", + "react-native-web": "*" + } + }, + "node_modules/react-native-country-picker-modal/node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/react-native-flash-message": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/react-native-flash-message/-/react-native-flash-message-0.4.2.tgz", + "integrity": "sha512-YvdXRW9AGMTI99S3DJZhLO0mbk/ehKv/UQf4/Df+3dtGi8DlkidRbyqCQZk1WMtZ7rN85PMTGr/xEI9CF9z0YA==", + "dependencies": { + "prop-types": "^15.8.1", + "react-native-iphone-screen-helper": "^2.0.2" + }, + "peerDependencies": { + "prop-types": "^15.0 || ^16.0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.14.1.tgz", + "integrity": "sha512-YiM1BApV4aKeuwsM6O4C2ufwewYEKk6VMXOt0YqEZFMwABBFWhXLySFZYjBSNRU2USGppJbfHP1q1DfFQpKhdA==", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-gifted-chat": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-native-gifted-chat/-/react-native-gifted-chat-2.4.0.tgz", + "integrity": "sha512-dTpSMH8T4s16dM75oLXiDawpXoVSnApJZY9TWf0jYSRShw++0knnp38hO857zOrt6XhqJKm0JntT0pywYI3rYg==", + "dependencies": { + "@expo/react-native-action-sheet": "4.0.1", + "dayjs": "1.8.26", + "prop-types": "15.7.2", + "react-native-communications": "2.2.1", + "react-native-iphone-x-helper": "1.3.1", + "react-native-lightbox-v2": "0.9.0", + "react-native-parsed-text": "0.0.22", + "react-native-typing-animation": "0.1.7", + "use-memo-one": "1.1.3", + "uuid": "3.4.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-gifted-chat/node_modules/dayjs": { + "version": "1.8.26", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.26.tgz", + "integrity": "sha512-KqtAuIfdNfZR5sJY1Dixr2Is4ZvcCqhb0dZpCOt5dGEFiMzoIbjkTSzUb4QKTCsP+WNpGwUjAFIZrnZvUxxkhw==" + }, + "node_modules/react-native-gifted-chat/node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/react-native-gifted-chat/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/react-native-google-places-autocomplete": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/react-native-google-places-autocomplete/-/react-native-google-places-autocomplete-2.5.6.tgz", + "integrity": "sha512-Dy7mFKyEoiNeWPLd7HUkrI/SzJYe7GST55FGtiXzXDoPs05LYHIOCPrT9qFE51COh5X8kgDKm+f7D5aMY/aMbg==", + "dependencies": { + "lodash.debounce": "^4.0.8", + "prop-types": "^15.7.2", + "qs": "~6.9.1" + }, + "peerDependencies": { + "react-native": ">= 0.59" + } + }, + "node_modules/react-native-iphone-screen-helper": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-screen-helper/-/react-native-iphone-screen-helper-2.1.1.tgz", + "integrity": "sha512-geuw/bli83+tOg8UpoioLk1H1aEy0wnMDusWkCazsyH6fSk6qzmgaZ2cRyyJRU8s2tG87HctZFKGTkyYzcUcfA==", + "peerDependencies": { + "react-native": ">=0.42.0" + } + }, + "node_modules/react-native-iphone-x-helper": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", + "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==", + "peerDependencies": { + "react-native": ">=0.42.0" + } + }, + "node_modules/react-native-lightbox-v2": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/react-native-lightbox-v2/-/react-native-lightbox-v2-0.9.0.tgz", + "integrity": "sha512-Fc5VFHFj2vokS+OegyTsANKb1CYoUlOtAv+EBH5wtpJn1b5cey6jVXH7136G5+8OC9JmKWSgKHc5thFwOoZTUg==", + "peerDependencies": { + "react": ">=16.8.0", + "react-native": ">=0.61.0" + } + }, + "node_modules/react-native-maps": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/react-native-maps/-/react-native-maps-1.10.0.tgz", + "integrity": "sha512-Zs6lHZucEijTwkRVFyInMbPVkJ2UudDEI2fJPc8ArdzdnwDFAdL6OagqTjNRZyI1DBPHRihazfIWpy2+X1VwLg==", + "dependencies": { + "@types/geojson": "^7946.0.13" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": ">= 17.0.1", + "react-native": ">= 0.64.3", + "react-native-web": ">= 0.11" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/react-native-material-textfield": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/react-native-material-textfield/-/react-native-material-textfield-0.16.1.tgz", + "integrity": "sha512-pcV/ic3i6vYEODS7pvAMUYJ+evkzIB8cjXtSzkab9rBtYNGRpAlM0Yp8QNnjZ7foZqkj9Ynav0nguWcuJST10A==", + "dependencies": { + "prop-types": "^15.5.9" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-native": ">=0.55.0" + } + }, + "node_modules/react-native-modal": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-13.0.1.tgz", + "integrity": "sha512-UB+mjmUtf+miaG/sDhOikRfBOv0gJdBU2ZE1HtFWp6UixW9jCk/bhGdHUgmZljbPpp0RaO/6YiMmQSSK3kkMaw==", + "dependencies": { + "prop-types": "^15.6.2", + "react-native-animatable": "1.3.3" + }, + "peerDependencies": { + "react": "*", + "react-native": ">=0.65.0" + } + }, + "node_modules/react-native-modalize": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-native-modalize/-/react-native-modalize-2.1.1.tgz", + "integrity": "sha512-4/7EZWsrUqAAkkAVEnOsSdpAPQaEBewX7TvwFuzgvGDzxKpq3O58I9SnSeU8QtG/r91XYHJNaU5dAuDrcLjUaQ==", + "peerDependencies": { + "react": "> 15.0.0", + "react-native": "> 0.50.0", + "react-native-gesture-handler": "> 1.0.0" + } + }, + "node_modules/react-native-paper": { + "version": "5.12.3", + "resolved": "https://registry.npmjs.org/react-native-paper/-/react-native-paper-5.12.3.tgz", + "integrity": "sha512-nH1e1pGPE/aOE5YR2GRX7CfMHFA9cAfrAfgCtwL4amJPDZCoVjc5yt2VDiUE1rT+JUfk0qdICMP3UggxvjMgug==", + "dependencies": { + "@callstack/react-theme-provider": "^3.0.9", + "color": "^3.1.2", + "use-latest-callback": "^0.1.5" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-safe-area-context": "*", + "react-native-vector-icons": "*" + } + }, + "node_modules/react-native-paper/node_modules/@callstack/react-theme-provider": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@callstack/react-theme-provider/-/react-theme-provider-3.0.9.tgz", + "integrity": "sha512-tTQ0uDSCL0ypeMa8T/E9wAZRGKWj8kXP7+6RYgPTfOPs9N07C9xM8P02GJ3feETap4Ux5S69D9nteq9mEj86NA==", + "dependencies": { + "deepmerge": "^3.2.0", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-native-paper/node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/react-native-paper/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/react-native-paper/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/react-native-paper/node_modules/deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-parsed-text": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/react-native-parsed-text/-/react-native-parsed-text-0.0.22.tgz", + "integrity": "sha512-hfD83RDXZf9Fvth3DowR7j65fMnlqM9PpxZBGWkzVcUTFtqe6/yPcIoIAgrJbKn6YmtzkivmhWE2MCE4JKBXrQ==", + "dependencies": { + "prop-types": "^15.7.x" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-phone-number-input": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-native-phone-number-input/-/react-native-phone-number-input-2.1.0.tgz", + "integrity": "sha512-EItzeDH6QUw6Kd1uwqFgcUl1YstxULB1M3HuCMHTvHVLoPE3ddjiuHyx+EHs0+4FcZtaXLQzLuC4cC/c4XIEuA==", + "dependencies": { + "google-libphonenumber": "^3.2.10", + "react-native-country-picker-modal": "^2.0.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-reanimated": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.6.3.tgz", + "integrity": "sha512-2KkkPozoIvDbJcHuf8qeyoLROXQxizSi+2CTCkuNVkVZOxxY4B0Omvgq61aOQhSZUh/649x1YHoAaTyGMGDJUw==", + "dependencies": { + "@babel/plugin-transform-object-assign": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", + "convert-source-map": "^2.0.0", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0-0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0-0", + "@babel/plugin-transform-arrow-functions": "^7.0.0-0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", + "@babel/plugin-transform-template-literals": "^7.0.0-0", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.8.2.tgz", + "integrity": "sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.29.0.tgz", + "integrity": "sha512-yB1GoAMamFAcYf4ku94uBPn0/ani9QG7NdI98beJ5cet2YFESYYzuEIuU+kt+CNRcO8qqKeugxlfgAa3HyTqlg==", + "dependencies": { + "react-freeze": "^1.0.0", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-star-rating": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-native-star-rating/-/react-native-star-rating-1.1.0.tgz", + "integrity": "sha512-ocOYx+BKUvfruvXm45MBbQZtpkVO3PQieBDepB0FaLuxE3vUtDTPzHqXuBes3iCM5oRi5umrnmMUMsM0mEq5ZA==", + "dependencies": { + "prop-types": "^15.5.10", + "react-native-animatable": "^1.2.4", + "react-native-button": "^2.3.0", + "react-native-vector-icons": "^4.5.0" + } + }, + "node_modules/react-native-star-rating/node_modules/react-native-button": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/react-native-button/-/react-native-button-2.4.0.tgz", + "integrity": "sha512-4siaJlpOLeL9fAhX8VU3cnUfcGLe3E2zABDWSKxkF+NiYOd+AnKeYY29WXlV8hXhCFo+Ry7E+alrJ6zjZLTSfg==", + "dependencies": { + "prop-types": "^15.5.10" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/react-native-svg": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-14.1.0.tgz", + "integrity": "sha512-HeseElmEk+AXGwFZl3h56s0LtYD9HyGdrpg8yd9QM26X+d7kjETrRQ9vCjtxuT5dCZEIQ5uggU1dQhzasnsCWA==", + "dependencies": { + "css-select": "^5.1.0", + "css-tree": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-typing-animation": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/react-native-typing-animation/-/react-native-typing-animation-0.1.7.tgz", + "integrity": "sha512-4H3rF9M+I2yAZpYJcY0Mb29TXkn98QK12rrKSY6LZj1BQD9NNmRZuNXzwX4XHapsIz+N/J8M3p27FOQPbfzqeg==", + "peerDependencies": { + "prop-types": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-vector-icons": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-4.6.0.tgz", + "integrity": "sha512-rpfhfPiXCK2PX1nrNhdxSMrEGB/Gw/SvKoPM0G2wAkSoqynnes19K0VYI+Up7DqR1rFIpE4hP2erpT1tNx2tfg==", + "dependencies": { + "lodash": "^4.0.0", + "prop-types": "^15.5.10", + "yargs": "^8.0.2" + }, + "bin": { + "generate-icon": "bin/generate-icon.js" + } + }, + "node_modules/react-native-vector-icons/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/react-native-vector-icons/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-vector-icons/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/react-native-vector-icons/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-vector-icons/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-vector-icons/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-native-vector-icons/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/react-native-vector-icons/node_modules/yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha512-3RiZrpLpjrzIAKgGdPktBcMP/eG5bDFlkI+PHle1qwzyVXyDQL+pD/eZaMoOOO0Y7LLBfjpucObuUm/icvbpKQ==", + "dependencies": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha512-WhzC+xgstid9MbVUktco/bf+KJG+Uu6vMX0LN1sLJvwmbCQVxb4D8LzogobonKycNasCZLdOzTAk1SK7+K7swg==", + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/react-native-webview": { + "version": "13.6.4", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.6.4.tgz", + "integrity": "sha512-AdgmaMBHPcyERTvng9eSGgHX6AleyUlSusWAxngSOSdiYGgHW81T6C5A8j/ImJAF9oZg0bQDxp43Hu56tzENZQ==", + "dependencies": { + "escape-string-regexp": "2.0.0", + "invariant": "2.2.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-webview/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-native/node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/react-native/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-navigation-collapsible": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/react-navigation-collapsible/-/react-navigation-collapsible-6.3.0.tgz", + "integrity": "sha512-EKr7e9/NrYswmLGNyO+PvUJ58OSMGlan0dWXtaZuW2hblv/HEa/5W0A8cRxFfokcZfaVv154OsviW+4Rc/1dvA==", + "dependencies": { + "react-native-iphone-x-helper": "^1.3.1", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "@react-navigation/native": ">=6", + "@react-navigation/stack": ">=6", + "react": ">=16.8", + "react-native": ">=0.59" + } + }, + "node_modules/react-proxy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", + "integrity": "sha512-46GkBpZD97R/vV+iw+u6aFACzIHOst9gCl41d5K5vepPBz2i2gqHmXQJWKXsrUsSOdylKahN3sd9taswFN8Wzw==", + "dev": true, + "dependencies": { + "lodash": "^4.6.1", + "react-deep-force-update": "^1.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", + "dev": true, + "dependencies": { + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-test-renderer/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-transform-hmr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz", + "integrity": "sha512-8bK1DWUZynE6swD2jNPbzO5mvhB8fs9Ub5GksoVqYkc9i06FdSLC36qQYjaKOW79KBdsROq2cK0tRKITiEzmyg==", + "dev": true, + "dependencies": { + "global": "^4.3.0", + "react-proxy": "^1.1.7" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehackt": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.0.6.tgz", + "integrity": "sha512-l3WEzkt4ntlEc/IB3/mF6SRgNHA6zfQR7BlGOgBTOmx7IJJXojDASav+NsgXHFjHn+6RmwqsGPFgZpabWpeOdw==", + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/response-iterator": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/response-iterator/-/response-iterator-0.2.6.tgz", + "integrity": "sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rn-placeholder": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/rn-placeholder/-/rn-placeholder-3.0.3.tgz", + "integrity": "sha512-EmVeLT8zDcTPilQZ2OHO/IiYUy2gApKGgbshDZBX0C4qxsn0cFATwgwOwyz8O7Vwg1Hul97Ci95hu7d6Js6XMQ==", + "peerDependencies": { + "react": "^16.13.1", + "react-native": "^0.63.2" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-stringify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", + "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", + "optional": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/sentry-expo": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sentry-expo/-/sentry-expo-7.2.0.tgz", + "integrity": "sha512-stVE2B1RgHxpcup8XU1UIGhoI3cta63guExInl6WYx3d5HsvIu8PZ0yDJnJGflYi9cKPAUCxErIQXMTrS0JQEw==", + "dependencies": { + "@expo/spawn-async": "^1.7.0", + "@sentry/integrations": "7.81.1", + "@sentry/react": "7.81.1", + "@sentry/react-native": "5.17.0", + "@sentry/types": "7.81.1", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "peerDependencies": { + "expo": ">=47.0.0", + "expo-application": "*", + "expo-constants": "*", + "expo-device": "*" + } + }, + "node_modules/sentry-expo/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sentry-expo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.1.0.tgz", + "integrity": "sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==" + }, + "node_modules/subscriptions-transport-ws": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.11.0.tgz", + "integrity": "sha512-8D4C6DIH5tGiAIpp5I0wD/xRlNiZAPGHygzCe7VzyzUoxHtawzjNAY9SUTXU05/EY2NMY9/9GF0ycizkXr1CWQ==", + "deprecated": "The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md", + "dependencies": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependencies": { + "graphql": "^15.7.2 || ^16.0.0" + } + }, + "node_modules/subscriptions-transport-ws/node_modules/eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "node_modules/subscriptions-transport-ws/node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subscriptions-transport-ws/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sudo-prompt": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz", + "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", + "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/ts-invariant": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", + "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==" + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/url/node_modules/qs": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/use-latest-callback": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.1.9.tgz", + "integrity": "sha512-CL/29uS74AwreI/f2oz2hLTW7ZqVeV5+gxFeGudzQrgkCytrHw33G4KbnQOrRlAEzzAFXi7dDLMC9zhWcVpzmw==", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==" + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", + "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xcode/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", + "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", + "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zen-observable-ts": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", + "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", + "dependencies": { + "zen-observable": "0.8.15" + } + } + } +} diff --git a/enatega-multivendor-app/package.json b/enatega-multivendor-app/package.json new file mode 100644 index 0000000..5832450 --- /dev/null +++ b/enatega-multivendor-app/package.json @@ -0,0 +1,126 @@ +{ + "name": "enatega-full-app", + "version": "5.0.0", + "main": "node_modules/expo/AppEntry.js", + "scripts": { + "start": "expo start --offline", + "android": "expo run:android", + "ios": "expo run:ios", + "eject": "expo eject", + "format": "prettier --write '**/*.js'", + "lint:fix": "eslint . --ext .js --fix", + "postinstall": "patch-package", + "build:staging": "eas build --profile staging -p all", + "build:staging:android": "eas build --profile staging -p android", + "build:staging:ios": "eas build --profile staging -p ios", + "build:production": "eas build --profile production -p all", + "build:production:android": "eas build --profile production -p android", + "build:production:ios": "eas build --profile production -p ios", + "submit:production": "eas submit --profile production -p all", + "submit:production:android": "eas submit --profile production -p android", + "submit:production:ios": "eas submit --profile production -p ios", + "publish:staging": "ENVIRONMENT=staging expo publish --release-channel staging", + "publish:production": "ENVIRONMENT=production expo publish --release-channel production" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "npm run format", + "npm run lint:fix" + ] + }, + "dependencies": { + "@amplitude/analytics-react-native": "^1.1.1", + "@apollo/client": "^3.5.6", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@expo/vector-icons": "^14.0.0", + "@react-native-async-storage/async-storage": "1.21.0", + "@react-native-community/datetimepicker": "7.6.1", + "@react-native-google-signin/google-signin": "^11.0.0", + "@react-navigation/drawer": "^6.3.0", + "@react-navigation/elements": "^1.2.1", + "@react-navigation/native": "^6.0.6", + "@react-navigation/stack": "^6.0.11", + "@sentry/react-native": "5.17.0", + "@twotalltotems/react-native-otp-input": "^1.3.11", + "core-js": "^3.33.3", + "deprecated-react-native-prop-types": "^5.0.0", + "expo": "~50.0.3", + "expo-apple-authentication": "~6.3.0", + "expo-application": "~5.8.3", + "expo-constants": "~15.4.5", + "expo-crypto": "~12.8.0", + "expo-dev-client": "~3.3.8", + "expo-device": "~5.9.3", + "expo-font": "~11.10.2", + "expo-image-picker": "~14.7.1", + "expo-localization": "~14.8.3", + "expo-location": "~16.5.2", + "expo-notifications": "~0.27.5", + "expo-random": "~13.6.0", + "expo-splash-screen": "~0.26.4", + "expo-system-ui": "~2.9.3", + "expo-tracking-transparency": "~3.3.0", + "expo-updates": "~0.24.10", + "expo-web-browser": "~12.8.2", + "graphql": "^16.8.1", + "graphql-tag": "^2.10.1", + "i18n-js": "^4.3.2", + "i18next": "^23.7.6", + "install": "^0.13.0", + "moment": "^2.29.1", + "patch-package": "^8.0.0", + "react": "18.2.0", + "react-i18next": "^14.0.1", + "react-native": "0.73.4", + "react-native-button": "^3.0.1", + "react-native-country-picker-modal": "^2.0.0", + "react-native-flash-message": "^0.4.2", + "react-native-gesture-handler": "~2.14.0", + "react-native-gifted-chat": "^2.4.0", + "react-native-google-places-autocomplete": "^2.1.1", + "react-native-maps": "1.10.0", + "react-native-material-textfield": "^0.16.1", + "react-native-modal": "^13.0.1", + "react-native-modalize": "^2.0.13", + "react-native-paper": "^5.8.0", + "react-native-phone-number-input": "^2.1.0", + "react-native-reanimated": "~3.6.2", + "react-native-safe-area-context": "4.8.2", + "react-native-screens": "~3.29.0", + "react-native-star-rating": "^1.1.0", + "react-native-svg": "14.1.0", + "react-native-webview": "13.6.4", + "react-navigation-collapsible": "^6.3.0", + "rn-placeholder": "^3.0.1", + "sentry-expo": "~7.2.0", + "subscriptions-transport-ws": "^0.11.0", + "uglify-js": "^3.17.4", + "uuid": "^9.0.1", + "expo-linking": "~6.2.2" + }, + "devDependencies": { + "@expo/metro-config": "^0.17.3", + "babel-preset-expo": "^10.0.0", + "babel-preset-react-native": "^4.0.1", + "eslint": "^8.56.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-react": "^7.20.0", + "eslint-plugin-standard": "^5.0.0", + "husky": "^8.0.3", + "lint-staged": "^15.2.0", + "metro-react-native-babel-preset": "^0.77.0", + "prettier": "^3.2.4", + "prettier-config-standard": "^7.0.0", + "react-test-renderer": "^18.2.0" + }, + "private": true +} diff --git a/enatega-multivendor-app/patches/@twotalltotems+react-native-otp-input+1.3.11.patch b/enatega-multivendor-app/patches/@twotalltotems+react-native-otp-input+1.3.11.patch new file mode 100644 index 0000000..8bf7ea8 --- /dev/null +++ b/enatega-multivendor-app/patches/@twotalltotems+react-native-otp-input+1.3.11.patch @@ -0,0 +1,15 @@ +diff --git a/node_modules/@twotalltotems/react-native-otp-input/dist/index.js b/node_modules/@twotalltotems/react-native-otp-input/dist/index.js +index 71580b8..c9a05de 100644 +--- a/node_modules/@twotalltotems/react-native-otp-input/dist/index.js ++++ b/node_modules/@twotalltotems/react-native-otp-input/dist/index.js +@@ -10,8 +10,8 @@ export default class OTPInputView extends Component { + this.fields = []; + this.copyCodeFromClipBoardOnAndroid = () => { + if (Platform.OS === "android") { +- this.checkPinCodeFromClipBoard(); +- this.timer = setInterval(this.checkPinCodeFromClipBoard, 400); ++ // this.checkPinCodeFromClipBoard(); ++ // this.timer = setInterval(this.checkPinCodeFromClipBoard, 400); + } + }; + this.bringUpKeyBoardIfNeeded = () => { diff --git a/enatega-multivendor-app/patches/react-native+0.73.4.patch b/enatega-multivendor-app/patches/react-native+0.73.4.patch new file mode 100644 index 0000000..f4e3b53 --- /dev/null +++ b/enatega-multivendor-app/patches/react-native+0.73.4.patch @@ -0,0 +1,51 @@ +diff --git a/node_modules/react-native/Libraries/Renderer/implementations/.ReactNativeRenderer-dev.js.swp b/node_modules/react-native/Libraries/Renderer/implementations/.ReactNativeRenderer-dev.js.swp +new file mode 100644 +index 0000000..e69de29 +diff --git a/node_modules/react-native/index.js b/node_modules/react-native/index.js +index 7149c64..6939b48 100644 +--- a/node_modules/react-native/index.js ++++ b/node_modules/react-native/index.js +@@ -380,43 +380,15 @@ module.exports = { + }, + // Deprecated Prop Types + get ColorPropType(): $FlowFixMe { +- console.error( +- 'ColorPropType will be removed from React Native, along with all ' + +- 'other PropTypes. We recommend that you migrate away from PropTypes ' + +- 'and switch to a type system like TypeScript. If you need to ' + +- 'continue using ColorPropType, migrate to the ' + +- "'deprecated-react-native-prop-types' package.", +- ); + return require('deprecated-react-native-prop-types').ColorPropType; + }, + get EdgeInsetsPropType(): $FlowFixMe { +- console.error( +- 'EdgeInsetsPropType will be removed from React Native, along with all ' + +- 'other PropTypes. We recommend that you migrate away from PropTypes ' + +- 'and switch to a type system like TypeScript. If you need to ' + +- 'continue using EdgeInsetsPropType, migrate to the ' + +- "'deprecated-react-native-prop-types' package.", +- ); + return require('deprecated-react-native-prop-types').EdgeInsetsPropType; + }, + get PointPropType(): $FlowFixMe { +- console.error( +- 'PointPropType will be removed from React Native, along with all ' + +- 'other PropTypes. We recommend that you migrate away from PropTypes ' + +- 'and switch to a type system like TypeScript. If you need to ' + +- 'continue using PointPropType, migrate to the ' + +- "'deprecated-react-native-prop-types' package.", +- ); + return require('deprecated-react-native-prop-types').PointPropType; + }, + get ViewPropTypes(): $FlowFixMe { +- console.error( +- 'ViewPropTypes will be removed from React Native, along with all ' + +- 'other PropTypes. We recommend that you migrate away from PropTypes ' + +- 'and switch to a type system like TypeScript. If you need to ' + +- 'continue using ViewPropTypes, migrate to the ' + +- "'deprecated-react-native-prop-types' package.", +- ); + return require('deprecated-react-native-prop-types').ViewPropTypes; + }, + }; diff --git a/enatega-multivendor-app/patches/react-native-material-textfield+0.16.1.patch b/enatega-multivendor-app/patches/react-native-material-textfield+0.16.1.patch new file mode 100644 index 0000000..796f956 --- /dev/null +++ b/enatega-multivendor-app/patches/react-native-material-textfield+0.16.1.patch @@ -0,0 +1,354 @@ +diff --git a/node_modules/react-native-material-textfield/src/components/affix/index.js b/node_modules/react-native-material-textfield/src/components/affix/index.js +index 0f85022..e467adb 100644 +--- a/node_modules/react-native-material-textfield/src/components/affix/index.js ++++ b/node_modules/react-native-material-textfield/src/components/affix/index.js +@@ -9,26 +9,26 @@ export default class Affix extends PureComponent { + numberOfLines: 1, + }; + +- static propTypes = { +- numberOfLines: PropTypes.number, +- style: Animated.Text.propTypes.style, ++ // static propTypes = { ++ // numberOfLines: PropTypes.number, ++ // style: PropTypes.object, + +- color: PropTypes.string.isRequired, +- fontSize: PropTypes.number.isRequired, ++ // color: PropTypes.string.isRequired, ++ // fontSize: PropTypes.number.isRequired, + +- type: PropTypes +- .oneOf(['prefix', 'suffix']) +- .isRequired, ++ // type: PropTypes ++ // .oneOf(['prefix', 'suffix']) ++ // .isRequired, + +- labelAnimation: PropTypes +- .instanceOf(Animated.Value) +- .isRequired, ++ // labelAnimation: PropTypes ++ // .instanceOf(Animated.Value) ++ // .isRequired, + +- children: PropTypes.oneOfType([ +- PropTypes.arrayOf(PropTypes.node), +- PropTypes.node, +- ]), +- }; ++ // children: PropTypes.oneOfType([ ++ // PropTypes.arrayOf(PropTypes.node), ++ // PropTypes.node, ++ // ]), ++ // }; + + render() { + let { labelAnimation, style, children, type, fontSize, color } = this.props; +diff --git a/node_modules/react-native-material-textfield/src/components/counter/index.js b/node_modules/react-native-material-textfield/src/components/counter/index.js +index 35d3264..8f4b8df 100644 +--- a/node_modules/react-native-material-textfield/src/components/counter/index.js ++++ b/node_modules/react-native-material-textfield/src/components/counter/index.js +@@ -1,19 +1,19 @@ + import PropTypes from 'prop-types'; + import React, { PureComponent } from 'react'; +-import { Text } from 'react-native'; ++import {TextPropTypes} from 'deprecated-react-native-prop-types'; + + import styles from './styles'; + + export default class Counter extends PureComponent { +- static propTypes = { +- count: PropTypes.number.isRequired, +- limit: PropTypes.number, ++ // static propTypes = { ++ // count: PropTypes.number.isRequired, ++ // limit: PropTypes.number, + +- baseColor: PropTypes.string.isRequired, +- errorColor: PropTypes.string.isRequired, ++ // baseColor: PropTypes.string.isRequired, ++ // errorColor: PropTypes.string.isRequired, + +- style: Text.propTypes.style, +- }; ++ // style: TextPropTypes.style, ++ // }; + + render() { + let { count, limit, baseColor, errorColor, style } = this.props; +diff --git a/node_modules/react-native-material-textfield/src/components/field/index.js b/node_modules/react-native-material-textfield/src/components/field/index.js +index 494bbaa..acb9429 100644 +--- a/node_modules/react-native-material-textfield/src/components/field/index.js ++++ b/node_modules/react-native-material-textfield/src/components/field/index.js +@@ -2,14 +2,14 @@ import PropTypes from 'prop-types'; + import React, { PureComponent } from 'react'; + import { + View, +- Text, + TextInput, + Animated, + StyleSheet, + Platform, +- ViewPropTypes, + } from 'react-native'; + ++import {TextPropTypes, ViewPropTypes} from 'deprecated-react-native-prop-types'; ++ + import Line from '../line'; + import Label from '../label'; + import Affix from '../affix'; +@@ -65,60 +65,60 @@ export default class TextField extends PureComponent { + disabled: false, + }; + +- static propTypes = { +- ...TextInput.propTypes, ++ // static propTypes = { ++ // ...TextInput.propTypes, + +- animationDuration: PropTypes.number, ++ // animationDuration: PropTypes.number, + +- fontSize: PropTypes.number, +- labelFontSize: PropTypes.number, ++ // fontSize: PropTypes.number, ++ // labelFontSize: PropTypes.number, + +- contentInset: PropTypes.shape({ +- top: PropTypes.number, +- label: PropTypes.number, +- input: PropTypes.number, +- left: PropTypes.number, +- right: PropTypes.number, +- }), ++ // contentInset: PropTypes.shape({ ++ // top: PropTypes.number, ++ // label: PropTypes.number, ++ // input: PropTypes.number, ++ // left: PropTypes.number, ++ // right: PropTypes.number, ++ // }), + +- labelOffset: Label.propTypes.offset, ++ // labelOffset: Label.propTypes.offset, + +- labelTextStyle: Text.propTypes.style, +- titleTextStyle: Text.propTypes.style, +- affixTextStyle: Text.propTypes.style, ++ // labelTextStyle: TextPropTypes.style, ++ // titleTextStyle: TextPropTypes.style, ++ // affixTextStyle: TextPropTypes.style, + +- tintColor: PropTypes.string, +- textColor: PropTypes.string, +- baseColor: PropTypes.string, ++ // tintColor: PropTypes.string, ++ // textColor: PropTypes.string, ++ // baseColor: PropTypes.string, + +- label: PropTypes.string, +- title: PropTypes.string, ++ // label: PropTypes.string, ++ // title: PropTypes.string, + +- characterRestriction: PropTypes.number, ++ // characterRestriction: PropTypes.number, + +- error: PropTypes.string, +- errorColor: PropTypes.string, ++ // error: PropTypes.string, ++ // errorColor: PropTypes.string, + +- lineWidth: PropTypes.number, +- activeLineWidth: PropTypes.number, +- disabledLineWidth: PropTypes.number, ++ // lineWidth: PropTypes.number, ++ // activeLineWidth: PropTypes.number, ++ // disabledLineWidth: PropTypes.number, + +- lineType: Line.propTypes.lineType, +- disabledLineType: Line.propTypes.lineType, ++ // lineType: Line.propTypes.lineType, ++ // disabledLineType: Line.propTypes.lineType, + +- disabled: PropTypes.bool, ++ // disabled: PropTypes.bool, + +- formatText: PropTypes.func, ++ // formatText: PropTypes.func, + +- renderLeftAccessory: PropTypes.func, +- renderRightAccessory: PropTypes.func, ++ // renderLeftAccessory: PropTypes.func, ++ // renderRightAccessory: PropTypes.func, + +- prefix: PropTypes.string, +- suffix: PropTypes.string, ++ // prefix: PropTypes.string, ++ // suffix: PropTypes.string, + +- containerStyle: (ViewPropTypes || View.propTypes).style, +- inputContainerStyle: (ViewPropTypes || View.propTypes).style, +- }; ++ // containerStyle: (ViewPropTypes || View.propTypes).style, ++ // inputContainerStyle: (ViewPropTypes || View.propTypes).style, ++ // }; + + static inputContainerStyle = styles.inputContainer; + +@@ -221,6 +221,7 @@ export default class TextField extends PureComponent { + + let options = { + toValue: this.focusState(), ++ useNativeDriver: false, + duration, + }; + +diff --git a/node_modules/react-native-material-textfield/src/components/helper/index.js b/node_modules/react-native-material-textfield/src/components/helper/index.js +index 6060f9f..7f790ca 100644 +--- a/node_modules/react-native-material-textfield/src/components/helper/index.js ++++ b/node_modules/react-native-material-textfield/src/components/helper/index.js +@@ -5,19 +5,19 @@ import { Animated } from 'react-native'; + import styles from './styles'; + + export default class Helper extends PureComponent { +- static propTypes = { +- title: PropTypes.string, +- error: PropTypes.string, ++ // static propTypes = { ++ // title: PropTypes.string, ++ // error: PropTypes.string, + +- disabled: PropTypes.bool, ++ // disabled: PropTypes.bool, + +- style: Animated.Text.propTypes.style, ++ // style: PropTypes.object, + +- baseColor: PropTypes.string, +- errorColor: PropTypes.string, ++ // baseColor: PropTypes.string, ++ // errorColor: PropTypes.string, + +- focusAnimation: PropTypes.instanceOf(Animated.Value), +- }; ++ // focusAnimation: PropTypes.instanceOf(Animated.Value), ++ // }; + + constructor(props) { + super(props); +diff --git a/node_modules/react-native-material-textfield/src/components/label/index.js b/node_modules/react-native-material-textfield/src/components/label/index.js +index 82eaf03..1ad9a93 100644 +--- a/node_modules/react-native-material-textfield/src/components/label/index.js ++++ b/node_modules/react-native-material-textfield/src/components/label/index.js +@@ -11,41 +11,41 @@ export default class Label extends PureComponent { + restricted: false, + }; + +- static propTypes = { +- numberOfLines: PropTypes.number, ++ // static propTypes = { ++ // numberOfLines: PropTypes.number, + +- disabled: PropTypes.bool, +- restricted: PropTypes.bool, ++ // disabled: PropTypes.bool, ++ // restricted: PropTypes.bool, + +- fontSize: PropTypes.number.isRequired, +- activeFontSize: PropTypes.number.isRequired, ++ // fontSize: PropTypes.number.isRequired, ++ // activeFontSize: PropTypes.number.isRequired, + +- baseColor: PropTypes.string.isRequired, +- tintColor: PropTypes.string.isRequired, +- errorColor: PropTypes.string.isRequired, ++ // baseColor: PropTypes.string.isRequired, ++ // tintColor: PropTypes.string.isRequired, ++ // errorColor: PropTypes.string.isRequired, + +- focusAnimation: PropTypes +- .instanceOf(Animated.Value) +- .isRequired, ++ // focusAnimation: PropTypes ++ // .instanceOf(Animated.Value) ++ // .isRequired, + +- labelAnimation: PropTypes +- .instanceOf(Animated.Value) +- .isRequired, ++ // labelAnimation: PropTypes ++ // .instanceOf(Animated.Value) ++ // .isRequired, + +- contentInset: PropTypes.shape({ +- label: PropTypes.number, +- }), ++ // contentInset: PropTypes.shape({ ++ // label: PropTypes.number, ++ // }), + +- offset: PropTypes.shape({ +- x0: PropTypes.number, +- y0: PropTypes.number, +- x1: PropTypes.number, +- y1: PropTypes.number, +- }), ++ // offset: PropTypes.shape({ ++ // x0: PropTypes.number, ++ // y0: PropTypes.number, ++ // x1: PropTypes.number, ++ // y1: PropTypes.number, ++ // }), + +- style: Animated.Text.propTypes.style, +- label: PropTypes.string, +- }; ++ // style: PropTypes.object, ++ // label: PropTypes.string, ++ // }; + + render() { + let { +diff --git a/node_modules/react-native-material-textfield/src/components/line/index.js b/node_modules/react-native-material-textfield/src/components/line/index.js +index 44995e9..b689387 100644 +--- a/node_modules/react-native-material-textfield/src/components/line/index.js ++++ b/node_modules/react-native-material-textfield/src/components/line/index.js +@@ -16,23 +16,23 @@ export default class Line extends PureComponent { + restricted: false, + }; + +- static propTypes = { +- lineType: lineTypes, +- disabledLineType: lineTypes, ++ // static propTypes = { ++ // lineType: lineTypes, ++ // disabledLineType: lineTypes, + +- disabled: PropTypes.bool, +- restricted: PropTypes.bool, ++ // disabled: PropTypes.bool, ++ // restricted: PropTypes.bool, + +- tintColor: PropTypes.string, +- baseColor: PropTypes.string, +- errorColor: PropTypes.string, ++ // tintColor: PropTypes.string, ++ // baseColor: PropTypes.string, ++ // errorColor: PropTypes.string, + +- lineWidth: PropTypes.number, +- activeLineWidth: PropTypes.number, +- disabledLineWidth: PropTypes.number, ++ // lineWidth: PropTypes.number, ++ // activeLineWidth: PropTypes.number, ++ // disabledLineWidth: PropTypes.number, + +- focusAnimation: PropTypes.instanceOf(Animated.Value), +- }; ++ // focusAnimation: PropTypes.instanceOf(Animated.Value), ++ // }; + + static getDerivedStateFromProps(props, state) { + let { lineWidth, activeLineWidth, disabledLineWidth } = props; diff --git a/enatega-multivendor-app/patches/react-native-modalize+2.1.1.patch b/enatega-multivendor-app/patches/react-native-modalize+2.1.1.patch new file mode 100644 index 0000000..e6d18f1 --- /dev/null +++ b/enatega-multivendor-app/patches/react-native-modalize+2.1.1.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/react-native-modalize/lib/index.js b/node_modules/react-native-modalize/lib/index.js +index 5d5edac..07a93c0 100644 +--- a/node_modules/react-native-modalize/lib/index.js ++++ b/node_modules/react-native-modalize/lib/index.js +@@ -556,7 +556,7 @@ onOpen, onOpened, onClose, onClosed, onBackButtonPress, onPositionChange, onOver + const renderChildren = () => { + const style = adjustToContentHeight ? styles_1.default.content__adjustHeight : styles_1.default.content__container; + const minDist = libraries_1.isRNGH2() ? undefined : ACTIVATED; +- return (React.createElement(react_native_gesture_handler_1.PanGestureHandler, { ref: panGestureChildrenRef, enabled: panGestureEnabled, simultaneousHandlers: [nativeViewChildrenRef, tapGestureModalizeRef], shouldCancelWhenOutside: false, onGestureEvent: handleGestureEvent, minDist: minDist, activeOffsetY: ACTIVATED, activeOffsetX: ACTIVATED, onHandlerStateChange: handleChildren }, ++ return (React.createElement(react_native_gesture_handler_1.PanGestureHandler, { ref: panGestureChildrenRef, enabled: panGestureEnabled, simultaneousHandlers: [nativeViewChildrenRef, tapGestureModalizeRef], shouldCancelWhenOutside: false, onGestureEvent: handleGestureEvent, activeOffsetY: ACTIVATED, activeOffsetX: ACTIVATED, onHandlerStateChange: handleChildren }, + React.createElement(react_native_1.Animated.View, { style: [style, childrenStyle] }, + React.createElement(react_native_gesture_handler_1.NativeViewGestureHandler, { ref: nativeViewChildrenRef, waitFor: tapGestureModalizeRef, simultaneousHandlers: panGestureChildrenRef }, renderContent())))); + }; diff --git a/enatega-multivendor-app/patches/react-native-star-rating++react-native-button+2.4.0.patch b/enatega-multivendor-app/patches/react-native-star-rating++react-native-button+2.4.0.patch new file mode 100644 index 0000000..b7a8f34 --- /dev/null +++ b/enatega-multivendor-app/patches/react-native-star-rating++react-native-button+2.4.0.patch @@ -0,0 +1,35 @@ +diff --git a/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js b/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js +index fb7cf46..cb79a71 100644 +--- a/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js ++++ b/node_modules/react-native-star-rating/node_modules/react-native-button/Button.js +@@ -2,12 +2,13 @@ import PropTypes from 'prop-types'; + import React, { Component } from 'react'; + import { + StyleSheet, +- Text, + TouchableOpacity, + View, + ViewPropTypes, + } from 'react-native'; + ++import {TextPropTypes} from 'deprecated-react-native-prop-types'; ++ + import coalesceNonElementChildren from './coalesceNonElementChildren'; + + const systemButtonOpacity = 0.2; +@@ -16,12 +17,12 @@ export default class Button extends Component { + static propTypes = { + ...TouchableOpacity.propTypes, + accessibilityLabel: PropTypes.string, +- allowFontScaling: Text.propTypes.allowFontScaling, ++ allowFontScaling: TextPropTypes.allowFontScaling, + containerStyle: ViewPropTypes.style, + disabledContainerStyle: ViewPropTypes.style, + disabled: PropTypes.bool, +- style: Text.propTypes.style, +- styleDisabled: Text.propTypes.style, ++ style: TextPropTypes.style, ++ styleDisabled: TextPropTypes.style, + childGroupStyle: ViewPropTypes.style, + }; + diff --git a/enatega-multivendor-app/patches/react-native-star-rating+1.1.0.patch b/enatega-multivendor-app/patches/react-native-star-rating+1.1.0.patch new file mode 100644 index 0000000..35a61f7 --- /dev/null +++ b/enatega-multivendor-app/patches/react-native-star-rating+1.1.0.patch @@ -0,0 +1,34 @@ +diff --git a/node_modules/react-native-star-rating/StarButton.js b/node_modules/react-native-star-rating/StarButton.js +index b6db613..ad135f6 100644 +--- a/node_modules/react-native-star-rating/StarButton.js ++++ b/node_modules/react-native-star-rating/StarButton.js +@@ -1,9 +1,11 @@ + // React and react native imports + import React, { Component } from 'react'; +-import { Image, StyleSheet, ViewPropTypes } from 'react-native'; ++import { Image, StyleSheet } from 'react-native'; + import PropTypes from 'prop-types'; + import { createIconSetFromIcoMoon } from 'react-native-vector-icons'; + ++import {ViewPropTypes} from 'deprecated-react-native-prop-types'; ++ + // Third party imports + import Button from 'react-native-button'; + import EntypoIcons from 'react-native-vector-icons/Entypo'; +diff --git a/node_modules/react-native-star-rating/StarRating.js b/node_modules/react-native-star-rating/StarRating.js +index 7aecc95..3f0a971 100644 +--- a/node_modules/react-native-star-rating/StarRating.js ++++ b/node_modules/react-native-star-rating/StarRating.js +@@ -1,9 +1,11 @@ + // React and react native imports + import React, { Component } from 'react'; +-import { View, ViewPropTypes, StyleSheet } from 'react-native'; ++import { View, StyleSheet } from 'react-native'; + import PropTypes from 'prop-types'; + import { View as AnimatableView } from 'react-native-animatable'; + ++import {ViewPropTypes} from 'deprecated-react-native-prop-types'; ++ + // Local file imports + import StarButton from './StarButton'; + diff --git a/enatega-multivendor-app/src/apollo/index.js b/enatega-multivendor-app/src/apollo/index.js new file mode 100644 index 0000000..f02bea9 --- /dev/null +++ b/enatega-multivendor-app/src/apollo/index.js @@ -0,0 +1,108 @@ +import AsyncStorage from '@react-native-async-storage/async-storage' +import { + ApolloClient, + InMemoryCache, + createHttpLink, + ApolloLink, + split, + concat, + Observable +} from '@apollo/client' +import { + getMainDefinition, + offsetLimitPagination +} from '@apollo/client/utilities' +import { WebSocketLink } from '@apollo/client/link/ws' +import useEnvVars from '../../environment' + +const setupApollo = () => { + const { GRAPHQL_URL, WS_GRAPHQL_URL } = useEnvVars() + + const cache = new InMemoryCache({ + typePolicies: { + Query: { + fields: { + _id: { + keyArgs: ['string'] + }, + orders: offsetLimitPagination() + } + }, + Category: { + fields: { + foods: { + merge(_existing, incoming) { + return incoming + } + } + } + }, + Food: { + fields: { + variations: { + merge(_existing, incoming) { + return incoming + } + } + } + } + } + }) + + const httpLink = createHttpLink({ + uri: GRAPHQL_URL + }) + + const wsLink = new WebSocketLink({ + uri: WS_GRAPHQL_URL, + options: { + reconnect: true + } + }) + + const request = async operation => { + const token = await AsyncStorage.getItem('token') + + operation.setContext({ + headers: { + authorization: token ? `Bearer ${token}` : '' + } + }) + } + + const requestLink = new ApolloLink( + (operation, forward) => + new Observable(observer => { + let handle + Promise.resolve(operation) + .then(oper => request(oper)) + .then(() => { + handle = forward(operation).subscribe({ + next: observer.next.bind(observer), + error: observer.error.bind(observer), + complete: observer.complete.bind(observer) + }) + }) + .catch(observer.error.bind(observer)) + + return () => { + if (handle) handle.unsubscribe() + } + }) + ) + + const terminatingLink = split(({ query }) => { + const { kind, operation } = getMainDefinition(query) + return kind === 'OperationDefinition' && operation === 'subscription' + }, wsLink) + + const client = new ApolloClient({ + link: concat(ApolloLink.from([terminatingLink, requestLink]), httpLink), + cache, + resolvers: {} + }) + + return client +} + +export default setupApollo diff --git a/enatega-multivendor-app/src/apollo/mutations.js b/enatega-multivendor-app/src/apollo/mutations.js new file mode 100644 index 0000000..5e0fcf0 --- /dev/null +++ b/enatega-multivendor-app/src/apollo/mutations.js @@ -0,0 +1,356 @@ +export const sendChatMessage = `mutation SendChatMessage($orderId: ID!, $messageInput: ChatMessageInput!) { + sendChatMessage(message: $messageInput, orderId: $orderId) { + success + message + data { + id + message + user { + id + name + } + createdAt + } + } + } + ` + +export const placeOrder = ` + mutation PlaceOrder($restaurant:String!,$orderInput:[OrderInput!]!,$paymentMethod:String!,$couponCode:String,$tipping:Float!, $taxationAmount: Float!,$address:AddressInput!, $orderDate: String!,$isPickedUp: Boolean!, $deliveryCharges: Float!){ + placeOrder(restaurant:$restaurant,orderInput: $orderInput,paymentMethod:$paymentMethod,couponCode:$couponCode,tipping:$tipping, taxationAmount: $taxationAmount, address:$address, orderDate: $orderDate,isPickedUp: $isPickedUp, deliveryCharges:$deliveryCharges) { + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + } + items{ + _id + title + food + description + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + title + description + quantityMinimum + quantityMaximum + } + } + user{ + _id + name + phone + } + rider{ + _id + name + } + review{ + _id + } + paymentMethod + paidAmount + orderAmount + orderStatus + orderDate + expectedTime + isPickedUp + tipping + taxationAmount + createdAt + completionTime + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt + } + }` + +export const pushToken = `mutation PushToken($token:String){ + pushToken(token:$token){ + _id + notificationToken + } + }` + +export const forgotPassword = `mutation ForgotPassword($email:String!,$otp:String!){ + forgotPassword(email:$email,otp:$otp){ + result + } + }` + +export const resetPassword = `mutation ResetPassword($password:String!,$email:String!){ + resetPassword(password:$password,email:$email){ + result + } + }` + +export const getCoupon = `mutation Coupon($coupon:String!){ + coupon(coupon:$coupon){ + _id + title + discount + enabled + } + }` + +export const deleteAddress = `mutation DeleteAddress($id:ID!){ + deleteAddress(id:$id){ + _id + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + } + } + }` + +export const createAddress = `mutation CreateAddress($addressInput:AddressInput!){ + createAddress(addressInput:$addressInput){ + _id + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + selected + } + } + }` + +export const editAddress = `mutation EditAddress($addressInput:AddressInput!){ + editAddress(addressInput:$addressInput){ + _id + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + selected + } + } + }` + +export const changePassword = `mutation ChangePassword($oldPassword:String!,$newPassword:String!){ + changePassword(oldPassword:$oldPassword,newPassword:$newPassword) + }` + +export const selectAddress = `mutation SelectAddress($id:String!){ + selectAddress(id:$id){ + _id + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + selected + } + } + }` + +export const reviewOrder = `mutation ReviewOrder( + $order:String!, + $rating:Int!, + $description:String, + ){ + reviewOrder(reviewInput:{ + order:$order, + rating:$rating, + description:$description, + }){ + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + } + items{ + _id + title + food + description + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + title + description + quantityMinimum + quantityMaximum + } + } + user{ + _id + name + phone + } + rider{ + _id + name + } + review{ + _id + } + paymentMethod + paidAmount + orderAmount + orderStatus + tipping + taxationAmount + createdAt + completionTime + orderDate + expectedTime + isPickedUp + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt + } + }` + +export const addFavouriteRestaurant = `mutation AddFavourite($id:String!){ + addFavourite(id:$id){ + _id + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + selected + } + } + }` + +export const emailExist = ` + mutation EmailExist($email: String!) { + emailExist(email: $email) { + userType + _id + email + } + }` + +export const sendOtpToEmail = ` + mutation SendOtpToEmail($email: String!, $otp: String!) { + sendOtpToEmail(email: $email, otp: $otp) { + result + } + } + ` +export const sendOtpToPhoneNumber = ` + mutation SendOtpToPhoneNumber($phone: String!, $otp: String!) { + sendOtpToPhoneNumber(phone: $phone, otp: $otp) { + result + } + } + ` + export const Deactivate = ` + mutation deactivated($isActive: Boolean!, $email: String!) { + Deactivate(isActive: $isActive,email: $email) { + isActive + } + } + ` +export const login = ` + mutation Login($email:String,$password:String,$type:String!,$appleId:String,$name:String,$notificationToken:String){ + login(email:$email,password:$password,type:$type,appleId:$appleId,name:$name,notificationToken:$notificationToken){ + userId + token + tokenExpiration + isActive + name + email + phone + isNewUser + } + } + ` +export const createUser = ` + mutation CreateUser($phone:String,$email:String,$password:String,$name:String,$notificationToken:String,$appleId:String){ + createUser(userInput:{ + phone:$phone, + email:$email, + password:$password, + name:$name, + notificationToken:$notificationToken, + appleId:$appleId + }){ + userId + token + tokenExpiration + name + email + phone + } + }` + +export const updateUser = ` + mutation UpdateUser($name:String!,$phone:String!,$phoneIsVerified:Boolean,$emailIsVerified:Boolean){ + updateUser(updateUserInput:{name:$name,phone:$phone,phoneIsVerified:$phoneIsVerified,emailIsVerified:$emailIsVerified}){ + _id + name + phone + phoneIsVerified + emailIsVerified + } + }` + +export const updateNotificationStatus = ` + mutation UpdateNotificationStatus($offerNotification:Boolean!,$orderNotification:Boolean!){ + updateNotificationStatus(offerNotification:$offerNotification,orderNotification:$orderNotification){ + _id + notificationToken + isOrderNotification + isOfferNotification + } + }` diff --git a/enatega-multivendor-app/src/apollo/queries.js b/enatega-multivendor-app/src/apollo/queries.js new file mode 100644 index 0000000..a80ddcc --- /dev/null +++ b/enatega-multivendor-app/src/apollo/queries.js @@ -0,0 +1,524 @@ +export const User = ` +query Users { + users { + _id + email + } +}` + +export const profile = ` + query{ + profile{ + _id + name + phone + phoneIsVerified + email + emailIsVerified + notificationToken + isActive + isOrderNotification + isOfferNotification + addresses{ + _id + label + deliveryAddress + details + location{coordinates} + selected + } + favourite + } + }` + +export const order = `query Order($id:String!){ + order(id:$id){ + _id + orderId + deliveryAddress{ + location{coordinates} + deliveryAddress + details + label + } + restaurant{ + _id + name + image + address + location{coordinates} + } + items{ + title + food + description + image + quantity + variation{ + title + price + discounted + } + addons{ + title + options{ + title + description + price + } + } + } + user{ + _id + name + email + } + paymentMethod + orderAmount + orderDate + expectedTime + isPickedUp + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt + } +} +` + +export const myOrders = `query Orders($offset:Int){ + orders(offset:$offset){ + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + } + items{ + _id + title + food + description + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + title + description + quantityMinimum + quantityMaximum + } + } + user{ + _id + name + phone + } + rider{ + _id + name + } + review{ + _id + } + paymentMethod + paidAmount + orderAmount + orderStatus + tipping + taxationAmount + createdAt + completionTime + orderDate + expectedTime + isPickedUp + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt + } +} +` + +export const getConfiguration = `query Configuration{ + configuration{ + _id + currency + currencySymbol + deliveryRate + twilioEnabled + androidClientID + iOSClientID + appAmplitudeApiKey + googleApiKey + expoClientID + customerAppSentryUrl + termsAndConditions + privacyPolicy + testOtp + skipMobileVerification + skipEmailVerification + } +}` + +export const restaurantList = `query Restaurants($latitude:Float,$longitude:Float){ + nearByRestaurants(latitude:$latitude,longitude:$longitude){ + offers{ + _id + name + tag + restaurants + } + sections{ + _id + name + restaurants + } + restaurants{ + _id + orderId + orderPrefix + name + image + address + location{coordinates} + deliveryTime + minimumOrder + tax + reviewData{ + total + ratings + reviews{ + _id + order{ + user{ + _id + name + email + } + } + rating + description + createdAt + } + } + categories{ + _id + title + foods{ + _id + title + image + description + variations{ + _id + title + price + discounted + addons + } + } + } + options{ + _id + title + description + price + } + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + rating + isAvailable + openingTimes{ + day + times{ + startTime + endTime + } + } + } +} +}` + +export const restaurant = `query Restaurant($id:String){ + restaurant(id:$id){ + _id + orderId + orderPrefix + name + image + address + location{coordinates} + deliveryTime + minimumOrder + tax + reviewData{ + total + ratings + reviews{ + _id + order{ + user{ + _id + name + email + } + } + rating + description + createdAt + } + } + categories{ + _id + title + foods{ + _id + title + image + description + variations{ + _id + title + price + discounted + addons + } + } + } + options{ + _id + title + description + price + } + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + zone{ + _id + title + tax + } + rating + isAvailable + openingTimes{ + day + times{ + startTime + endTime + } + } + } +}` + +export const rider = `query Rider($id:String){ + rider(id:$id){ + _id + location {coordinates} + } +}` + +export const getTaxation = `query Taxes{ + taxes { + _id + taxationCharges + enabled + } + }` + +export const getTipping = `query Tips{ + tips { + _id + tipVariations + enabled + } + }` + +export const FavouriteRestaurant = `query UserFavourite ($latitude:Float,$longitude:Float){ + userFavourite(latitude:$latitude,longitude:$longitude) { + _id + orderId + orderPrefix + name + image + address + location{coordinates} + deliveryTime + minimumOrder + tax + reviewData{ + total + ratings + reviews{ + _id + order{ + user{ + _id + name + email + } + } + rating + description + createdAt + } + } + categories{ + _id + title + foods{ + _id + title + image + description + variations{ + _id + title + price + discounted + addons + } + } + } + options{ + _id + title + description + price + } + addons{ + _id + options + title + description + quantityMinimum + quantityMaximum + } + rating + isAvailable + openingTimes{ + day + times{ + startTime + endTime + } + } + } + }` + +export const orderFragment = `fragment NewOrder on Order { + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + } + items{ + _id + title + food + description + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + title + description + quantityMinimum + quantityMaximum + } + } + user{ + _id + name + phone + } + rider{ + _id + name + } + review{ + _id + } + paymentMethod + paidAmount + orderAmount + orderStatus + orderDate + expectedTime + isPickedUp + tipping + taxationAmount + createdAt + completionTime + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt +}` + +export const chat = `query Chat($order: ID!) { + chat(order: $order) { + id + message + user { + id + name + } + createdAt + } +}` diff --git a/enatega-multivendor-app/src/apollo/subscriptions.js b/enatega-multivendor-app/src/apollo/subscriptions.js new file mode 100644 index 0000000..5bf0ac5 --- /dev/null +++ b/enatega-multivendor-app/src/apollo/subscriptions.js @@ -0,0 +1,106 @@ +export const subscriptionOrder = `subscription SubscriptionOrder($id:String!){ + subscriptionOrder(id:$id){ + _id + orderStatus + rider{ + _id + } + completionTime + } + }` + +export const subscriptionRiderLocation = `subscription SubscriptionRiderLocation($riderId:String!){ + subscriptionRiderLocation(riderId:$riderId) { + _id + location {coordinates} + } + }` + +export const orderStatusChanged = `subscription OrderStatusChanged($userId:String!){ + orderStatusChanged(userId:$userId){ + userId + origin + order{ + _id + orderId + restaurant{ + _id + name + image + address + location{coordinates} + } + deliveryAddress{ + location{coordinates} + deliveryAddress + } + items{ + _id + title + food + description + quantity + variation{ + _id + title + price + discounted + } + addons{ + _id + options{ + _id + title + description + price + } + title + description + quantityMinimum + quantityMaximum + } + } + user{ + _id + name + phone + } + rider{ + _id + name + } + review{ + _id + } + paymentMethod + paidAmount + orderAmount + orderStatus + tipping + taxationAmount + createdAt + completionTime + orderDate + expectedTime + isPickedUp + deliveryCharges + acceptedAt + pickedAt + deliveredAt + cancelledAt + assignedAt + } + } + }` + +export const subscriptionNewMessage = `subscription SubscriptionNewMessage($order:ID!){ + subscriptionNewMessage(order:$order){ + id + message + user { + id + name + } + createdAt + } +}` diff --git a/enatega-multivendor-app/src/assets/SVG/RandomShape.js b/enatega-multivendor-app/src/assets/SVG/RandomShape.js new file mode 100644 index 0000000..06035a4 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/RandomShape.js @@ -0,0 +1,21 @@ +import React, { useContext } from 'react' +import Svg, { Path } from 'react-native-svg' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import { theme } from '../../utils/themeColors' + +function RandomShape(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + ) +} + +export default RandomShape diff --git a/enatega-multivendor-app/src/assets/SVG/arrows-loading.js b/enatega-multivendor-app/src/assets/SVG/arrows-loading.js new file mode 100644 index 0000000..5b5a61e --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/arrows-loading.js @@ -0,0 +1,18 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const ArrowsLoading = props => ( + + + +) + +export default ArrowsLoading diff --git a/enatega-multivendor-app/src/assets/SVG/customer-marker.js b/enatega-multivendor-app/src/assets/SVG/customer-marker.js new file mode 100644 index 0000000..f73db08 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/customer-marker.js @@ -0,0 +1,27 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const CustomerMarker = props => ( + + + + +) + +export default CustomerMarker diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CartIcon.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CartIcon.js new file mode 100644 index 0000000..ce87e60 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CartIcon.js @@ -0,0 +1,25 @@ +import React, { useContext } from 'react' +import Svg, { Path } from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function CartIcon(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + ) +} + +export default CartIcon diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CloseIcon.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CloseIcon.js new file mode 100644 index 0000000..1eef5e9 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CloseIcon.js @@ -0,0 +1,20 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' +function CloseIcon(props) { + return ( + + + + ) +} +export default CloseIcon diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomHomeIcon.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomHomeIcon.js new file mode 100644 index 0000000..4b5f50e --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomHomeIcon.js @@ -0,0 +1,31 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' +import Svg, { Path } from 'react-native-svg' + +const CustomHomeIcon = () => { + return ( + + + + + + ) +} + +export default CustomHomeIcon + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + } +}) diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomMarker.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomMarker.js new file mode 100644 index 0000000..b9eefe1 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomMarker.js @@ -0,0 +1,23 @@ +import React, { useContext } from 'react' +import Svg, { Path } from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function CustomMarker(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + ) +} + +export default CustomMarker diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomOtherIcon.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomOtherIcon.js new file mode 100644 index 0000000..fa886d9 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomOtherIcon.js @@ -0,0 +1,35 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' +import Svg, { Path } from 'react-native-svg' + +const CustomOtherIcon = () => { + return ( + + + + + + + ) +} + +export default CustomOtherIcon + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + } +}) diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomWorkIcon.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomWorkIcon.js new file mode 100644 index 0000000..6bca3bc --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/CustomWorkIcon.js @@ -0,0 +1,66 @@ +import React from 'react' +import { View, StyleSheet } from 'react-native' +import Svg, { Path } from 'react-native-svg' + +const CustomWorkIcon = () => { + return ( + + + + + + + + + + ) +} + +export default CustomWorkIcon + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + } +}) diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyAddress.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyAddress.js new file mode 100644 index 0000000..6cb1c43 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyAddress.js @@ -0,0 +1,197 @@ +import React, { useContext } from 'react' +import Svg, { Path, G } from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function EmptyAddress(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default EmptyAddress diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyCart.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyCart.js new file mode 100644 index 0000000..eae6b5c --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/EmptyCart.js @@ -0,0 +1,957 @@ +import React, { useContext } from 'react' +import Svg, { + Defs, + ClipPath, + Path, + G, + Rect, + Circle, + Ellipse +} from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function EmptyCart(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default EmptyCart diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/LocationPermission.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/LocationPermission.js new file mode 100644 index 0000000..bbe2333 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/LocationPermission.js @@ -0,0 +1,560 @@ +import React, { useContext } from 'react' +import Svg, { Path, G, Circle } from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function LocationPermission(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default LocationPermission diff --git a/enatega-multivendor-app/src/assets/SVG/imageComponents/SearchFood.js b/enatega-multivendor-app/src/assets/SVG/imageComponents/SearchFood.js new file mode 100644 index 0000000..2db0446 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/imageComponents/SearchFood.js @@ -0,0 +1,507 @@ +import React, { useContext } from 'react' +import Svg, { Path, G } from 'react-native-svg' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' + +function SearchFood(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} + +export default SearchFood diff --git a/enatega-multivendor-app/src/assets/SVG/order-delivered.js b/enatega-multivendor-app/src/assets/SVG/order-delivered.js new file mode 100644 index 0000000..ee64f36 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/order-delivered.js @@ -0,0 +1,483 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const OrderDelivered = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +export default OrderDelivered diff --git a/enatega-multivendor-app/src/assets/SVG/restaurant-marker.js b/enatega-multivendor-app/src/assets/SVG/restaurant-marker.js new file mode 100644 index 0000000..4f31d51 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/restaurant-marker.js @@ -0,0 +1,27 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const RestaurantMarker = props => ( + + + + +) + +export default RestaurantMarker diff --git a/enatega-multivendor-app/src/assets/SVG/restaurant-preparing.js b/enatega-multivendor-app/src/assets/SVG/restaurant-preparing.js new file mode 100644 index 0000000..181a3d7 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/restaurant-preparing.js @@ -0,0 +1,23 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const RestaurantPreparing = props => ( + + + +) + +export default RestaurantPreparing diff --git a/enatega-multivendor-app/src/assets/SVG/rider-marker.js b/enatega-multivendor-app/src/assets/SVG/rider-marker.js new file mode 100644 index 0000000..0d09936 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/rider-marker.js @@ -0,0 +1,32 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const RiderMarker = props => ( + + + + +) + +export default RiderMarker diff --git a/enatega-multivendor-app/src/assets/SVG/rider.js b/enatega-multivendor-app/src/assets/SVG/rider.js new file mode 100644 index 0000000..1638017 --- /dev/null +++ b/enatega-multivendor-app/src/assets/SVG/rider.js @@ -0,0 +1,511 @@ +import * as React from 'react' +import Svg, { Path } from 'react-native-svg' + +const Rider = props => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +) + +export default Rider diff --git a/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans300.ttf b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans300.ttf new file mode 100644 index 0000000..9e1f7f7 Binary files /dev/null and b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans300.ttf differ diff --git a/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans500.ttf b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans500.ttf new file mode 100644 index 0000000..fc028ae Binary files /dev/null and b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans500.ttf differ diff --git a/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans700.ttf b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans700.ttf new file mode 100644 index 0000000..dffdf46 Binary files /dev/null and b/enatega-multivendor-app/src/assets/font/MuseoSans/MuseoSans700.ttf differ diff --git a/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Bold.ttf b/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Bold.ttf new file mode 100644 index 0000000..1170ea9 Binary files /dev/null and b/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Bold.ttf differ diff --git a/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Regular.ttf b/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Regular.ttf new file mode 100644 index 0000000..850d03e Binary files /dev/null and b/enatega-multivendor-app/src/assets/font/Poppins/Poppins-Regular.ttf differ diff --git a/enatega-multivendor-app/src/assets/icons/backArrow.png b/enatega-multivendor-app/src/assets/icons/backArrow.png new file mode 100644 index 0000000..148128b Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/backArrow.png differ diff --git a/enatega-multivendor-app/src/assets/icons/backArrowWhite.png b/enatega-multivendor-app/src/assets/icons/backArrowWhite.png new file mode 100644 index 0000000..f85d623 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/backArrowWhite.png differ diff --git a/enatega-multivendor-app/src/assets/icons/checkmark64.png b/enatega-multivendor-app/src/assets/icons/checkmark64.png new file mode 100644 index 0000000..324bb78 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/checkmark64.png differ diff --git a/enatega-multivendor-app/src/assets/icons/cross.png b/enatega-multivendor-app/src/assets/icons/cross.png new file mode 100644 index 0000000..972f111 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/cross.png differ diff --git a/enatega-multivendor-app/src/assets/icons/crossWhite.png b/enatega-multivendor-app/src/assets/icons/crossWhite.png new file mode 100644 index 0000000..410fe09 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/crossWhite.png differ diff --git a/enatega-multivendor-app/src/assets/icons/downArrow.png b/enatega-multivendor-app/src/assets/icons/downArrow.png new file mode 100644 index 0000000..03a0775 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/downArrow.png differ diff --git a/enatega-multivendor-app/src/assets/icons/emptyHeart.png b/enatega-multivendor-app/src/assets/icons/emptyHeart.png new file mode 100644 index 0000000..01bfe8f Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/emptyHeart.png differ diff --git a/enatega-multivendor-app/src/assets/icons/filter.png b/enatega-multivendor-app/src/assets/icons/filter.png new file mode 100644 index 0000000..02b318b Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/filter.png differ diff --git a/enatega-multivendor-app/src/assets/icons/fullHeart.png b/enatega-multivendor-app/src/assets/icons/fullHeart.png new file mode 100644 index 0000000..b3e2573 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/fullHeart.png differ diff --git a/enatega-multivendor-app/src/assets/icons/gapStarRating.png b/enatega-multivendor-app/src/assets/icons/gapStarRating.png new file mode 100644 index 0000000..3af7541 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/gapStarRating.png differ diff --git a/enatega-multivendor-app/src/assets/icons/grid.png b/enatega-multivendor-app/src/assets/icons/grid.png new file mode 100644 index 0000000..24c8e78 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/grid.png differ diff --git a/enatega-multivendor-app/src/assets/icons/list.png b/enatega-multivendor-app/src/assets/icons/list.png new file mode 100644 index 0000000..47d8616 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/list.png differ diff --git a/enatega-multivendor-app/src/assets/icons/rightArrow.png b/enatega-multivendor-app/src/assets/icons/rightArrow.png new file mode 100644 index 0000000..5dfd7f0 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/rightArrow.png differ diff --git a/enatega-multivendor-app/src/assets/icons/rightArrowOrange.png b/enatega-multivendor-app/src/assets/icons/rightArrowOrange.png new file mode 100644 index 0000000..a69e316 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/rightArrowOrange.png differ diff --git a/enatega-multivendor-app/src/assets/icons/sort.png b/enatega-multivendor-app/src/assets/icons/sort.png new file mode 100644 index 0000000..435ecd1 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/sort.png differ diff --git a/enatega-multivendor-app/src/assets/icons/verfiedmark64.png b/enatega-multivendor-app/src/assets/icons/verfiedmark64.png new file mode 100644 index 0000000..5f07589 Binary files /dev/null and b/enatega-multivendor-app/src/assets/icons/verfiedmark64.png differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/beignet.jpeg b/enatega-multivendor-app/src/assets/images/ItemsList/beignet.jpeg new file mode 100644 index 0000000..7eaa5e0 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/beignet.jpeg differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/cornmealMush.jpeg b/enatega-multivendor-app/src/assets/images/ItemsList/cornmealMush.jpeg new file mode 100644 index 0000000..01e878f Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/cornmealMush.jpeg differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/coverBreakfast.jpg b/enatega-multivendor-app/src/assets/images/ItemsList/coverBreakfast.jpg new file mode 100644 index 0000000..ccf24b0 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/coverBreakfast.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/fruitPizza.jpg b/enatega-multivendor-app/src/assets/images/ItemsList/fruitPizza.jpg new file mode 100644 index 0000000..b8cc568 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/fruitPizza.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/like.png b/enatega-multivendor-app/src/assets/images/ItemsList/like.png new file mode 100644 index 0000000..4488660 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/like.png differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/liked.png b/enatega-multivendor-app/src/assets/images/ItemsList/liked.png new file mode 100644 index 0000000..86cf616 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/liked.png differ diff --git a/enatega-multivendor-app/src/assets/images/ItemsList/omelette.jpg b/enatega-multivendor-app/src/assets/images/ItemsList/omelette.jpg new file mode 100644 index 0000000..3b5eb0c Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/ItemsList/omelette.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/cashIcon.png b/enatega-multivendor-app/src/assets/images/cashIcon.png new file mode 100644 index 0000000..65a2228 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/cashIcon.png differ diff --git a/enatega-multivendor-app/src/assets/images/defaultNotification.png b/enatega-multivendor-app/src/assets/images/defaultNotification.png new file mode 100644 index 0000000..99ceb13 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/defaultNotification.png differ diff --git a/enatega-multivendor-app/src/assets/images/delivery-man.png b/enatega-multivendor-app/src/assets/images/delivery-man.png new file mode 100644 index 0000000..1bcdc0c Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/delivery-man.png differ diff --git a/enatega-multivendor-app/src/assets/images/delivery.png b/enatega-multivendor-app/src/assets/images/delivery.png new file mode 100644 index 0000000..97ed584 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/delivery.png differ diff --git a/enatega-multivendor-app/src/assets/images/drop.png b/enatega-multivendor-app/src/assets/images/drop.png new file mode 100644 index 0000000..84adf36 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/drop.png differ diff --git a/enatega-multivendor-app/src/assets/images/email.png b/enatega-multivendor-app/src/assets/images/email.png new file mode 100644 index 0000000..e813bb7 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/email.png differ diff --git a/enatega-multivendor-app/src/assets/images/emailphone.png b/enatega-multivendor-app/src/assets/images/emailphone.png new file mode 100644 index 0000000..73f5f1a Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/emailphone.png differ diff --git a/enatega-multivendor-app/src/assets/images/emptyCart.png b/enatega-multivendor-app/src/assets/images/emptyCart.png new file mode 100644 index 0000000..7868c30 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/emptyCart.png differ diff --git a/enatega-multivendor-app/src/assets/images/emptyVoucher.png b/enatega-multivendor-app/src/assets/images/emptyVoucher.png new file mode 100644 index 0000000..67f0944 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/emptyVoucher.png differ diff --git a/enatega-multivendor-app/src/assets/images/facebook.png b/enatega-multivendor-app/src/assets/images/facebook.png new file mode 100644 index 0000000..c69e1bd Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/facebook.png differ diff --git a/enatega-multivendor-app/src/assets/images/flags/de.png b/enatega-multivendor-app/src/assets/images/flags/de.png new file mode 100644 index 0000000..f6434b6 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/flags/de.png differ diff --git a/enatega-multivendor-app/src/assets/images/flags/en.png b/enatega-multivendor-app/src/assets/images/flags/en.png new file mode 100644 index 0000000..a812802 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/flags/en.png differ diff --git a/enatega-multivendor-app/src/assets/images/flags/fr.png b/enatega-multivendor-app/src/assets/images/flags/fr.png new file mode 100644 index 0000000..db42367 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/flags/fr.png differ diff --git a/enatega-multivendor-app/src/assets/images/flags/km.png b/enatega-multivendor-app/src/assets/images/flags/km.png new file mode 100644 index 0000000..a7b4fe1 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/flags/km.png differ diff --git a/enatega-multivendor-app/src/assets/images/flags/zh.png b/enatega-multivendor-app/src/assets/images/flags/zh.png new file mode 100644 index 0000000..9aa62c8 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/flags/zh.png differ diff --git a/enatega-multivendor-app/src/assets/images/foodPlaceholder.jpeg b/enatega-multivendor-app/src/assets/images/foodPlaceholder.jpeg new file mode 100644 index 0000000..cd25b54 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/foodPlaceholder.jpeg differ diff --git a/enatega-multivendor-app/src/assets/images/foodSharing.jpg b/enatega-multivendor-app/src/assets/images/foodSharing.jpg new file mode 100644 index 0000000..f0905f4 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/foodSharing.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/food_placeholder.png b/enatega-multivendor-app/src/assets/images/food_placeholder.png new file mode 100644 index 0000000..978fb34 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/food_placeholder.png differ diff --git a/enatega-multivendor-app/src/assets/images/food_placeholder1.png b/enatega-multivendor-app/src/assets/images/food_placeholder1.png new file mode 100644 index 0000000..978fb34 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/food_placeholder1.png differ diff --git a/enatega-multivendor-app/src/assets/images/giftVoucher.png b/enatega-multivendor-app/src/assets/images/giftVoucher.png new file mode 100644 index 0000000..5c3d599 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/giftVoucher.png differ diff --git a/enatega-multivendor-app/src/assets/images/google.png b/enatega-multivendor-app/src/assets/images/google.png new file mode 100644 index 0000000..05b1acd Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/google.png differ diff --git a/enatega-multivendor-app/src/assets/images/home.png b/enatega-multivendor-app/src/assets/images/home.png new file mode 100644 index 0000000..80d70ef Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/home.png differ diff --git a/enatega-multivendor-app/src/assets/images/key.png b/enatega-multivendor-app/src/assets/images/key.png new file mode 100644 index 0000000..f85dcae Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/key.png differ diff --git a/enatega-multivendor-app/src/assets/images/leftarrow.png b/enatega-multivendor-app/src/assets/images/leftarrow.png new file mode 100644 index 0000000..7952e9a Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/leftarrow.png differ diff --git a/enatega-multivendor-app/src/assets/images/location.png b/enatega-multivendor-app/src/assets/images/location.png new file mode 100644 index 0000000..d418e5b Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/location.png differ diff --git a/enatega-multivendor-app/src/assets/images/login_reg_food.jpg b/enatega-multivendor-app/src/assets/images/login_reg_food.jpg new file mode 100644 index 0000000..8f33323 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/login_reg_food.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/logo.png b/enatega-multivendor-app/src/assets/images/logo.png new file mode 100644 index 0000000..d9a41fe Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/logo.png differ diff --git a/enatega-multivendor-app/src/assets/images/masterIcon.png b/enatega-multivendor-app/src/assets/images/masterIcon.png new file mode 100644 index 0000000..a83afac Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/masterIcon.png differ diff --git a/enatega-multivendor-app/src/assets/images/menu-button.png b/enatega-multivendor-app/src/assets/images/menu-button.png new file mode 100644 index 0000000..33cdb1b Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menu-button.png differ diff --git a/enatega-multivendor-app/src/assets/images/menuItems/breakfast.gif b/enatega-multivendor-app/src/assets/images/menuItems/breakfast.gif new file mode 100644 index 0000000..76cf30f Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menuItems/breakfast.gif differ diff --git a/enatega-multivendor-app/src/assets/images/menuItems/dinner.png b/enatega-multivendor-app/src/assets/images/menuItems/dinner.png new file mode 100644 index 0000000..febf974 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menuItems/dinner.png differ diff --git a/enatega-multivendor-app/src/assets/images/menuItems/drinks.png b/enatega-multivendor-app/src/assets/images/menuItems/drinks.png new file mode 100644 index 0000000..9923f8b Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menuItems/drinks.png differ diff --git a/enatega-multivendor-app/src/assets/images/menuItems/icecream.png b/enatega-multivendor-app/src/assets/images/menuItems/icecream.png new file mode 100644 index 0000000..961990d Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menuItems/icecream.png differ diff --git a/enatega-multivendor-app/src/assets/images/menuItems/lunch.png b/enatega-multivendor-app/src/assets/images/menuItems/lunch.png new file mode 100644 index 0000000..89da3d4 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/menuItems/lunch.png differ diff --git a/enatega-multivendor-app/src/assets/images/netBanking.jpg b/enatega-multivendor-app/src/assets/images/netBanking.jpg new file mode 100644 index 0000000..b4da9a0 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/netBanking.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/notificationDefault.png b/enatega-multivendor-app/src/assets/images/notificationDefault.png new file mode 100644 index 0000000..793f65a Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/notificationDefault.png differ diff --git a/enatega-multivendor-app/src/assets/images/other.png b/enatega-multivendor-app/src/assets/images/other.png new file mode 100644 index 0000000..0ea9778 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/other.png differ diff --git a/enatega-multivendor-app/src/assets/images/paypal.png b/enatega-multivendor-app/src/assets/images/paypal.png new file mode 100644 index 0000000..1eb9446 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/paypal.png differ diff --git a/enatega-multivendor-app/src/assets/images/placeholder-1.png b/enatega-multivendor-app/src/assets/images/placeholder-1.png new file mode 100644 index 0000000..2e84eb7 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/placeholder-1.png differ diff --git a/enatega-multivendor-app/src/assets/images/placeholder.png b/enatega-multivendor-app/src/assets/images/placeholder.png new file mode 100644 index 0000000..c13e0c3 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/placeholder.png differ diff --git a/enatega-multivendor-app/src/assets/images/res.png b/enatega-multivendor-app/src/assets/images/res.png new file mode 100644 index 0000000..a160895 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/res.png differ diff --git a/enatega-multivendor-app/src/assets/images/restaurants/taimoori_1.jpg b/enatega-multivendor-app/src/assets/images/restaurants/taimoori_1.jpg new file mode 100644 index 0000000..f0905f4 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/restaurants/taimoori_1.jpg differ diff --git a/enatega-multivendor-app/src/assets/images/rider.png b/enatega-multivendor-app/src/assets/images/rider.png new file mode 100644 index 0000000..81b3ee4 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/rider.png differ diff --git a/enatega-multivendor-app/src/assets/images/shopping-bag.png b/enatega-multivendor-app/src/assets/images/shopping-bag.png new file mode 100644 index 0000000..f6f65ff Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/shopping-bag.png differ diff --git a/enatega-multivendor-app/src/assets/images/smartphone.png b/enatega-multivendor-app/src/assets/images/smartphone.png new file mode 100644 index 0000000..b7ed959 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/smartphone.png differ diff --git a/enatega-multivendor-app/src/assets/images/stripe.png b/enatega-multivendor-app/src/assets/images/stripe.png new file mode 100644 index 0000000..64f2236 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/stripe.png differ diff --git a/enatega-multivendor-app/src/assets/images/user.png b/enatega-multivendor-app/src/assets/images/user.png new file mode 100644 index 0000000..21f0d60 Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/user.png differ diff --git a/enatega-multivendor-app/src/assets/images/visaIcon.png b/enatega-multivendor-app/src/assets/images/visaIcon.png new file mode 100644 index 0000000..c5446ed Binary files /dev/null and b/enatega-multivendor-app/src/assets/images/visaIcon.png differ diff --git a/enatega-multivendor-app/src/components/About/Header/Header.js b/enatega-multivendor-app/src/components/About/Header/Header.js new file mode 100644 index 0000000..2f661bd --- /dev/null +++ b/enatega-multivendor-app/src/components/About/Header/Header.js @@ -0,0 +1,80 @@ +import React, { useContext } from 'react' +import { View, TouchableOpacity, Image } from 'react-native' +import { Ionicons } from '@expo/vector-icons' +import { MaterialIcons } from '@expo/vector-icons' +import { scale } from '../../../utils/scaling' +import styles from './styles' +import { useNavigation } from '@react-navigation/native' +import TextDefault from '../../Text/TextDefault/TextDefault' +import Animated from 'react-native-reanimated' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import { useTranslation } from 'react-i18next' + +const AnimatedIon = Animated.createAnimatedComponent(Ionicons) + +function ImageHeader(props) { + const { t } = useTranslation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + const navigation = useNavigation() + + return ( + + + + + navigation.goBack()}> + + + + + {props.restaurantName.length > 12 + ? `${props.restaurantName.slice(0, 15)}...` + : props.restaurantName} + + {!props.loading && ( + + + {t('delivery')} {props.deliveryTime} {t('Min')} + + + )} + + + + {props.rating} ({props.total}) + + + + + + ) +} + +export default ImageHeader diff --git a/enatega-multivendor-app/src/components/About/Header/index.js b/enatega-multivendor-app/src/components/About/Header/index.js new file mode 100644 index 0000000..75599b2 --- /dev/null +++ b/enatega-multivendor-app/src/components/About/Header/index.js @@ -0,0 +1,2 @@ +import Header from './Header' +export default Header diff --git a/enatega-multivendor-app/src/components/About/Header/styles.js b/enatega-multivendor-app/src/components/About/Header/styles.js new file mode 100644 index 0000000..432fa99 --- /dev/null +++ b/enatega-multivendor-app/src/components/About/Header/styles.js @@ -0,0 +1,81 @@ +import { Dimensions, StyleSheet } from 'react-native' +import { scale } from '../../../utils/scaling' +const { height } = Dimensions.get('window') +const styles = (props = null) => + StyleSheet.create({ + mainContainer: { + height: height * 0.25, + width: '100%' + }, + headerImage: { + width: '100%', + height: '100%', + borderBottomLeftRadius: 20, + borderBottomRightRadius: 20 + }, + headingTitle: { + position: 'absolute', + bottom: scale(10), + left: scale(30) + }, + overlayContainer: { + position: 'absolute', + width: '100%', + height: '100%', + alignItems: 'center', + justifyContent: 'center' + }, + touchArea: { + position: 'absolute', + top: scale(20), + left: scale(10), + width: scale(50), + height: scale(30), + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'white', + borderRadius: scale(15) + }, + deliveryBoxContainer: { + backgroundColor: + props != null ? props.customizeOpacityBtn : 'transparent', + padding: scale(10), + borderRadius: scale(10), + borderColor: 'white', + borderWidth: 1, + width: '45%', + alignItems: 'center', + alignSelf: 'center' + }, + deliveryBox: { + color: 'white', + backgroundColor: 'black', + borderRadius: scale(5), + padding: scale(5) + }, + animatedIconStyle: { + fontSize: scale(20) + }, + deliveryBoxText: { + paddingRight: scale(5), + paddingLeft: scale(5) + }, + ratingContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + paddingTop: scale(10), + paddingBottom: scale(10) + }, + backArrow: { + color: props != null ? props.black : '#FFF', + fontSize: scale(20), + backgroundColor: 'white', + paddingLeft: scale(15), + paddingRight: scale(15), + paddingBottom: scale(5), + paddingTop: scale(5), + borderRadius: scale(22) + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/Address/AddressText.js b/enatega-multivendor-app/src/components/Address/AddressText.js new file mode 100644 index 0000000..da02d1f --- /dev/null +++ b/enatega-multivendor-app/src/components/Address/AddressText.js @@ -0,0 +1,23 @@ +import { EvilIcons } from '@expo/vector-icons' +import React, { useContext } from 'react' +import { TouchableOpacity } from 'react-native' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import { scale } from '../../utils/scaling' +import { theme } from '../../utils/themeColors' +import styles from './styles' + +export default function AddressText({ onPress = () => {} }) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + ) +} diff --git a/enatega-multivendor-app/src/components/Address/SearchModal.js b/enatega-multivendor-app/src/components/Address/SearchModal.js new file mode 100644 index 0000000..a73aece --- /dev/null +++ b/enatega-multivendor-app/src/components/Address/SearchModal.js @@ -0,0 +1,180 @@ +import React, { useContext, useEffect } from 'react' +import { + Modal, + View, + TouchableOpacity, + Keyboard, + Dimensions +} from 'react-native' +import { GooglePlacesAutocomplete } from 'react-native-google-places-autocomplete' +import Animated, { + Easing as EasingNode, + Extrapolation, + interpolate, + useSharedValue, + withTiming, + useAnimatedStyle +} from 'react-native-reanimated' +import useEnvVars from '../../../environment' +import CloseIcon from '../../assets/SVG/imageComponents/CloseIcon' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import { alignment } from '../../utils/alignment' +import { scale } from '../../utils/scaling' +import { theme } from '../../utils/themeColors' +import TextDefault from '../Text/TextDefault/TextDefault' +import styles from './styles' + +import { useTranslation } from 'react-i18next' + +const { height } = Dimensions.get('screen') + +export default function SearchModal({ + visible = false, + onClose = () => { }, + onSubmit = () => { } +}) { + const { t } = useTranslation() + const animation = useSharedValue(0) + const { GOOGLE_MAPS_KEY } = useEnvVars() + console.log('GOOGLE_MAPS_KEY', GOOGLE_MAPS_KEY) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + const marginTop = useAnimatedStyle(() => { + return { + marginTop: interpolate( + animation.value, + [0, 1], + [height * 0.4, height * 0.06], + Extrapolation.CLAMP + ) + } + }) + + const borderTopLeftRadius = useAnimatedStyle(() => { + return { + borderTopLeftRadius: interpolate(animation.value, + [0, 1], + [30, 0], + Extrapolation.CLAMP + ) + } + }) + + const borderTopRightRadius = useAnimatedStyle(() => { + return { + borderTopRightRadius: interpolate(animation.value, + [0, 1], + [30, 0], + Extrapolation.CLAMP + ) + } + }) + + useEffect(() => { + Keyboard.addListener('keyboardDidShow', _keyboardDidShow) + Keyboard.addListener('keyboardDidHide', _keyboardDidHide) + + // cleanup function + return () => { + Keyboard.removeAllListeners('keyboardDidShow', _keyboardDidShow) + Keyboard.removeAllListeners('keyboardDidHide', _keyboardDidHide) + } + }, []) + + const _keyboardDidShow = () => { + animate() + } + + const _keyboardDidHide = () => { + // alert('Off') + animate(true) + } + + const animate = (hide = false) => { + withTiming( + animation.value = hide ? 0 : 1, + { duration: 300 }, + { easing: EasingNode.inOut(EasingNode.ease) } + ) + }; + + + function close() { + animation.value = 0 + onClose() + } + + return ( + + + + + + + {t('searchAddress')} + + + row.description} // custom description render + onPress={(data, details = null) => { + onSubmit(data.description, details.geometry.location) + }} + getDefaultValue={() => { + return '' // text input default value + }} + query={{ + // available options: https://developers.google.com/places/web-service/autocomplete + key: GOOGLE_MAPS_KEY, + language: 'en' // language of the results + }} + styles={{ + description: { + fontWeight: 'bold' + }, + predefinedPlacesDescription: { + color: '#1faadb' + }, + textInputContainer: { + borderWidth: 1, + borderColor: currentTheme.tagColor, + ...alignment.PRxSmall, + padding: 5 + }, + textInput: { + ...alignment.MLxSmall + } + }} + nearbyPlacesAPI="GooglePlacesSearch" // Which API to use: GoogleReverseGeocoding or GooglePlacesSearch + GoogleReverseGeocodingQuery={ + { + // available options for GoogleReverseGeocoding API : https://developers.google.com/maps/documentation/geocoding/intro + } + } + GooglePlacesSearchQuery={{ + // available options for GooglePlacesSearch API : https://developers.google.com/places/web-service/search + rankby: 'distance' + }} + // filterReverseGeocodingByTypes={[ + // 'locality', + // ]} // filter the reverse geocoding results by types - ['locality', 'administrative_area_level_3'] if you want to display only cities + debounce={200} + /> + + + + ) +} diff --git a/enatega-multivendor-app/src/components/Address/styles.js b/enatega-multivendor-app/src/components/Address/styles.js new file mode 100644 index 0000000..1bb5efa --- /dev/null +++ b/enatega-multivendor-app/src/components/Address/styles.js @@ -0,0 +1,31 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../utils/alignment' +import { scale } from '../../utils/scaling' + +const styles = (props = null) => + StyleSheet.create({ + flex: { + flex: 1 + }, + textBtn: { + backgroundColor: 'transparent', + justifyContent: 'center', + alignItems: 'flex-end', + ...alignment.PBsmall + }, + modalContainer: { + flex: 1, + backgroundColor: props !== null ? props.themeBackground : '#FAFAFA', + borderColor: props !== null ? props.tagColor : '#FAFFAA', + ...alignment.PTmedium, + ...alignment.PRlarge, + ...alignment.PLlarge + }, + modalTextBtn: { + alignSelf: 'flex-end', + height: scale(30), + width: scale(30), + ...alignment.MTsmall + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/Button/Button.js b/enatega-multivendor-app/src/components/Button/Button.js new file mode 100644 index 0000000..88ee858 --- /dev/null +++ b/enatega-multivendor-app/src/components/Button/Button.js @@ -0,0 +1,19 @@ +import { TouchableOpacity } from 'react-native' +import React from 'react' +import TextDefault from '../Text/TextDefault/TextDefault' + +export default function Button({ + text, + textStyles, + buttonStyles, + buttonProps, + textProps +}) { + return ( + + + {text} + + + ) +} diff --git a/enatega-multivendor-app/src/components/Button/styles.js b/enatega-multivendor-app/src/components/Button/styles.js new file mode 100644 index 0000000..8f81188 --- /dev/null +++ b/enatega-multivendor-app/src/components/Button/styles.js @@ -0,0 +1,5 @@ +import { StyleSheet } from 'react-native' + +export default StyleSheet.create({ + container: theme => ({}) +}) diff --git a/enatega-multivendor-app/src/components/CartItem/CartItem.js b/enatega-multivendor-app/src/components/CartItem/CartItem.js new file mode 100644 index 0000000..63ca115 --- /dev/null +++ b/enatega-multivendor-app/src/components/CartItem/CartItem.js @@ -0,0 +1,67 @@ +import React, { useContext } from 'react' +import { TouchableOpacity, View } from 'react-native' +import { AntDesign } from '@expo/vector-icons' +import { scale } from '../../utils/scaling' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import ConfigurationContext from '../../context/Configuration' +import { theme } from '../../utils/themeColors' +import styles from './styles' +import TextDefault from '../Text/TextDefault/TextDefault' +import { alignment } from '../../utils/alignment' + +const cartItem = props => { + const configuration = useContext(ConfigurationContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + {props.quantity} + + + + + + + + + {props.dealName} + + {props.optionsTitle.map((option, index) => ( + + +{option} + + ))} + + + {configuration.currencySymbol} {parseFloat(props.dealPrice).toFixed(2)} + + + ) +} + +export default cartItem diff --git a/enatega-multivendor-app/src/components/CartItem/styles.js b/enatega-multivendor-app/src/components/CartItem/styles.js new file mode 100644 index 0000000..cd84c62 --- /dev/null +++ b/enatega-multivendor-app/src/components/CartItem/styles.js @@ -0,0 +1,39 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../utils/alignment' +import { scale } from '../../utils/scaling' + +const styles = (props = null) => + StyleSheet.create({ + itemContainer: { + flexDirection: 'row', + alignItems: 'center', + width: '100%' + }, + actionContainer: { + width: '27%', + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: props !== null ? props.cartContainer : 'transparent' + }, + actionContainerBtns: { + width: '24%', + backgroundColor: props !== null ? props.main : 'transparent', + justifyContent: 'center', + borderRadius: scale(20), + alignItems: 'center', + ...alignment.PTxSmall, + ...alignment.PBxSmall + }, + actionContainerView: { + width: '33%', + backgroundColor: props !== null ? props.cartContainer : 'transparent', + justifyContent: 'center', + alignItems: 'center', + borderWidth: 0.2, + borderRadius: scale(5), + padding: scale(5), + margin: scale(8) + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/CartComponent.js b/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/CartComponent.js new file mode 100644 index 0000000..2d0046d --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/CartComponent.js @@ -0,0 +1,67 @@ +import React, { useState, useContext } from 'react' +import { View, TouchableOpacity } from 'react-native' +import styles from './styles' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { AntDesign } from '@expo/vector-icons' +import { scale } from '../../../utils/scaling' +import {useTranslation} from 'react-i18next' + +function CartComponent(props) { + const {t} = useTranslation() + const [quantity, setQuantity] = useState(1) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + function onAdd() { + setQuantity(quantity + 1) + } + function onRemove() { + if (quantity === 1) return + setQuantity(quantity - 1) + } + + return ( + + + + + + + {quantity} + + + + + + + {t('addToCart')} + + + + + ) +} + +export default CartComponent diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/styles.js new file mode 100644 index 0000000..9021528 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/CartComponent/styles.js @@ -0,0 +1,61 @@ +import { verticalScale, scale } from '../../../utils/scaling' +import { Dimensions, StyleSheet } from 'react-native' +const { height } = Dimensions.get('window') + +const styles = (props = null) => + StyleSheet.create({ + flex: { + flex: 1 + }, + mainContainer: { + width: '100%', + height: height * 0.09, + elevation: 1, + borderTopRightRadius: scale(25), + borderTopLeftRadius: scale(25), + shadowColor: props !== null ? props.shadowColor : '#fefefe', + shadowOffset: { + width: 0, + height: -verticalScale(2) + }, + shadowOpacity: 0.8, + shadowRadius: verticalScale(2), + elevation: 10, + backgroundColor: props !== null ? props.themeBackground : '#a92d2d', + justifyContent: 'center', + alignItems: 'center' + }, + subContainer: { + width: '90%', + height: '70%', + alignItems: 'center', + justifyContent: 'space-around', + flexDirection: 'row' + }, + icon: { + width: '8%', + height: '55%', + backgroundColor: 'black', + justifyContent: 'center', + alignItems: 'center', + borderRadius: scale(15) + }, + quantity: { + borderWidth: 1, + paddingLeft: scale(18), + paddingRight: scale(18), + paddingTop: scale(10), + paddingBottom: scale(10), + borderRadius: scale(10), + borderColor: 'black' + }, + btnContainer: { + width: '60%', + height: '90%', + backgroundColor: props !== null ? props.main : 'black', + justifyContent: 'center', + alignItems: 'center', + borderRadius: scale(10) + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/CheckComponent.js b/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/CheckComponent.js new file mode 100644 index 0000000..e6e0443 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/CheckComponent.js @@ -0,0 +1,61 @@ +import React, { useState, useContext } from 'react' +import { View, TouchableOpacity } from 'react-native' +import CheckboxBtn from '../../../ui/FdCheckbox/CheckboxBtn' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import ConfigurationContext from '../../../context/Configuration' +import { theme } from '../../../utils/themeColors' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { alignment } from '../../../utils/alignment' + +function CheckComponent(props) { + const [options, setOptions] = useState( + props.options.map(option => ({ ...option, checked: false })) + ) + const configuration = useContext(ConfigurationContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + function onPress(option) { + const tempOptions = options + const index = tempOptions.findIndex(opt => opt._id === option._id) + tempOptions[index].checked = !tempOptions[index].checked + setOptions(tempOptions) + props.onPress(option) + } + + return ( + + {options.map(option => ( + + + + + {option.title} + + + + {`${configuration.currencySymbol} ${option.price}`} + + + ))} + + ) +} + +export default CheckComponent diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/styles.js new file mode 100644 index 0000000..1832bcf --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/CheckComponent/styles.js @@ -0,0 +1,23 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' + +const styles = StyleSheet.create({ + flex: { + flex: 1 + }, + mainContainer: { + width: '100%', + flexDirection: 'row', + ...alignment.MBsmall + }, + leftContainer: { + width: '70%', + flexDirection: 'row', + alignItems: 'center' + }, + rightContainer: { + width: '30%', + justifyContent: 'center' + } +}) +export default styles diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/HeadingComponent.js b/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/HeadingComponent.js new file mode 100644 index 0000000..0ef2ec7 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/HeadingComponent.js @@ -0,0 +1,46 @@ +import React, { useContext } from 'react' +import { View } from 'react-native' +import ConfigurationContext from '../../../context/Configuration' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' + +function HeadingComponent(props) { + const configuration = useContext(ConfigurationContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + return ( + + + + + {props.title} + + + + {`${configuration.currencySymbol} ${props.price}`} + + + + + {props.desc} + + + + ) +} + +export default HeadingComponent diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/styles.js new file mode 100644 index 0000000..7c1d69a --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/HeadingComponent/styles.js @@ -0,0 +1,26 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' +const styles = StyleSheet.create({ + topContainer: { + width: '100%', + flexDirection: 'row', + alignItems: 'center', + ...alignment.MTsmall + }, + titleContainer: { + width: '80%', + ...alignment.MTsmall, + ...alignment.MBsmall + }, + priceContainer: { + width: '20%', + justifyContent: 'center', + ...alignment.MTsmall, + ...alignment.MBsmall + }, + descContainer: { + width: '100%', + ...alignment.MBsmall + } +}) +export default styles diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/ImageHeader.js b/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/ImageHeader.js new file mode 100644 index 0000000..b1605da --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/ImageHeader.js @@ -0,0 +1,18 @@ +import React from 'react' +import { ImageBackground, Text } from 'react-native' +import styles from './styles' +import { scale } from '../../../utils/scaling' + +function ImageHeader(props) { + return ( + + ) +} + +export default ImageHeader diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/styles.js new file mode 100644 index 0000000..585b644 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/ImageHeader/styles.js @@ -0,0 +1,9 @@ +import { Dimensions } from 'react-native' +const { height } = Dimensions.get('window') + +export default { + backgroundImage: { + width: '100%', + height: height * 0.30, + } +} diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/RadioComponent.js b/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/RadioComponent.js new file mode 100644 index 0000000..eb87cf0 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/RadioComponent.js @@ -0,0 +1,60 @@ +import React, { useState, useContext } from 'react' +import { View, TouchableOpacity } from 'react-native' +import RadioButton from '../../../ui/FdRadioBtn/RadioBtn' +import ConfigurationContext from '../../../context/Configuration' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { alignment } from '../../../utils/alignment' + +function RadioComponent(props) { + const [selected, setSelected] = useState(props.selected || null) + const [options] = useState(props.options) + const configuration = useContext(ConfigurationContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + function onPress(option) { + setSelected(option) + props.onPress(option) + } + + return ( + + {options.map(option => ( + + + + + {option.title} + + + + {`${configuration.currencySymbol} ${option.price}`} + + + ))} + + ) +} + +export default RadioComponent diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/styles.js new file mode 100644 index 0000000..a893036 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/RadioComponent/styles.js @@ -0,0 +1,20 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' + +const styles = StyleSheet.create({ + mainContainer: { + width: '100%', + flexDirection: 'row', + ...alignment.MBsmall + }, + leftContainer: { + width: '80%', + flexDirection: 'row', + alignItems: 'center' + }, + rightContainer: { + width: '20%', + justifyContent: 'center' + } +}) +export default styles diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/TitleComponent.js b/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/TitleComponent.js new file mode 100644 index 0000000..17eb6e8 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/TitleComponent.js @@ -0,0 +1,47 @@ +import React, { useContext } from 'react' +import { View } from 'react-native' +import styles from './styles' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import TextDefault from '../../Text/TextDefault/TextDefault' + +function TitleComponent(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + return ( + + + + {props.title} + + + {props.subTitle} + + + + + {props.status} + + + + ) +} + +export default TitleComponent diff --git a/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/styles.js b/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/styles.js new file mode 100644 index 0000000..9c4fb55 --- /dev/null +++ b/enatega-multivendor-app/src/components/CustomizeComponents/TitleComponent/styles.js @@ -0,0 +1,25 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' +import { scale } from '../../../utils/scaling' +import { theme } from '../../../utils/themeColors' + +const styles = StyleSheet.create({ + mainContainer: { + width: '100%', + flexDirection: 'row', + ...alignment.MBxSmall + }, + leftContainer: { + width: '75%', + alignItems: 'flex-start' + }, + rightContainer: { + height: '45%', + justifyContent: 'center', + alignItems: 'center', + width: '25%', + backgroundColor: theme.Pink.buttonBackground, + borderRadius: scale(20) + } +}) +export default styles diff --git a/enatega-multivendor-app/src/components/Drawer/Items/DrawerItems.js b/enatega-multivendor-app/src/components/Drawer/Items/DrawerItems.js new file mode 100644 index 0000000..808a5bd --- /dev/null +++ b/enatega-multivendor-app/src/components/Drawer/Items/DrawerItems.js @@ -0,0 +1,39 @@ +import React, { useContext } from 'react' +import { TouchableOpacity, View } from 'react-native' +import styles from './styles.js' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext.js' +import { theme } from '../../../utils/themeColors.js' +import TextDefault from '../../../components/Text/TextDefault/TextDefault' +import { SimpleLineIcons } from '@expo/vector-icons' +import { verticalScale } from '../../../utils/scaling.js' + +function DrawerItems(props) { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + {props.title} + + + + + ) +} +export default DrawerItems diff --git a/enatega-multivendor-app/src/components/Drawer/Items/styles.js b/enatega-multivendor-app/src/components/Drawer/Items/styles.js new file mode 100644 index 0000000..e1e4b18 --- /dev/null +++ b/enatega-multivendor-app/src/components/Drawer/Items/styles.js @@ -0,0 +1,32 @@ +import { StyleSheet } from 'react-native' + +const styles = StyleSheet.create({ + flex: { + flex: 1 + }, + container: { + flex: 1, + flexDirection: 'row', + justifyContent: 'space-evenly', + alignItems: 'center' + }, + leftContainer: { + height: '100%', + width: '15%', + justifyContent: 'center', + alignItems: 'center' + }, + img: { + width: '100%', + height: '100%' + }, + rightContainer: { + height: '80%', + width: '75%', + justifyContent: 'center' + }, + drawerContainer: { + alignSelf: 'flex-start' + } +}) +export default styles diff --git a/enatega-multivendor-app/src/components/Drawer/Profile/DrawerProfile.js b/enatega-multivendor-app/src/components/Drawer/Profile/DrawerProfile.js new file mode 100644 index 0000000..97a59da --- /dev/null +++ b/enatega-multivendor-app/src/components/Drawer/Profile/DrawerProfile.js @@ -0,0 +1,52 @@ +import React, { useContext } from 'react' +import { View } from 'react-native' +import { TouchableOpacity } from 'react-native-gesture-handler' +import UserContext from '../../../context/User' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { alignment } from '../../../utils/alignment' +import {useTranslation} from 'react-i18next' + +function DrawerProfile(props) { + const {t} = useTranslation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + const { isLoggedIn, loadingProfile, profile } = useContext(UserContext) + + if (loadingProfile) return {t('loading')} + return ( + + {!isLoggedIn && ( + + { + props.navigation.navigate({ name: 'CreateAccount' }) + }}> + + {t('loginOrCreateAccount')} + + + + )} + + {isLoggedIn && profile && ( + + + + {profile.name.substr(0, 1).toUpperCase()} + + + + {profile.name} + + + )} + + + ) +} + +export default DrawerProfile diff --git a/enatega-multivendor-app/src/components/Drawer/Profile/styles.js b/enatega-multivendor-app/src/components/Drawer/Profile/styles.js new file mode 100644 index 0000000..cb00336 --- /dev/null +++ b/enatega-multivendor-app/src/components/Drawer/Profile/styles.js @@ -0,0 +1,43 @@ +import { scale } from '../../../utils/scaling' +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' + +const styles = (props = null) => + StyleSheet.create({ + mainContainer: { + flex: 1, + backgroundColor: props !== null ? props.headerBackground : 'transparent' + }, + logInContainer: { + width: '100%', + height: '100%', + justifyContent: 'flex-end', + ...alignment.PLsmall, + ...alignment.PBlarge + }, + alignLeft:{ + textAlign: 'left' + }, + loggedInContainer: { + flex: 1, + justifyContent: 'flex-end', + alignItems: 'center' + }, + subContainer: { + width: '85%', + height: '80%', + justifyContent: 'space-between', + ...alignment.MBlarge + }, + imgContainer: { + width: scale(70), + height: scale(70), + borderRadius: scale(35), + justifyContent: 'center', + alignItems: 'center', + backgroundColor: props !== null ? props.fontWhite : 'transparent', + ...alignment.MTlarge + } + }) + +export default styles diff --git a/enatega-multivendor-app/src/components/FlashMessage/MessageComponent/index.js b/enatega-multivendor-app/src/components/FlashMessage/MessageComponent/index.js new file mode 100644 index 0000000..279543c --- /dev/null +++ b/enatega-multivendor-app/src/components/FlashMessage/MessageComponent/index.js @@ -0,0 +1,25 @@ +import React from 'react' +import { View, StyleSheet, Dimensions } from 'react-native' +import TextDefault from '../../Text/TextDefault/TextDefault' +const { height: HEIGHT } = Dimensions.get('window') +const MESSAGE_TOP = HEIGHT / 2 +export const MessageComponent = props => ( + + + {props.message.message} + + +) + +const styles = StyleSheet.create({ + flashMessage: { + alignItems: 'center', + justifyContent: 'center', + alignSelf: 'center', + top: MESSAGE_TOP, + borderRadius: 15, + backgroundColor: 'rgba(52, 52, 52, .9)', + marginHorizontal: 20, + padding: 10 + } +}) diff --git a/enatega-multivendor-app/src/components/Header/HeaderIcons/HeaderIcons.js b/enatega-multivendor-app/src/components/Header/HeaderIcons/HeaderIcons.js new file mode 100644 index 0000000..53d2cdb --- /dev/null +++ b/enatega-multivendor-app/src/components/Header/HeaderIcons/HeaderIcons.js @@ -0,0 +1,295 @@ +import React, { useState, useContext } from 'react' +import { + Ionicons, + EvilIcons, + MaterialIcons, + MaterialCommunityIcons, + AntDesign, + Feather +} from '@expo/vector-icons' +import { scale } from '../../../utils/scaling' +import styles from './styles' +import { TouchableOpacity, View } from 'react-native' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { FlashMessage } from '../../../ui/FlashMessage/FlashMessage' +import { + useNavigation, + CommonActions, + useRoute +} from '@react-navigation/native' +import navigationService from '../../../routes/navigationService' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import { HeaderBackButton } from '@react-navigation/elements' +import UserContext from '../../../context/User' +import { alignment } from '../../../utils/alignment' +import CartIcon from '../../../assets/SVG/imageComponents/CartIcon' +import { useTranslation } from 'react-i18next' + +const rippleColor = '#6FCF97' +function BackButton(props) { + if (props.icon === 'leftArrow') { + return ( + + ) + } else if (props.icon === 'menu') { + return ( + + ) + } else if (props.icon === 'dots') { + return ( + + ) + } else if (props.icon === 'target') { + return ( + + ) + } else if (props.icon === 'fav') { + return + } else { + return ( + + ) + } +} + +function LeftButton(props) { + const navigation = useNavigation() + if (props.icon === 'back') { + return ( + + BackButton({ iconColor: props.iconColor, icon: 'leftArrow' }) + } + onPress={() => { + navigationService.goBack() + }} + /> + ) + } else if (props.icon === 'close') { + return ( + + BackButton({ iconColor: props.iconColor, icon: 'close' }) + } + onPress={() => { + navigation.dispatch(state => { + const routes = state.routes.filter(r => r.name === 'Main') + return CommonActions.reset({ + ...state, + routes, + index: 0 + }) + }) + }} + /> + ) + } else if (props.toggle) { + return ( + + BackButton({ + iconColor: props.iconColor, + icon: props.toggleValue ? 'leftArrow' : 'close' + }) + } + onPress={() => + props.toggleValue + ? navigation.goBack() + : props.toggleView(prev => !prev) + } + /> + ) + } else { + return ( + + BackButton({ iconColor: props.iconColor, icon: 'menu' }) + } + onPress={() => navigation.toggleDrawer()} + /> + ) + } +} + +function RightButton(props) { + const { t } = useTranslation() + const [password, setPassword] = useState(false) + const navigation = useNavigation() + const route = useRoute() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + const { cartCount, isLoggedIn, profile } = useContext(UserContext) + function showPasswordButton() { + props.titlePosition(prev => !prev) + setPassword(prev => !prev) + } + function clickPasswordButton() { + props.titlePosition(prev => !prev) + setPassword(prev => !prev) + props.modalVisible(prev => !prev) + } + + function cartIcon() { + return ( + + + + + {cartCount} + + + + ) + } + + function navigateCart() { + if (cartCount > 0) { + navigation.navigate('Cart') + } else { + FlashMessage({ + message: t('cartIsEmpty') + }) + } + } + if (props.icon === 'dots') { + return ( + + {password ? ( + + + + {t('changePassword')} + + + + ) : ( + ( + + {BackButton({ iconColor: props.textColor, icon: 'dots' })} + + )} + onPress={showPasswordButton} + /> + )} + + ) + } else if (props.icon === 'cart') { + return ( + + ( + + {BackButton({ iconColor: currentTheme.darkBgFont, icon: 'fav' })} + + )} + bolder + onPress={() => + isLoggedIn && profile + ? navigation.navigate('Favourite') + : navigation.navigate('CreateAccount') + } + /> + {cartCount >= 0 && ( + + )} + + ) + } else if (props.icon === 'target') { + return ( + ( + + {BackButton({ iconColor: props.iconColor, icon: 'target' })} + + )} + onPress={props.onPressRight} + /> + ) + } else { + return null + } +} +function DarkBackButton(props) { + return ( + + + + ) +} +export { BackButton, LeftButton, RightButton, DarkBackButton } diff --git a/enatega-multivendor-app/src/components/Header/HeaderIcons/styles.js b/enatega-multivendor-app/src/components/Header/HeaderIcons/styles.js new file mode 100644 index 0000000..260ea45 --- /dev/null +++ b/enatega-multivendor-app/src/components/Header/HeaderIcons/styles.js @@ -0,0 +1,65 @@ +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' +import { verticalScale, scale } from '../../../utils/scaling' + +const styles = backColor => + StyleSheet.create({ + leftIconPadding: { + ...alignment.PLsmall, + ...alignment.PTxSmall, + ...alignment.PBxSmall + }, + rightContainer: { + position: 'relative', + height: '100%', + justifyContent: 'center', + alignItems: 'center', + ...alignment.PRsmall + }, + favContainer: { + height: '100%', + justifyContent: 'center' + }, + imgContainer: { + width: verticalScale(20), + height: verticalScale(20) + }, + absoluteContainer: { + width: verticalScale(15), + height: verticalScale(15), + backgroundColor: backColor !== null ? backColor : 'white', + justifyContent: 'center', + alignItems: 'center', + borderRadius: verticalScale(15), + position: 'absolute', + right: scale(5), + bottom: scale(2) + }, + touchAreaPassword: { + width: '40%', + height: '70%', + justifyContent: 'center', + alignItems: 'flex-end' + }, + titlePasswordText: { + backgroundColor: backColor !== null ? backColor : 'white', + height: '75%', + width: '100%', + justifyContent: 'center', + alignItems: 'flex-start', + borderRadius: scale(10), + ...alignment.PLmedium + }, + passwordContainer: { + width: scale(150), + ...alignment.PRxSmall + }, + darkBackArrow: { + ...alignment.PLxSmall, + ...alignment.PRxSmall, + ...alignment.PTxSmall, + ...alignment.PBxSmall + } + }) + +export default styles diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrders/ActiveOrders.js b/enatega-multivendor-app/src/components/Main/ActiveOrders/ActiveOrders.js new file mode 100644 index 0000000..6b6a9be --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrders/ActiveOrders.js @@ -0,0 +1,186 @@ +import React, { useContext, useState } from 'react' +import { View, Text, FlatList, TouchableOpacity, Button } from 'react-native' +import { FontAwesome } from '@expo/vector-icons' +import ConfigurationContext from '../../../context/Configuration' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { MaterialIcons } from '@expo/vector-icons' +import { theme } from '../../../utils/themeColors' +import { scale } from '../../../utils/scaling' +import styles from './styles' +import { useNavigation } from '@react-navigation/native' +import TextError from '../../Text/TextError/TextError' +import { useSubscription } from '@apollo/client' +import { subscriptionOrder } from '../../../apollo/subscriptions' +import gql from 'graphql-tag' +import RandomShape from '../../../assets/SVG/RandomShape' +import analytics from '../../../utils/analytics' +import OrdersContext from '../../../context/Orders' +import Spinner from '../../Spinner/Spinner' +import {useTranslation} from 'react-i18next' + +const orderStatuses = [ + { + key: 'PENDING', + status: 1, + statusText: 'pendingOrder' + }, + { + key: 'ACCEPTED', + status: 2, + statusText: 'acceptedOrder' + }, + { + key: 'ASSIGNED', + status: 3, + statusText: 'assignedOrder' + }, + { + key: 'PICKED', + status: 4, + statusText: 'pickedOrder' + }, + { + key: 'DELIVERED', + status: 5, + statusText: 'deliveredOrder' + }, + { + key: 'COMPLETED', + status: 6, + statusText: 'completedOrder' + } +] + +const orderStatusActive = ['PENDING', 'PICKED', 'ACCEPTED', 'ASSIGNED'] + +const ActiveOrders = () => { + + const {t} = useTranslation() + const { loadingOrders, errorOrders, orders } = useContext(OrdersContext) + const configuration = useContext(ConfigurationContext) + const navigation = useNavigation() + const themeContext = useContext(ThemeContext) + const activeOrders = orders.filter(o => + orderStatusActive.includes(o.orderStatus) + ) + + const currentTheme = theme[themeContext.ThemeValue] + const [showAll, setShowAll] = useState(false) + + const displayOrders = showAll ? activeOrders : activeOrders.slice(0, 2) + + if (loadingOrders) return + if (errorOrders && !orders) return + return ( + <> + item._id} + renderItem={({ item, index }) => ( + + )} + /> + + {activeOrders.length > 2 && ( + <> + + setShowAll(!showAll)} + style={styles().button}> + + {showAll ? t('viewLess') : t('viewAll')} + + + + + )} + + + ) +} +const Item = ({ navigation, configuration, currentTheme, item }) => { + const Analytics = analytics() + useSubscription( + gql` + ${subscriptionOrder} + `, + { variables: { id: item._id } } + ) + const {t} = useTranslation() + const checkStatus = status => { + const obj = orderStatuses.filter(x => { + return x.key === status + }) + return obj[0] + } + return ( + { + Analytics.track(Analytics.events.NAVIGATE_TO_ORDER_DETAIL, { + orderId: item._id + }) + navigation.navigate('OrderDetail', { + _id: item._id, + currencySymbol: configuration.currencySymbol + }) + }}> + + + + + + + + + + {item.restaurant.name} + + + + {Array(checkStatus(item.orderStatus).status) + .fill(0) + .map((item, index) => ( + + ))} + {Array(4 - checkStatus(item.orderStatus).status) + .fill(0) + .map((item, index) => ( + + ))} + + + {t(checkStatus(item.orderStatus).statusText)} + + + + + + ) +} +export default ActiveOrders diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrders/index.js b/enatega-multivendor-app/src/components/Main/ActiveOrders/index.js new file mode 100644 index 0000000..44c07fd --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrders/index.js @@ -0,0 +1,2 @@ +import ActiveOrders from './ActiveOrders' +export default ActiveOrders diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrders/styles.js b/enatega-multivendor-app/src/components/Main/ActiveOrders/styles.js new file mode 100644 index 0000000..a39e4cf --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrders/styles.js @@ -0,0 +1,120 @@ +import { StyleSheet } from 'react-native' +import { verticalScale, scale } from '../../../utils/scaling' +import { fontStyles } from '../../../utils/fontStyles' +import { theme } from '../../../utils/themeColors' + +const styles = (props = null) => + StyleSheet.create({ + flex: { + flex: 1 + }, + safeAreaViewStyles: { + flex: 1, + backgroundColor: props !== null ? props.headerBackground : 'transparent' + }, + mainContentContainer: { + width: '100%', + height: '100%', + alignSelf: 'center', + backgroundColor: props !== null ? props.themeBackground : 'transparent' + }, + randomShapeContainer: { + right: 0, + position: 'absolute', + zIndex: -1, + transform: [{ rotate: '90deg' }] + }, + statusContainer: { + overflow: 'hidden', + width: '95%', + alignSelf: 'center', + backgroundColor: theme.Pink.main, + borderRadius: scale(12), + marginTop: verticalScale(10), + elevation: 7, + shadowColor: props != null ? props.shadowColor : 'grey', + shadowOffset: { + width: 0, + height: verticalScale(0) + }, + shadowOpacity: 0.3, + shadowRadius: verticalScale(3), + borderWidth: 1, + borderColor: theme.Pink.white + }, + + imgCard: { + position: 'relative', + flex: 1, + width: undefined, + height: undefined + }, + textContainer: { + width: scale(300), + paddingTop: scale(15), + paddingLeft: scale(15), + paddingRight: scale(15) + }, + title: { + color: props !== null ? props.statusSecondColor : 'grey', + fontSize: verticalScale(15), + fontFamily: fontStyles.MuseoSans500 + }, + description: { + color: props !== null ? props.fontMainColor : '#000', + fontSize: verticalScale(15), + fontFamily: fontStyles.MuseoSans500, + paddingLeft: scale(5), + paddingTop: scale(3), + fontWeight: '700' + }, + statusText: { + color: props !== null ? props.statusSecondColor : 'grey', + fontSize: verticalScale(13), + fontFamily: fontStyles.MuseoSans500, + marginBottom: scale(10), + paddingLeft: 40, + fontWeight: '500' + }, + timeText: { + color: props !== null ? props.iconColorPink : 'red', + fontSize: verticalScale(24), + fontFamily: fontStyles.MuseoSans300, + marginLeft: -10 + }, + statusCircle: { + marginRight: scale(5), + marginBottom: scale(5), + marginTop: scale(5) + }, + viewAllButton: { + paddingTop: scale(0), + paddingBottom: scale(10) + }, + btncontainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + button: { + padding: scale(10), + borderRadius: scale(5) + }, + buttonText: { + color: 'black', + fontSize: 16, + fontWeight: 'bold' + }, + textInnerContainer: { + flexDirection: 'row' + }, + activeOrdersContainer: { + flexDirection: 'row', + justifyContent: 'flex-start', + marginTop: scale(2), + marginBottom: scale(2), + paddingLeft: scale(40) + } + }) + +export default styles diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/ActiveOrdersAndSections.js b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/ActiveOrdersAndSections.js new file mode 100644 index 0000000..a0c9e6b --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/ActiveOrdersAndSections.js @@ -0,0 +1,71 @@ +import React, { useContext } from 'react' +import { View, FlatList } from 'react-native' +import ActiveOrders from '../ActiveOrders' +import UserContext from '../../../context/User' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { alignment } from '../../../utils/alignment' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import RestaurantCard from './RestaurantCard' +import { scale } from '../../../utils/scaling' +import {useTranslation} from 'react-i18next' + + +function ActiveOrdersAndSections(props) { + const {t} = useTranslation() + const { sections } = props + const { isLoggedIn, profile } = useContext(UserContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + return ( + + {isLoggedIn && profile && } + {sections.map(resSection => ( + + + {resSection.name} + + + item._id} + renderItem={({ item }) => { + return + }} + /> + + + ))} + + {t('allRestaurant')} + + + ) +} + +export default ActiveOrdersAndSections diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/RestaurantCard.js b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/RestaurantCard.js new file mode 100644 index 0000000..d349c2b --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/RestaurantCard.js @@ -0,0 +1,105 @@ +import { useNavigation } from '@react-navigation/native' +import React, { useContext } from 'react' +import { TouchableOpacity, View, Image, Text } from 'react-native' +import ConfigurationContext from '../../../context/Configuration' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { alignment } from '../../../utils/alignment' +import { scale } from '../../../utils/scaling' +import { theme } from '../../../utils/themeColors' +import TextDefault from '../../Text/TextDefault/TextDefault' +import styles from './styles' +import { Ionicons } from '@expo/vector-icons' +import {useTranslation} from 'react-i18next' + +function RestaurantCard(props) { + + const {t} = useTranslation() + const configuration = useContext(ConfigurationContext) + const navigation = useNavigation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + return ( + + navigation.navigate('Restaurant', { ...props })}> + + + + + + {props.deliveryTime + ' '} + {t('min')} + + + + + + + + {props.name} + + + + + {props.reviewData.ratings} + + + ({props.reviewData.reviews.length}) + + + + + {props.categories.map(category => category.title).toString()} + + + {configuration.currencySymbol} {props.minimumOrder} + + {' '} + {t('min')} + + + + + + ) +} + +export default React.memo(RestaurantCard) diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/index.js b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/index.js new file mode 100644 index 0000000..8378e7a --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/index.js @@ -0,0 +1,2 @@ +import ActiveOrdersAndSections from './ActiveOrdersAndSections' +export { ActiveOrdersAndSections } diff --git a/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/styles.js b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/styles.js new file mode 100644 index 0000000..c22a875 --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/ActiveOrdersAndSections/styles.js @@ -0,0 +1,110 @@ +import { verticalScale, scale } from '../../../utils/scaling' +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' +import { theme } from '../../../utils/themeColors' + +const styles = (props = null) => + StyleSheet.create({ + ML20: { + ...alignment.MLlarge + }, + offerScroll: { + height: scale(230), + width: '100%' + }, + offerContainer: { + backgroundColor: props != null ? props.cartContainer : 'white', + elevation: 3, + shadowColor: theme.Pink.white, + + height: scale(200), + borderRadius: 25, + width: scale(228), + ...alignment.MBmedium, + ...alignment.MTxSmall + }, + imageContainer: { + position: 'relative', + alignItems: 'center', + height: '60%' + }, + overlayContainer: { + position: 'absolute', + justifyContent: 'space-between', + top: 0, + height: '100%', + backgroundColor: 'rgba(0, 0, 0, 0)', + width: scale(230) + }, + deliveryOverlay: { + position: 'absolute', + top: 12, + right: 18, + width: scale(44), + height: scale(19), + justifyContent: 'center', + alignItems: 'center', + zIndex: 1, + borderRadius: scale(10), + backgroundColor: props != null ? props.menuBar : 'white' + }, + featureOverlay: { + height: '90%', + position: 'absolute', + left: 0, + top: 10, + backgroundColor: 'rgba(0, 0, 0, 0)' + }, + featureText: { + alignSelf: 'flex-start', + maxWidth: '100%', + fontSize: scale(9), + ...alignment.MTxSmall, + ...alignment.PLsmall, + ...alignment.PRsmall, + ...alignment.PTxSmall, + ...alignment.PBxSmall, + backgroundColor: props != null ? props.iconColorPink : 'red' + }, + descriptionContainer: { + paddingTop: verticalScale(10), + paddingBottom: verticalScale(5), + paddingLeft: scale(10), + paddingRight: scale(10), + height: '40%', + width: '100%' + }, + aboutRestaurant: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'flex-end' + }, + offerCategoty: { + width: '100%', + ...alignment.MTxSmall, + ...alignment.MBxSmall + }, + mainContainer: { + paddingTop: scale(15), + marginBottom: scale(15), + borderTopLeftRadius: scale(20), + borderTopRightRadius: scale(20), + borderTopColor: '#ebebeb', + borderTopWidth: scale(3) + }, + restaurantImage: { + width: scale(220), + height: '100%', + borderRadius: scale(25), + marginTop: scale(5) + }, + restaurantRatingContainer: { + marginLeft: scale(2) + }, + restaurantPriceContainer: { + marginTop: scale(3), + fontSize: 15 + } + }) + +export default styles diff --git a/enatega-multivendor-app/src/components/Main/Item/Item.js b/enatega-multivendor-app/src/components/Main/Item/Item.js new file mode 100644 index 0000000..1e381db --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Item/Item.js @@ -0,0 +1,190 @@ +import React, { useContext } from 'react' +import { View, Image, TouchableOpacity } from 'react-native' +import styles from './styles' +import ConfigurationContext from '../../../context/Configuration' +import { useNavigation } from '@react-navigation/native' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { alignment } from '../../../utils/alignment' +import { AntDesign, Ionicons } from '@expo/vector-icons' +import { scale } from '../../../utils/scaling' +import { DAYS } from '../../../utils/enums' +import { profile } from '../../../apollo/queries' +import { addFavouriteRestaurant } from '../../../apollo/mutations' +import UserContext from '../../../context/User' +import gql from 'graphql-tag' +import { useMutation } from '@apollo/client' +import Spinner from '../../Spinner/Spinner' +import { FlashMessage } from '../../../ui/FlashMessage/FlashMessage' +import {useTranslation} from 'react-i18next' + + +const ADD_FAVOURITE = gql` + ${addFavouriteRestaurant} +` +const PROFILE = gql` + ${profile} +` + +function Item(props) { + const {t} = useTranslation() + const navigation = useNavigation() + const { profile } = useContext(UserContext) + const heart = profile ? profile.favourite.includes(props.item._id) : false + const item = props.item + const category = item.categories.map(category => category.title) + const configuration = useContext(ConfigurationContext) + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + const [mutate, { loading: loadingMutation }] = useMutation(ADD_FAVOURITE, { + onCompleted, + refetchQueries: [{ query: PROFILE }] + }) + const { isAvailable, openingTimes } = item + const isOpen = () => { + const date = new Date() + const day = date.getDay() + const hours = date.getHours() + const minutes = date.getMinutes() + const todaysTimings = openingTimes.find(o => o.day === DAYS[day]) + if (todaysTimings === undefined) return false + const times = todaysTimings.times.filter( + t => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ) + return times.length > 0 + } + + function onCompleted() { + FlashMessage({ message: t('favouritelistUpdated') }) + } + return ( + navigation.navigate('Restaurant', { ...item })}> + + + + + + + profile ? mutate({ variables: { id: item._id } }) : null + }> + {loadingMutation ? ( + + ) : ( + + )} + + {(!isAvailable || !isOpen()) && ( + + + {t('Closed')} + + + )} + + + {item.deliveryTime + ' '} + {t('min')} + + + + + + + + {item.name} + + + + + {item.reviewData.ratings} + + + ({item.reviewData.reviews.length}) + + + + + {category.toString()} + + + + {configuration.currencySymbol + ' ' + item.minimumOrder}{' '} + + {' '} + {t('min')} + + + + + + + + ) +} + +export default Item diff --git a/enatega-multivendor-app/src/components/Main/Item/styles.js b/enatega-multivendor-app/src/components/Main/Item/styles.js new file mode 100644 index 0000000..7379ebf --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Item/styles.js @@ -0,0 +1,108 @@ +import { verticalScale, scale } from '../../../utils/scaling' +import { alignment } from '../../../utils/alignment' +import { StyleSheet } from 'react-native' + +const styles = (props = null) => + StyleSheet.create({ + mainContainer: { + width: '100%', + alignItems: 'center', + ...alignment.MBxSmall + }, + restaurantContainer: { + backgroundColor: props != null ? props.cartContainer : 'white', + elevation: 3, + shadowColor: props != null ? props.shadowColor : 'grey', + shadowOffset: { + width: 0, + height: verticalScale(0) + }, + borderRadius: scale(25), + height: scale(220), + width: '99%', + padding: scale(15), + + ...alignment.MBsmall + }, + imageContainer: { + position: 'relative', + alignItems: 'center', + height: '70%' + }, + img: { + width: '100%', + height: '100%', + borderRadius: scale(18) + }, + overlayRestaurantContainer: { + position: 'absolute', + justifyContent: 'space-between', + top: 0, + height: '100%', + backgroundColor: 'rgba(0, 0, 0, 0)', + width: '100%' + }, + favOverlay: { + position: 'absolute', + top: 10, + right: 12, + width: scale(30), + height: scale(30), + borderRadius: scale(15), + backgroundColor: props != null ? props.white : 'white', + zIndex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + deliveryRestaurantOverlay: { + position: 'absolute', + bottom: 15, + left: 10, + width: scale(45), + height: scale(20), + borderRadius: scale(10), + backgroundColor: props != null ? props.menuBar : 'white', + zIndex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + aboutRestaurant: { + alignItems: 'center', + flexDirection: 'row', + justifyContent: 'flex-end' + }, + descriptionContainer: { + height: '30%', + width: '100%', + padding: scale(10) + }, + offerCategoty: { + ...alignment.MTxSmall, + ...alignment.MBxSmall + }, + priceRestaurant: { + alignItems: 'center', + flexDirection: 'row' + }, + verticalLine: { + height: '60%', + borderRightWidth: StyleSheet.hairlineWidth, + borderRightColor: props != null ? props.horizontalLine : 'black', + opacity: 0.6, + ...alignment.MLxSmall, + ...alignment.MRxSmall + }, + featureOverlay: { + height: '90%', + position: 'absolute', + left: 0, + top: 10, + backgroundColor: 'rgba(0, 0, 0, 0)' + }, + featureText: { + alignSelf: 'flex-start', + maxWidth: '100%', + backgroundColor: props != null ? props.tagColor : 'black' + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/Main/Location/Location.js b/enatega-multivendor-app/src/components/Main/Location/Location.js new file mode 100644 index 0000000..46166f4 --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Location/Location.js @@ -0,0 +1,59 @@ +import React, { useRef, useContext, useState } from 'react' +import { View, TouchableOpacity } from 'react-native' +import styles from './styles' +import TextDefault from '../../Text/TextDefault/TextDefault' +import { LocationContext } from '../../../context/Location' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import {useTranslation} from 'react-i18next' + +function Location(props) { + const {t} = useTranslation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + const { location } = useContext(LocationContext) + + let translatedLabel; + if (location.label === 'Current Location') { + translatedLabel = t('currentLocation'); + } else { + translatedLabel = t(location.label); + } + const translatedAddress = + location.deliveryAddress === 'Current Location' + ? t('currentLocation') + : (location.deliveryAddress); + + const truncatedTranslatedAddress = + translatedAddress.length > 20 + ? translatedAddress.substring(0, 20) + '...' + : translatedAddress; + + return ( + + + + + {''} + {translatedLabel} + + + + {''} + {truncatedTranslatedAddress} + + + + + + ) +} + +export default Location diff --git a/enatega-multivendor-app/src/components/Main/Location/styles.js b/enatega-multivendor-app/src/components/Main/Location/styles.js new file mode 100644 index 0000000..f9ff7d7 --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Location/styles.js @@ -0,0 +1,27 @@ +import { StyleSheet } from 'react-native' +import { scale, verticalScale } from '../../../utils/scaling' + +const styles = (props = null) => { + return StyleSheet.create({ + headerTitleContainer: { + flex: 1, + height: '100%', + width: '95%', + justifyContent: 'center', + paddingBottom: scale(8), + }, + headerContainer: { + height: '100%', + width: '110%', + flexDirection: 'column-reverse', + paddingLeft: scale(5), + paddingTop: scale(10) + }, + textContainer: { + maxWidth: '100%', + paddingTop: scale(2), + paddingBottom: scale(2) + } + }) +} +export default styles \ No newline at end of file diff --git a/enatega-multivendor-app/src/components/Main/Search/Search.js b/enatega-multivendor-app/src/components/Main/Search/Search.js new file mode 100644 index 0000000..b34fb52 --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Search/Search.js @@ -0,0 +1,58 @@ +import React, { useContext } from 'react' +import { View, TouchableOpacity, TextInput } from 'react-native' +import { Ionicons, AntDesign } from '@expo/vector-icons' +import styles from './styles' +import ThemeContext from '../../../ui/ThemeContext/ThemeContext' +import { theme } from '../../../utils/themeColors' +import { scale } from '../../../utils/scaling' +import { useTranslation } from 'react-i18next' + +function Search(props) { + const { t } = useTranslation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + + + + + + props.setSearch(text)} + value={props.search} + /> + + + + {props.search ? ( + { + props.setSearch('') + }}> + + + ) : ( + <> + )} + + + + + ) +} + +export default Search diff --git a/enatega-multivendor-app/src/components/Main/Search/styles.js b/enatega-multivendor-app/src/components/Main/Search/styles.js new file mode 100644 index 0000000..311480d --- /dev/null +++ b/enatega-multivendor-app/src/components/Main/Search/styles.js @@ -0,0 +1,79 @@ +import { fontStyles } from '../../../utils/fontStyles' +import { scale, verticalScale } from '../../../utils/scaling' +import { StyleSheet } from 'react-native' +import { alignment } from '../../../utils/alignment' +import { theme } from '../../../utils/themeColors' + +const styles = (props = null) => + StyleSheet.create({ + bodyStyleOne: { + fontFamily: fontStyles.MuseoSans500, + fontSize: scale(14), + color: props != null ? props.fontMainColor : 'black' + }, + mainContainerHolder: { + zIndex: 333, + width: '100%', + alignItems: 'center', + borderBottomLeftRadius: scale(25), + borderBottomRightRadius: scale(25), + backgroundColor: props != null ? props.headerColor : '#fafafa', + shadowColor: props != null ? props.shadowColor : 'black', + shadowOffset: { + width: 0, + height: verticalScale(1) + }, + shadowOpacity: 0.1, + shadowRadius: verticalScale(1), + ...alignment.MBmedium + }, + mainContainer: { + width: '90%', + height: scale(50), + justifyContent: 'center', + alignItems: 'center', + alignSelf: 'center', + borderRadius: scale(40), + backgroundColor: props != null ? props.cartContainer : 'white', + shadowColor: props != null ? props.shadowColor : 'black', + shadowOffset: { + width: 0, + height: verticalScale(1) + }, + shadowOpacity: 0.2, + shadowRadius: verticalScale(1), + ...alignment.MTlarge, + ...alignment.MBmedium + }, + subContainer: { + width: '90%', + height: '80%', + alignItems: 'center', + justifyContent: 'space-between', + flexDirection: 'row' + }, + leftContainer: { + flexDirection: 'row', + width: '90%' + }, + searchContainer: { + width: '10%', + height: '80%', + alignItems: 'center', + justifyContent: 'center', + ...alignment.MBxSmall + }, + inputContainer: { + width: '100%', + justifyContent: 'center', + ...alignment.MLxSmall, + ...alignment.MRxSmall + }, + filterContainer: { + width: '10%', + height: '80%', + justifyContent: 'center', + alignItems: 'center' + } + }) +export default styles diff --git a/enatega-multivendor-app/src/components/MyOrders/ActiveOrders.js b/enatega-multivendor-app/src/components/MyOrders/ActiveOrders.js new file mode 100644 index 0000000..aac8ec2 --- /dev/null +++ b/enatega-multivendor-app/src/components/MyOrders/ActiveOrders.js @@ -0,0 +1,102 @@ +import React, { useContext } from 'react' +import { View, TouchableOpacity, Image } from 'react-native' +import { useSubscription } from '@apollo/client' +import gql from 'graphql-tag' +import { subscriptionOrder } from '../../apollo/subscriptions' +import Heading from '../../components/MyOrders/Heading' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import { theme } from '../../utils/themeColors' +import TextDefault from '../Text/TextDefault/TextDefault' +import TextError from '../Text/TextError/TextError' +import { alignment } from '../../utils/alignment' +import styles from './styles' +import {useTranslation} from 'react-i18next' + +const ActiveOrders = ({ + navigation, + loading, + error, + activeOrders, + showActiveHeader, + showPastHeader +}) => { + const {t} = useTranslation() + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + + if (loading) { + return <> + } + if (error) return + + return ( + + {showActiveHeader && ( + + )} + {activeOrders.map((item, index) => ( + + ))} + {showPastHeader && ( + + )} + + ) +} + +const Item = ({ item, navigation, currentTheme }) => { + useSubscription( + gql` + ${subscriptionOrder} + `, + { variables: { id: item._id } } + ) + const {t} = useTranslation() + return ( + navigation.navigate('OrderDetail', { _id: item._id })}> + + + + + + {item.restaurant.name} + + + {item.orderStatus === 'PENDING' + ? t('PenddingText') + : t('PenddingText1')} + + + + + + + {' '} + {t(item.orderStatus)} + + + + + ) +} + +export default ActiveOrders diff --git a/enatega-multivendor-app/src/components/MyOrders/Heading.js b/enatega-multivendor-app/src/components/MyOrders/Heading.js new file mode 100644 index 0000000..9645c2c --- /dev/null +++ b/enatega-multivendor-app/src/components/MyOrders/Heading.js @@ -0,0 +1,32 @@ +import React, { useContext } from 'react' +import { View } from 'react-native' +import { theme } from '../../utils/themeColors' +import ThemeContext from '../../ui/ThemeContext/ThemeContext' +import TextDefault from '../Text/TextDefault/TextDefault' +import styles from './styles' + +const Heading = props => { + const themeContext = useContext(ThemeContext) + const currentTheme = theme[themeContext.ThemeValue] + return ( + + + + {props.headerName} + + + + ) +} + +export default Heading diff --git a/enatega-multivendor-app/src/components/MyOrders/styles.js b/enatega-multivendor-app/src/components/MyOrders/styles.js new file mode 100644 index 0000000..ce9b98d --- /dev/null +++ b/enatega-multivendor-app/src/components/MyOrders/styles.js @@ -0,0 +1,68 @@ +import { scale, verticalScale } from '../../utils/scaling' +import { StyleSheet } from 'react-native' +import { alignment } from '../../utils/alignment' + +const styles = (props = null) => + StyleSheet.create({ + container: { + flex: 1, + backgroundColor: props !== null ? props.cartContainer : '#FFF', + borderRadius: scale(8), + elevation: 3, + shadowColor: 'black', + shadowOffset: { + width: 0, + height: verticalScale(1) + }, + shadowOpacity: 0.5, + shadowRadius: verticalScale(1), + flexDirection: 'row', + justifyContent: 'space-between', + ...alignment.MRsmall, + ...alignment.MLsmall, + ...alignment.MTsmall, + ...alignment.PTxSmall, + ...alignment.PBxSmall, + ...alignment.PRsmall, + ...alignment.PLxSmall + }, + image: { + height: '100%', + width: '25%', + borderRadius: scale(10) + }, + textContainer: { + width: '55%', + ...alignment.PTlarge, + ...alignment.PBlarge, + ...alignment.PLsmall + }, + leftContainer: { + width: '95%' + }, + rightContainer: { + width: '20%', + justifyContent: 'center', + alignItems: 'center' + }, + headingContainer: { + width: '100%', + flexDirection: 'row', + justifyContent: 'center', + backgroundColor: props !== null ? props.themeBackground : 'grey', + alignItems: 'center', + ...alignment.PTlarge, + ...alignment.PBlarge, + ...alignment.MTsmall + }, + line: { + borderRightWidth: StyleSheet.hairlineWidth, + borderRightColor: props !== null ? props.horizontalLine : 'grey' + }, + headingLine: { + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: props !== null ? props.horizontalLine : 'grey' + } + }) + +export default styles diff --git a/enatega-multivendor-app/src/components/OrderDetail/Detail/Detail.js b/enatega-multivendor-app/src/components/OrderDetail/Detail/Detail.js new file mode 100644 index 0000000..a1a61fe --- /dev/null +++ b/enatega-multivendor-app/src/components/OrderDetail/Detail/Detail.js @@ -0,0 +1,199 @@ +import { View } from 'react-native' +import React from 'react' +import TextDefault from '../../Text/TextDefault/TextDefault' +import styles from './styles' +import Button from '../../Button/Button' +import {useTranslation} from 'react-i18next' + +export default function Detail({ + theme, + from, + orderNo, + deliveryAddress, + items, + currencySymbol, + subTotal, + tip, + tax, + deliveryCharges, + total, + navigation, + id, + rider +}) { + + const {t} = useTranslation() + return ( + + {rider && ( + <> + + + + + + + + ) +} diff --git a/enatega-multivendor-restaurant/src/screens/Login/index.js b/enatega-multivendor-restaurant/src/screens/Login/index.js new file mode 100644 index 0000000..b320c89 --- /dev/null +++ b/enatega-multivendor-restaurant/src/screens/Login/index.js @@ -0,0 +1 @@ +export { default as LoginScreen } from './Login' diff --git a/enatega-multivendor-restaurant/src/screens/Login/styles.js b/enatega-multivendor-restaurant/src/screens/Login/styles.js new file mode 100644 index 0000000..3bd8c40 --- /dev/null +++ b/enatega-multivendor-restaurant/src/screens/Login/styles.js @@ -0,0 +1,49 @@ +import { StyleSheet } from 'react-native' +import { colors } from '../../utilities' + +const styles = StyleSheet.create({ + flex: { + flex: 1 + }, + scrollContainer: { + justifyContent: 'center' + }, + topContainer: { + backgroundColor: colors.white, + flex: 3, + justifyContent: 'center', + alignItems: 'center' + }, + bgColor: { + backgroundColor: colors.white + }, + lowerContainer: { + backgroundColor: colors.green, + flex: 7, + borderTopLeftRadius: 25, + borderTopRightRadius: 25, + justifyContent: 'space-around' + }, + headingText: { + flex: 0.2, + justifyContent: 'center', + alignItems: 'center' + }, + inputStyle: { + borderBottomWidth: 0, + borderRadius: 8, + height: 50, + width: '90%', + backgroundColor: colors.white, + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 1 + }, + shadowOpacity: 0.22, + shadowRadius: 2.22, + + elevation: 3 + } +}) +export default styles diff --git a/enatega-multivendor-restaurant/src/screens/OrderDetail/OrderDetail.js b/enatega-multivendor-restaurant/src/screens/OrderDetail/OrderDetail.js new file mode 100644 index 0000000..a9e26cc --- /dev/null +++ b/enatega-multivendor-restaurant/src/screens/OrderDetail/OrderDetail.js @@ -0,0 +1,271 @@ +import React, { useState } from 'react' +import { View, ActivityIndicator, ImageBackground } from 'react-native' +import { ScrollView } from 'react-native-gesture-handler' +import { Spinner, TextDefault } from '../../components' +import { colors, MAX_TIME } from '../../utilities' +import styles from './styles' +import { Image, Button } from 'react-native-elements' +import OrderDetails from '../../components/OrderDetails/OrderDetails' +import { OverlayComponent } from '../../components/Overlay' +import BackButton from '../../components/BackButton/BackButton' +import moment from 'moment' +import { useCancelOrder, useOrderPickedUp, useOrderRing } from '../../ui/hooks' +import CountDown from 'react-native-countdown-component' +import { useRestaurantContext } from '../../ui/context/restaurant' +import { useTranslation } from 'react-i18next' + +export default function OrderDetail({ navigation, route }) { + const { t } = useTranslation() + const { activeBar, orderData, preparationTime, createdAt } = route.params + const { _id, orderDate } = orderData + const { cancelOrder, loading: cancelLoading } = useCancelOrder() + const { pickedUp, loading: loadingPicked } = useOrderPickedUp() + const { muteRing } = useOrderRing() + const [overlayVisible, setOverlayVisible] = useState(false) + const isAcceptButtonVisible = !moment().isBefore(orderDate) + const [print, setPrint] = useState(false) + + const { data } = useRestaurantContext() + // current + const timeNow = new Date() + + // create Time and Difference of 2 min calcualtion + const createdTime = new Date(createdAt) + const remainingTime = moment(createdTime) + .add(MAX_TIME, 'seconds') + .diff(timeNow, 'seconds') + + // accept time for late time deliveries + const date = new Date(orderDate) + const acceptTime = moment(date).diff(timeNow, 'seconds') + + // preparation time based on selection + const prep = new Date(preparationTime) + const diffTime = prep - timeNow + const totalPrep = diffTime > 0 ? diffTime / 1000 : 0 + + // checking whether to give 2 min time or accept time + const decision = !isAcceptButtonVisible + ? acceptTime + : remainingTime > 0 + ? remainingTime + : 0 + + // image path + const order = data.restaurantOrders.find(o => o._id === _id) + const imagePath = + activeBar === 2 + ? require('../../assets/shop.png') + : require('../../assets/bowl.png') + + const toggleOverlay = () => { + setPrint(false) + setOverlayVisible(!overlayVisible) + } + const togglePrintOverlay = () => { + setPrint(true) + setOverlayVisible(!overlayVisible) + } + const cancelOrderFunc = () => { + cancelOrder(order._id, 'not available') + muteRing(order.orderId) + if (cancelLoading) { + return + } else { + navigation.goBack() + } + } + const pickUpOrderFunc = () => { + pickedUp(order._id) + if (loadingPicked) { + return + } else { + navigation.goBack() + } + } + + return ( + + + + + } + style={{ width: 150, height: 140 }} + /> + + + + + + } + style={{ width: 25, height: 25 }} + /> + + + + {activeBar === 2 ? t('prepared') : t('preparing')} + + + {activeBar === 2 ? t('delivered') : t('accepted')} + + + + + + + + {!isAcceptButtonVisible && ( + {t('acceptOrderText')} + )} + {activeBar === 0 && ( + + )} + {activeBar === 1 && ( + <> + + {t('timeLeft')} + + + + )} + + {activeBar === 0 && isAcceptButtonVisible && ( + <> + + ); +} + +export default LocationIcon; diff --git a/enatega-multivendor-web/src/assets/icons/LoginEmailIcon.js b/enatega-multivendor-web/src/assets/icons/LoginEmailIcon.js new file mode 100644 index 0000000..f022a56 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/LoginEmailIcon.js @@ -0,0 +1,58 @@ +import * as React from "react"; +import { useTheme } from "@mui/material"; + +function LoginEmailIcon(props) { + const theme = useTheme(); + return ( + + + + + + + + + + + + + + + + ); +} + +export default LoginEmailIcon; diff --git a/enatega-multivendor-web/src/assets/icons/MastercardIcon.js b/enatega-multivendor-web/src/assets/icons/MastercardIcon.js new file mode 100644 index 0000000..178c60c --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/MastercardIcon.js @@ -0,0 +1,44 @@ +import * as React from "react"; +import { useTheme } from "@mui/material"; + +function MastercardIcon(props) { + const theme = useTheme(); + return ( + + + + + + + + + + ); +} + +export default MastercardIcon; diff --git a/enatega-multivendor-web/src/assets/icons/MobileIcon.js b/enatega-multivendor-web/src/assets/icons/MobileIcon.js new file mode 100644 index 0000000..0f28d40 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/MobileIcon.js @@ -0,0 +1,50 @@ +import React from "react"; +import { useTheme } from "@mui/material"; + +function MobileIcon() { + const theme = useTheme(); + return ( + + + + + + + + + + + + + + ); +} + +export default MobileIcon; diff --git a/enatega-multivendor-web/src/assets/icons/PayPalIcon.js b/enatega-multivendor-web/src/assets/icons/PayPalIcon.js new file mode 100644 index 0000000..e4abf7c --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/PayPalIcon.js @@ -0,0 +1,42 @@ +import React from "react"; +import { useTheme } from "@mui/material"; + +function PayPalIcon() { + const theme = useTheme(); + return ( + + + + + + + + + ); +} + +export default PayPalIcon; diff --git a/enatega-multivendor-web/src/assets/icons/PencilIcon.js b/enatega-multivendor-web/src/assets/icons/PencilIcon.js new file mode 100644 index 0000000..055c794 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/PencilIcon.js @@ -0,0 +1,25 @@ +import { SvgIcon, useTheme } from "@mui/material"; +import * as React from "react"; + +function PencilIcon(props) { + const theme = useTheme(); + return ( + + + + + ); +} + +export default PencilIcon; diff --git a/enatega-multivendor-web/src/assets/icons/PlayStore.js b/enatega-multivendor-web/src/assets/icons/PlayStore.js new file mode 100644 index 0000000..a220f68 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/PlayStore.js @@ -0,0 +1,22 @@ +import React from "react"; +import { useTheme } from "@mui/material"; + +function PlayStore() { + const theme = useTheme(); + return ( + + + + ); +} + +export default React.memo(PlayStore); diff --git a/enatega-multivendor-web/src/assets/icons/PlayStoreIcon.js b/enatega-multivendor-web/src/assets/icons/PlayStoreIcon.js new file mode 100644 index 0000000..3c656b8 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/PlayStoreIcon.js @@ -0,0 +1,99 @@ +import * as React from "react"; +import { useTheme } from "@mui/material"; + +function PlayStoreIcon(props) { + const theme = useTheme(); + return ( + + {"F455A5CC-D2E2-48B1-A82D-44FCE13B067B"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default PlayStoreIcon; diff --git a/enatega-multivendor-web/src/assets/icons/ProfileIcon.js b/enatega-multivendor-web/src/assets/icons/ProfileIcon.js new file mode 100644 index 0000000..26b4881 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/ProfileIcon.js @@ -0,0 +1,26 @@ +import { SvgIcon, useTheme } from "@mui/material"; +import * as React from "react"; + +function ProfileIcon(props) { + const theme = useTheme(); + return ( + + + + + + + ); +} + +export default ProfileIcon; diff --git a/enatega-multivendor-web/src/assets/icons/RightIcon.js b/enatega-multivendor-web/src/assets/icons/RightIcon.js new file mode 100644 index 0000000..6b9462c --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/RightIcon.js @@ -0,0 +1,24 @@ +import * as React from "react"; +import { useTheme } from "@mui/material"; + +function RightIcon(props) { + const theme = useTheme(); + return ( + + {"A72C3084-0C79-41AF-9C67-DF8BFD378C1D"} + + + ); +} + +export default RightIcon; diff --git a/enatega-multivendor-web/src/assets/icons/SearchIcon.js b/enatega-multivendor-web/src/assets/icons/SearchIcon.js new file mode 100644 index 0000000..e41028b --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/SearchIcon.js @@ -0,0 +1,22 @@ +import { SvgIcon, useTheme } from "@mui/material"; +import * as React from "react"; + +function SearchIcon(props) { + const theme = useTheme(); + return ( + + + + ); +} + +export default SearchIcon; diff --git a/enatega-multivendor-web/src/assets/icons/VisaIcon.js b/enatega-multivendor-web/src/assets/icons/VisaIcon.js new file mode 100644 index 0000000..f86f42d --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/VisaIcon.js @@ -0,0 +1,28 @@ +import * as React from "react"; +import { useTheme } from "@mui/material"; + +function VisaIcon(props) { + const theme = useTheme(); + return ( + + + + + + + ); +} + +export default VisaIcon; diff --git a/enatega-multivendor-web/src/assets/icons/bill_cash.svg b/enatega-multivendor-web/src/assets/icons/bill_cash.svg new file mode 100644 index 0000000..9da5522 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/bill_cash.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/icons/cart.svg b/enatega-multivendor-web/src/assets/icons/cart.svg new file mode 100644 index 0000000..75fdd73 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/cart.svg @@ -0,0 +1,4 @@ + + + + diff --git a/enatega-multivendor-web/src/assets/icons/email.svg b/enatega-multivendor-web/src/assets/icons/email.svg new file mode 100644 index 0000000..d419bf0 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/email.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/icons/favourite.svg b/enatega-multivendor-web/src/assets/icons/favourite.svg new file mode 100644 index 0000000..7b23126 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/favourite.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/icons/location.svg b/enatega-multivendor-web/src/assets/icons/location.svg new file mode 100644 index 0000000..a519d7d --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/location.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/enatega-multivendor-web/src/assets/icons/master_card.svg b/enatega-multivendor-web/src/assets/icons/master_card.svg new file mode 100644 index 0000000..826bae6 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/master_card.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/enatega-multivendor-web/src/assets/icons/payment_method.svg b/enatega-multivendor-web/src/assets/icons/payment_method.svg new file mode 100644 index 0000000..a36122d --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/payment_method.svg @@ -0,0 +1,4 @@ + + + + diff --git a/enatega-multivendor-web/src/assets/icons/paypal_icon.svg b/enatega-multivendor-web/src/assets/icons/paypal_icon.svg new file mode 100644 index 0000000..a3f2633 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/paypal_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/icons/user.svg b/enatega-multivendor-web/src/assets/icons/user.svg new file mode 100644 index 0000000..b35ecc5 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/user.svg @@ -0,0 +1,4 @@ + + + + diff --git a/enatega-multivendor-web/src/assets/icons/visa_icon.svg b/enatega-multivendor-web/src/assets/icons/visa_icon.svg new file mode 100644 index 0000000..9605173 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/visa_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/icons/whatsapp.svg b/enatega-multivendor-web/src/assets/icons/whatsapp.svg new file mode 100644 index 0000000..4d1a8a2 --- /dev/null +++ b/enatega-multivendor-web/src/assets/icons/whatsapp.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/enatega-multivendor-web/src/assets/images/1.png b/enatega-multivendor-web/src/assets/images/1.png new file mode 100644 index 0000000..4e7e3c9 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/1.png differ diff --git a/enatega-multivendor-web/src/assets/images/2.webp b/enatega-multivendor-web/src/assets/images/2.webp new file mode 100644 index 0000000..a744058 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/2.webp differ diff --git a/enatega-multivendor-web/src/assets/images/Address.svg b/enatega-multivendor-web/src/assets/images/Address.svg new file mode 100644 index 0000000..5d443e4 --- /dev/null +++ b/enatega-multivendor-web/src/assets/images/Address.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-web/src/assets/images/AppVector.png b/enatega-multivendor-web/src/assets/images/AppVector.png new file mode 100644 index 0000000..869a3cb Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/AppVector.png differ diff --git a/enatega-multivendor-web/src/assets/images/Vector.png b/enatega-multivendor-web/src/assets/images/Vector.png new file mode 100644 index 0000000..e4fcc1d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/Vector.png differ diff --git a/enatega-multivendor-web/src/assets/images/app-store.png b/enatega-multivendor-web/src/assets/images/app-store.png new file mode 100644 index 0000000..bd2cd46 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/app-store.png differ diff --git a/enatega-multivendor-web/src/assets/images/arrow.png b/enatega-multivendor-web/src/assets/images/arrow.png new file mode 100644 index 0000000..5a0aa46 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/arrow.png differ diff --git a/enatega-multivendor-web/src/assets/images/arrow.svg b/enatega-multivendor-web/src/assets/images/arrow.svg new file mode 100644 index 0000000..44aa18c --- /dev/null +++ b/enatega-multivendor-web/src/assets/images/arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/enatega-multivendor-web/src/assets/images/banner-1.png b/enatega-multivendor-web/src/assets/images/banner-1.png new file mode 100644 index 0000000..66bab8d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/banner-1.png differ diff --git a/enatega-multivendor-web/src/assets/images/banner-2.png b/enatega-multivendor-web/src/assets/images/banner-2.png new file mode 100644 index 0000000..a1002a2 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/banner-2.png differ diff --git a/enatega-multivendor-web/src/assets/images/bg-invert.png b/enatega-multivendor-web/src/assets/images/bg-invert.png new file mode 100644 index 0000000..fbb3a4a Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg-invert.png differ diff --git a/enatega-multivendor-web/src/assets/images/bg.png b/enatega-multivendor-web/src/assets/images/bg.png new file mode 100644 index 0000000..f9a0c33 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/bg_Food.jpeg b/enatega-multivendor-web/src/assets/images/bg_Food.jpeg new file mode 100644 index 0000000..25f018d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg_Food.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/bg_List_Container.jpeg b/enatega-multivendor-web/src/assets/images/bg_List_Container.jpeg new file mode 100644 index 0000000..698c8b3 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg_List_Container.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/bg_Search.jpeg b/enatega-multivendor-web/src/assets/images/bg_Search.jpeg new file mode 100644 index 0000000..6a2b53e Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg_Search.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/bg_bussiness.jpeg b/enatega-multivendor-web/src/assets/images/bg_bussiness.jpeg new file mode 100644 index 0000000..1b8e32f Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bg_bussiness.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/blog-bg.png b/enatega-multivendor-web/src/assets/images/blog-bg.png new file mode 100644 index 0000000..8a1abad Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/blog-bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/blog1.png b/enatega-multivendor-web/src/assets/images/blog1.png new file mode 100644 index 0000000..77a4ce3 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/blog1.png differ diff --git a/enatega-multivendor-web/src/assets/images/blog2.png b/enatega-multivendor-web/src/assets/images/blog2.png new file mode 100644 index 0000000..8c09be5 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/blog2.png differ diff --git a/enatega-multivendor-web/src/assets/images/bowl.png b/enatega-multivendor-web/src/assets/images/bowl.png new file mode 100644 index 0000000..9224c62 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/bowl.png differ diff --git a/enatega-multivendor-web/src/assets/images/burger.png b/enatega-multivendor-web/src/assets/images/burger.png new file mode 100644 index 0000000..2ba817a Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/burger.png differ diff --git a/enatega-multivendor-web/src/assets/images/categories-bg.png b/enatega-multivendor-web/src/assets/images/categories-bg.png new file mode 100644 index 0000000..4dcd307 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/categories-bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/contact-pg.png b/enatega-multivendor-web/src/assets/images/contact-pg.png new file mode 100644 index 0000000..5040901 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/contact-pg.png differ diff --git a/enatega-multivendor-web/src/assets/images/curve.png b/enatega-multivendor-web/src/assets/images/curve.png new file mode 100644 index 0000000..f9ee0c2 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/curve.png differ diff --git a/enatega-multivendor-web/src/assets/images/cust-app.png b/enatega-multivendor-web/src/assets/images/cust-app.png new file mode 100644 index 0000000..e95374b Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/cust-app.png differ diff --git a/enatega-multivendor-web/src/assets/images/dashboard.png b/enatega-multivendor-web/src/assets/images/dashboard.png new file mode 100644 index 0000000..cc2ca59 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/dashboard.png differ diff --git a/enatega-multivendor-web/src/assets/images/delivered.png b/enatega-multivendor-web/src/assets/images/delivered.png new file mode 100644 index 0000000..bb79132 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/delivered.png differ diff --git a/enatega-multivendor-web/src/assets/images/demo.png b/enatega-multivendor-web/src/assets/images/demo.png new file mode 100644 index 0000000..3798754 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/demo.png differ diff --git a/enatega-multivendor-web/src/assets/images/dest-map-2.png b/enatega-multivendor-web/src/assets/images/dest-map-2.png new file mode 100644 index 0000000..e5ee665 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/dest-map-2.png differ diff --git a/enatega-multivendor-web/src/assets/images/dest-map.png b/enatega-multivendor-web/src/assets/images/dest-map.png new file mode 100644 index 0000000..1de961d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/dest-map.png differ diff --git a/enatega-multivendor-web/src/assets/images/dish.png b/enatega-multivendor-web/src/assets/images/dish.png new file mode 100644 index 0000000..cd4fee2 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/dish.png differ diff --git a/enatega-multivendor-web/src/assets/images/easy-eats.png b/enatega-multivendor-web/src/assets/images/easy-eats.png new file mode 100644 index 0000000..51d8046 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/easy-eats.png differ diff --git a/enatega-multivendor-web/src/assets/images/email.png b/enatega-multivendor-web/src/assets/images/email.png new file mode 100644 index 0000000..af83afd Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/email.png differ diff --git a/enatega-multivendor-web/src/assets/images/emailLock.png b/enatega-multivendor-web/src/assets/images/emailLock.png new file mode 100644 index 0000000..75eb51c Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/emailLock.png differ diff --git a/enatega-multivendor-web/src/assets/images/empty-search.svg b/enatega-multivendor-web/src/assets/images/empty-search.svg new file mode 100644 index 0000000..79d44a1 --- /dev/null +++ b/enatega-multivendor-web/src/assets/images/empty-search.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-web/src/assets/images/facebook.png b/enatega-multivendor-web/src/assets/images/facebook.png new file mode 100644 index 0000000..d2d5464 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/facebook.png differ diff --git a/enatega-multivendor-web/src/assets/images/fav-bg.png b/enatega-multivendor-web/src/assets/images/fav-bg.png new file mode 100644 index 0000000..20760a1 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/fav-bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/favs.png b/enatega-multivendor-web/src/assets/images/favs.png new file mode 100644 index 0000000..8064742 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/favs.png differ diff --git a/enatega-multivendor-web/src/assets/images/firebase.png b/enatega-multivendor-web/src/assets/images/firebase.png new file mode 100644 index 0000000..dfe4bbb Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/firebase.png differ diff --git a/enatega-multivendor-web/src/assets/images/fish.png b/enatega-multivendor-web/src/assets/images/fish.png new file mode 100644 index 0000000..77f1c96 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/fish.png differ diff --git a/enatega-multivendor-web/src/assets/images/food-plate.png b/enatega-multivendor-web/src/assets/images/food-plate.png new file mode 100644 index 0000000..a9c6abd Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/food-plate.png differ diff --git a/enatega-multivendor-web/src/assets/images/fruits-2.png b/enatega-multivendor-web/src/assets/images/fruits-2.png new file mode 100644 index 0000000..1cfb894 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/fruits-2.png differ diff --git a/enatega-multivendor-web/src/assets/images/fruits.png b/enatega-multivendor-web/src/assets/images/fruits.png new file mode 100644 index 0000000..16e1d5a Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/fruits.png differ diff --git a/enatega-multivendor-web/src/assets/images/gql.png b/enatega-multivendor-web/src/assets/images/gql.png new file mode 100644 index 0000000..8836977 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/gql.png differ diff --git a/enatega-multivendor-web/src/assets/images/hero-img.jpg b/enatega-multivendor-web/src/assets/images/hero-img.jpg new file mode 100644 index 0000000..66130d1 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/hero-img.jpg differ diff --git a/enatega-multivendor-web/src/assets/images/home.png b/enatega-multivendor-web/src/assets/images/home.png new file mode 100644 index 0000000..139afc3 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/home.png differ diff --git a/enatega-multivendor-web/src/assets/images/icecream.png b/enatega-multivendor-web/src/assets/images/icecream.png new file mode 100644 index 0000000..d9062c9 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/icecream.png differ diff --git a/enatega-multivendor-web/src/assets/images/img-map-background.jpeg b/enatega-multivendor-web/src/assets/images/img-map-background.jpeg new file mode 100644 index 0000000..29e2f74 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/img-map-background.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/info-bg.png b/enatega-multivendor-web/src/assets/images/info-bg.png new file mode 100644 index 0000000..7e7558d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/info-bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/insta.png b/enatega-multivendor-web/src/assets/images/insta.png new file mode 100644 index 0000000..0798f0d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/insta.png differ diff --git a/enatega-multivendor-web/src/assets/images/linkedin.png b/enatega-multivendor-web/src/assets/images/linkedin.png new file mode 100644 index 0000000..1bf114f Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/linkedin.png differ diff --git a/enatega-multivendor-web/src/assets/images/location.png b/enatega-multivendor-web/src/assets/images/location.png new file mode 100644 index 0000000..4a98197 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/location.png differ diff --git a/enatega-multivendor-web/src/assets/images/logo.png b/enatega-multivendor-web/src/assets/images/logo.png new file mode 100644 index 0000000..e77c2e0 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/logo.png differ diff --git a/enatega-multivendor-web/src/assets/images/logo.svg b/enatega-multivendor-web/src/assets/images/logo.svg new file mode 100644 index 0000000..64f8e8f --- /dev/null +++ b/enatega-multivendor-web/src/assets/images/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/enatega-multivendor-web/src/assets/images/marker.png b/enatega-multivendor-web/src/assets/images/marker.png new file mode 100644 index 0000000..5db86fd Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/marker.png differ diff --git a/enatega-multivendor-web/src/assets/images/mobile_pic.png b/enatega-multivendor-web/src/assets/images/mobile_pic.png new file mode 100644 index 0000000..0c55b32 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/mobile_pic.png differ diff --git a/enatega-multivendor-web/src/assets/images/mongodb.png b/enatega-multivendor-web/src/assets/images/mongodb.png new file mode 100644 index 0000000..66b4525 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/mongodb.png differ diff --git a/enatega-multivendor-web/src/assets/images/mui.png b/enatega-multivendor-web/src/assets/images/mui.png new file mode 100644 index 0000000..28acb76 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/mui.png differ diff --git a/enatega-multivendor-web/src/assets/images/node.png b/enatega-multivendor-web/src/assets/images/node.png new file mode 100644 index 0000000..a243d03 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/node.png differ diff --git a/enatega-multivendor-web/src/assets/images/pickup.png b/enatega-multivendor-web/src/assets/images/pickup.png new file mode 100644 index 0000000..e6b39f5 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/pickup.png differ diff --git a/enatega-multivendor-web/src/assets/images/play-store.png b/enatega-multivendor-web/src/assets/images/play-store.png new file mode 100644 index 0000000..80a6a95 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/play-store.png differ diff --git a/enatega-multivendor-web/src/assets/images/preparing.png b/enatega-multivendor-web/src/assets/images/preparing.png new file mode 100644 index 0000000..dfb16a8 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/preparing.png differ diff --git a/enatega-multivendor-web/src/assets/images/price-bg.png b/enatega-multivendor-web/src/assets/images/price-bg.png new file mode 100644 index 0000000..ea58b2d Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/price-bg.png differ diff --git a/enatega-multivendor-web/src/assets/images/profile.png b/enatega-multivendor-web/src/assets/images/profile.png new file mode 100644 index 0000000..7334d17 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/profile.png differ diff --git a/enatega-multivendor-web/src/assets/images/react.png b/enatega-multivendor-web/src/assets/images/react.png new file mode 100644 index 0000000..6b7c578 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/react.png differ diff --git a/enatega-multivendor-web/src/assets/images/rest-map-2.png b/enatega-multivendor-web/src/assets/images/rest-map-2.png new file mode 100644 index 0000000..361660f Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rest-map-2.png differ diff --git a/enatega-multivendor-web/src/assets/images/rest-map.png b/enatega-multivendor-web/src/assets/images/rest-map.png new file mode 100644 index 0000000..fa8f881 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rest-map.png differ diff --git a/enatega-multivendor-web/src/assets/images/restaurant-app.png b/enatega-multivendor-web/src/assets/images/restaurant-app.png new file mode 100644 index 0000000..60df6f1 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/restaurant-app.png differ diff --git a/enatega-multivendor-web/src/assets/images/restaurants.jpeg b/enatega-multivendor-web/src/assets/images/restaurants.jpeg new file mode 100644 index 0000000..75ee965 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/restaurants.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/restaurants.png b/enatega-multivendor-web/src/assets/images/restaurants.png new file mode 100644 index 0000000..d81cba5 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/restaurants.png differ diff --git a/enatega-multivendor-web/src/assets/images/rider-app.png b/enatega-multivendor-web/src/assets/images/rider-app.png new file mode 100644 index 0000000..bc8ed86 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rider-app.png differ diff --git a/enatega-multivendor-web/src/assets/images/rider-map-2.png b/enatega-multivendor-web/src/assets/images/rider-map-2.png new file mode 100644 index 0000000..fa95b74 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rider-map-2.png differ diff --git a/enatega-multivendor-web/src/assets/images/rider-map.png b/enatega-multivendor-web/src/assets/images/rider-map.png new file mode 100644 index 0000000..2089034 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rider-map.png differ diff --git a/enatega-multivendor-web/src/assets/images/rider.jpeg b/enatega-multivendor-web/src/assets/images/rider.jpeg new file mode 100644 index 0000000..beeda4f Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rider.jpeg differ diff --git a/enatega-multivendor-web/src/assets/images/rider.png b/enatega-multivendor-web/src/assets/images/rider.png new file mode 100644 index 0000000..cc52f38 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/rider.png differ diff --git a/enatega-multivendor-web/src/assets/images/scooter.png b/enatega-multivendor-web/src/assets/images/scooter.png new file mode 100644 index 0000000..6d880e2 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/scooter.png differ diff --git a/enatega-multivendor-web/src/assets/images/shrimp.png b/enatega-multivendor-web/src/assets/images/shrimp.png new file mode 100644 index 0000000..96754ae Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/shrimp.png differ diff --git a/enatega-multivendor-web/src/assets/images/twitter.png b/enatega-multivendor-web/src/assets/images/twitter.png new file mode 100644 index 0000000..86aa29b Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/twitter.png differ diff --git a/enatega-multivendor-web/src/assets/images/voucher.svg b/enatega-multivendor-web/src/assets/images/voucher.svg new file mode 100644 index 0000000..89fc5f5 --- /dev/null +++ b/enatega-multivendor-web/src/assets/images/voucher.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/enatega-multivendor-web/src/assets/images/web-app.png b/enatega-multivendor-web/src/assets/images/web-app.png new file mode 100644 index 0000000..288a09e Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/web-app.png differ diff --git a/enatega-multivendor-web/src/assets/images/web.png b/enatega-multivendor-web/src/assets/images/web.png new file mode 100644 index 0000000..ab209d1 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/web.png differ diff --git a/enatega-multivendor-web/src/assets/images/webapp.png b/enatega-multivendor-web/src/assets/images/webapp.png new file mode 100644 index 0000000..3d6bd98 Binary files /dev/null and b/enatega-multivendor-web/src/assets/images/webapp.png differ diff --git a/enatega-multivendor-web/src/components/Chat/Chat.js b/enatega-multivendor-web/src/components/Chat/Chat.js new file mode 100644 index 0000000..e2607f6 --- /dev/null +++ b/enatega-multivendor-web/src/components/Chat/Chat.js @@ -0,0 +1,63 @@ +import { Paper, Typography, IconButton } from "@mui/material"; +import React, { useEffect } from "react"; +import { TextInput } from "./TextInput.js"; +import { MessageLeft, MessageRight } from "./Message"; +import CloseIcon from "@mui/icons-material/Close"; +import { useChatScreen } from "../../hooks/useChat"; +import moment from "moment"; +import useStyles from "./styles.js"; +import { Box } from "@mui/system"; + +export default function Chat({ setToggleChat, id }) { + const { messages, onSend, profile, messageContainerRef } = useChatScreen(id); + const classes = useStyles(); + useEffect(()=>{ + messageContainerRef.current.focus() + }) + return ( +
+ + + setToggleChat(false)} + className={classes.closeBtn} + > + + + + + Let's start chat with your rider + + + {/* How to focus on new message */} + {/* https://stackoverflow.com/questions/55118437/react-auto-scroll-to-bottom-on-a-chat-container */} + + {messages ? ( + messages.map((msg) => { + return profile._id === msg.user._id ? ( + + ) : ( + + ); + }) + ) : ( + Lets Chat with rider + )} + + + +
+ ); +} diff --git a/enatega-multivendor-web/src/components/Chat/Message.js b/enatega-multivendor-web/src/components/Chat/Message.js new file mode 100644 index 0000000..8712106 --- /dev/null +++ b/enatega-multivendor-web/src/components/Chat/Message.js @@ -0,0 +1,69 @@ +import React from "react"; +/* eslint-disable react-hooks/exhaustive-deps */ +import { Typography } from "@mui/material"; +import useStyles from "./styles"; +import { useTheme } from "@emotion/react"; + +export const MessageLeft = (props) => { + const message = props.message ? props.message : "no message"; + const timestamp = props.timestamp ? props.timestamp : ""; + const displayName = props.displayName ? props.displayName : "Usama"; + const classes = useStyles(); + const theme = useTheme(); + + return ( + <> +
+
+
+
+ + {displayName} + + + {timestamp} + +
+
+

{message}

+
+
+
+
+ + ); +}; +export const MessageRight = (props) => { + const theme = useTheme(); + + const classes = useStyles(); + const message = props.message ? props.message : "no message"; + const timestamp = props.timestamp ? props.timestamp : ""; + return ( +
+
+
+ + {"You"} + + + {timestamp} + +
+

{message}

+
+
+ ); +}; diff --git a/enatega-multivendor-web/src/components/Chat/TextInput.js b/enatega-multivendor-web/src/components/Chat/TextInput.js new file mode 100644 index 0000000..3fb8455 --- /dev/null +++ b/enatega-multivendor-web/src/components/Chat/TextInput.js @@ -0,0 +1,44 @@ +import React, { useState } from "react"; +import SendIcon from "@mui/icons-material/Send"; +import { TextField } from "@mui/material"; +import useStyles from "./styles"; + +export const TextInput = ({ sendMessage, onKeyDown }) => { + const classes = useStyles(); + const [inputMessage, setInputMessage] = useState(""); + + return ( + <> +
+ { + e.key === "Enter" && !e.shiftKey && e.preventDefault(); + if(e.key === "Enter" && !e.shiftKey){ + onKeyDown(inputMessage) + setInputMessage("") + } + }} + value={inputMessage} + onChange={(event) => setInputMessage(event.target.value)} + InputProps={{ + endAdornment: ( + { + sendMessage(inputMessage) + setInputMessage("") + }} + /> + ), + }} + /> + + + ); +}; diff --git a/enatega-multivendor-web/src/components/Chat/index.js b/enatega-multivendor-web/src/components/Chat/index.js new file mode 100644 index 0000000..f78239d --- /dev/null +++ b/enatega-multivendor-web/src/components/Chat/index.js @@ -0,0 +1,2 @@ +import Chat from "./Chat"; +export { Chat }; diff --git a/enatega-multivendor-web/src/components/Chat/styles.js b/enatega-multivendor-web/src/components/Chat/styles.js new file mode 100644 index 0000000..4f133cb --- /dev/null +++ b/enatega-multivendor-web/src/components/Chat/styles.js @@ -0,0 +1,133 @@ +import makeStyles from "@mui/styles/makeStyles"; +import { deepOrange } from "@mui/material/colors"; + +const useStyles = makeStyles((theme) => ({ + paper: { + maxWidth: "500px", + maxHeight: "700px", + width: "400px", + height: "460px", + display: "flex", + alignItems: "center", + flexDirection: "column", + [theme.breakpoints.down("sm")]: { + width: "350px", + }, + }, + container: { + position: "fixed", + right: "35px", + bottom: "35px", + [theme.breakpoints.down("sm")]: { + right: "25px", + bottom: "35px", + }, + }, + messagesBody: { + marginBottom: "10px", + overflowY: "scroll", + overflowX: "hidden", + width: "100%", + height: "100%", + display: 'flex', + flexDirection: 'column-reverse' + }, + header: { + display: "flex", + alignItems: "center", + justifyContent: "center", + width: "100%", + position: "relative", + height: 100, + }, + heading: { + color: theme.palette.grey[500], + }, + closeBtn: { + position: "absolute", + right: "-20px", + top: "-20px", + backgroundColor: "black", + "&:hover": { + backgroundColor: "black", + }, + }, + wrapForm: { + display: "flex", + justifyContent: "center", + width: "95%", + margin: `${theme.spacing(1)} auto`, + }, + wrapText: { + width: "100%", + }, + input: { + color: theme.palette.common.black, + }, + messageRow: { + display: "flex", + marginTop: theme.spacing(2), + }, + messageRowRight: { + marginTop: theme.spacing(2), + display: "flex", + justifyContent: "flex-end", + }, + messageGreen: { + position: "relative", + marginLeft: "20px", + padding: 15, + backgroundColor: theme.palette.primary.main, + textAlign: "left", + border: `1px solid ${theme.palette.primary.main}`, + borderRadius: 20, + borderBottomLeftRadius: 0, + }, + messageOrange: { + position: "relative", + marginRight: "20px", + padding: 15, + display: "flex", + flexDirection: "column", + backgroundColor: theme.palette.common.black, + fontWeight: 600, + textAlign: "left", + font: "400 .9em 'Open Sans', sans-serif", + border: `1px solid theme.palette.common.black`, + borderRadius: 20, + borderBottomRightRadius: 0, + }, + + messageContent: { + padding: 0, + margin: 0, + wordWrap: "break-word", + width: "200px", + }, + messageTimeStampRight: { + fontSize: ".85em", + fontWeight: "300", + display: "flex", + justifyContent: "space-between", + }, + + orange: { + color: theme.palette.getContrastText(deepOrange[500]), + backgroundColor: deepOrange[500], + width: theme.spacing(4), + height: theme.spacing(4), + marginLeft: theme.spacing(2), + }, + avatarNothing: { + color: "transparent", + backgroundColor: "transparent", + width: theme.spacing(4), + height: theme.spacing(4), + }, + displayName: { + marginLeft: "20px", + color: theme.palette.common.black, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Checkout/AddressDetail.js b/enatega-multivendor-web/src/components/Checkout/AddressDetail.js new file mode 100644 index 0000000..ee15053 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/AddressDetail.js @@ -0,0 +1,202 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useMutation } from "@apollo/client"; +import { + Box, + Button, + CircularProgress, + Grid, + TextField, + Typography, + useTheme, +} from "@mui/material"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import clsx from "clsx"; +import gql from "graphql-tag"; +import React, { useCallback, useState } from "react"; +import { createAddress, editAddress } from "../../apollo/server"; +import useStyle from "./styles"; +import MarkerImage from "../../assets/images/marker.png"; +import { useTranslation } from "react-i18next"; + +const EDIT_ADDRESS = gql` + ${editAddress} +`; +const CREATE_ADDRESS = gql` + ${createAddress} +`; + +function AddressDetail({ + addressDetail, + locationModal, + toggleDetail, + notification, +}) { + const isEdit = Boolean(addressDetail?.id); + const theme = useTheme(); + const classes = useStyle(); + const [addressError, setAddressError] = useState(""); + const { t } = useTranslation(); + const [details, setDetails] = useState(""); + const [mutate, { loading }] = useMutation( + isEdit ? EDIT_ADDRESS : CREATE_ADDRESS, + { + onCompleted, + onError, + } + ); + + function onCompleted(data) { + if (isEdit) { + notification({ + type: "warning", + message: "Address updated", + }); + } else { + notification({ + type: "success", + message: "Address added", + }); + } + toggleDetail(); + } + + function onError(error) { + console.log(error); + notification({ + type: "error", + message: `An error occured. Please try again. ${error}`, + }); + } + + const clearErrors = useCallback(() => { + setAddressError(""); + }, []); + + const validateAddress = () => { + clearErrors(); + const detailValue = addressDetail.location; + if (!detailValue) { + setAddressError("Delivery details is required"); + return false; + } + if (!addressDetail?.lat || !addressDetail?.lng) { + setAddressError("Delivery address is required"); + return false; + } + mutate({ + variables: { + addressInput: { + _id: isEdit ? addressDetail?.id : "", + latitude: `${addressDetail?.lat}`, + longitude: `${addressDetail?.lng}`, + deliveryAddress: addressDetail?.location.trim(), + details: details, + label: addressDetail?.label || "Home", + }, + }, + }); + }; + + return ( + + + + + + + + + {addressDetail?.location ?? ""} + + + + + setDetails(e.currentTarget.value)} + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + + + + + ); +} + +export default React.memo(AddressDetail); diff --git a/enatega-multivendor-web/src/components/Checkout/CartItemCard.js b/enatega-multivendor-web/src/components/Checkout/CartItemCard.js new file mode 100644 index 0000000..77567b4 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/CartItemCard.js @@ -0,0 +1,378 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useMutation, useQuery } from "@apollo/client"; +import { + Box, + Button, + Container, + Divider, + Grid, + Paper, + Typography, + useTheme, +} from "@mui/material"; +import clsx from "clsx"; +import gql from "graphql-tag"; +import React, { + useContext, + useEffect, + useRef, + useState, + useCallback, +} from "react"; +import { getCoupon, getTipping } from "../../apollo/server"; +import ConfigurationContext from "../../context/Configuration"; +import UserContext from "../../context/User"; +import useStyles from "./styles"; +import CartItem from "../RestaurantDetailComponent/RestaurantCart/CartItem"; +import Voucher from "./Voucher"; +import { useTranslation } from "react-i18next"; + +const TIPPING = gql` + ${getTipping} +`; +const GET_COUPON = gql` + ${getCoupon} +`; + +function CartItemsCard({ + restaurantData, + setFlashMessage, + selectedTip, + setSelectedTip, + setTaxValue, + setCoupon, + calculatePrice, + taxCalculation, + calculateTip, + calculateTotal, + isPickUp, + deliveryCharges, + addQuantity, + removeQuantity, +}) { + const { t } = useTranslation(); + const couponRef = useRef(null); + const [couponError, setCouponError] = useState(null); + const [couponText, setCouponText] = useState(""); + const theme = useTheme(); + const classes = useStyles(); + const { cart } = useContext(UserContext); + const configuration = useContext(ConfigurationContext); + const [voucherModal, setVoucherModal] = useState(false); + const [isCouponApplied, setIsCouponApplied] = useState(false); + + const { data: dataTip } = useQuery(TIPPING, { + fetchPolicy: "network-only", + }); + const [mutate, { loading: couponLoading }] = useMutation(GET_COUPON, { + onCompleted: couponCompleted, + onError: couponOnError, + }); + + useEffect(() => { + if (dataTip && !selectedTip) { + setSelectedTip(dataTip.tips.tipVariations[1]); + } + }, [restaurantData, dataTip]); + + useEffect(() => { + setTaxValue(restaurantData ? +restaurantData.tax : 0); + }, [restaurantData]); + + const mutateVoucher = (e) => { + e.preventDefault(); + mutate({ variables: { coupon: couponText } }); + }; + + function couponCompleted({ coupon }) { + if (coupon) { + if (coupon.enabled) { + couponRef.current = coupon; + setCoupon(coupon); + setCouponError(""); + setIsCouponApplied(true); + setFlashMessage({ + type: "success", + message: "Coupon applied.", + }); + setVoucherModal((prev) => !prev); + } else { + setCouponError("Coupon not found!"); + setFlashMessage({ + type: "warning", + message: "Coupon unavailable.", + }); + } + } + } + function couponOnError() { + setCouponError("Coupon not found!"); + setFlashMessage({ + type: "error", + message: "Invalid Coupon.", + }); + } + const toggleVoucherModal = useCallback(() => { + setVoucherModal((prev) => !prev); + }, []); + + return ( + <> + + + {cart?.map((foodItem, index) => ( + <> + { + addQuantity(foodItem.key); + }} + removeQuantity={() => { + if (foodItem.quantity > 1) { + removeQuantity(foodItem.key); + } + }} + /> + + + ))} + + + + + + + {t("subTotal")} + + + {`${configuration.currencySymbol} ${calculatePrice(0)}`} + + + {!isPickUp && ( + + + {t("deliveryFee")} + + + {`${configuration.currencySymbol} ${deliveryCharges.toFixed( + 2 + )}`} + + + )} + + + {t("taxFee")} + + + {`${configuration.currencySymbol} ${taxCalculation()}`} + + + + + {t("haveVoucher")} + + + + + + + {t("tip")} + + + {selectedTip && ( + + + + + {`${configuration.currencySymbol} ${parseFloat( + calculateTip() + ).toFixed(2)}`} + + + + )} + + {dataTip && ( + + {dataTip.tips.tipVariations.map((label, index) => ( + + ))} + + )} + + + + + + {isCouponApplied + ? `Coupon is applied: ${couponText}` + : t("discount")} + + + {`-${configuration.currencySymbol} ${parseFloat( + calculatePrice(0, false) - calculatePrice(0, true) + ).toFixed(2)}`} + + + + + + {t("total")} + + + (incl. TAX) + + + + {`${configuration.currencySymbol} ${calculateTotal()}`} + + + + + + + + ); +} + +export default React.memo(CartItemsCard); diff --git a/enatega-multivendor-web/src/components/Checkout/DeliveryCard.js b/enatega-multivendor-web/src/components/Checkout/DeliveryCard.js new file mode 100644 index 0000000..2bf33dc --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/DeliveryCard.js @@ -0,0 +1,469 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { gql, useMutation } from "@apollo/client"; +import { + Box, + Button, + CircularProgress, + Container, + Grid, + Paper, + Typography, + useTheme, +} from "@mui/material"; +import clsx from "clsx"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import { deleteAddress } from "../../apollo/server"; +import DustbinIcon from "../../assets/icons/DustbinIcon"; +import PencilIcon from "../../assets/icons/PencilIcon"; +import UserContext from "../../context/User"; +import FlashMessage from "../FlashMessage"; +import { AddressModal } from "../Modals"; +import AddressDetail from "./AddressDetail"; +import useStyles from "./styles"; +import ArrowForwardIcon from "@mui/icons-material/ArrowForward"; +import ModeEditIcon from "@mui/icons-material/ModeEdit"; +import DeleteIcon from "@mui/icons-material/Delete"; +import { useLocationContext } from "../../context/Location"; +import { useTranslation } from "react-i18next"; +import HomeIcon from "@mui/icons-material/Home"; +const LATITUDE = 33.7001019; +const LONGITUDE = 72.9735978; + +const DELETE_ADDRESS = gql` + ${deleteAddress} +`; + +function DeliveryCard({ + selectedAddress, + setSelectedAddress, + isProfile, + isModal, + isCheckout, + close, +}) { + const { t } = useTranslation(); + const deleteId = useRef(null); + const theme = useTheme(); + const classes = useStyles(); + const { profile } = useContext(UserContext); + const { location } = useLocationContext(); + const [mainError, setMainError] = useState({}); + const [adressModal, setAddressModal] = useState(false); + const [showDetail, setShowDetail] = useState(false); + const [addressInfo, setAddressInfo] = useState(null); + const [mutate, { loading: loadingDelete }] = useMutation(DELETE_ADDRESS, { + onCompleted, + onError, + }); + + useEffect(() => { + if (location && !addressInfo) { + currentLocation(); + } + }, [location]); + + useEffect(() => { + if (profile?.addresses < 1) { + toggleShowDetail(); + } else { + setSelectedAddress(profile?.addresses[0]); + } + }, [profile]); + + const currentLocation = useCallback(() => { + if (location) + setAddressInfo({ + lat: location?.latitude ?? LATITUDE, + lng: location?.longitude ?? LONGITUDE, + location: location?.deliveryAddress ?? "", + }); + }, [location]); + + const toggleAddressModal = useCallback(() => { + setAddressModal((prev) => !prev); + setShowDetail((prev) => { + if (prev) return prev; + else return true; + }); + }, []); + + const toggleShowDetail = useCallback(() => { + setShowDetail((prev) => !prev); + }, []); + + const editAddress = useCallback((item) => { + const coordinates = { + lat: parseFloat(item?.location.coordinates[1]) ?? null, + lng: parseFloat(item?.location.coordinates[0]) ?? null, + }; + setAddressInfo({ + ...coordinates, + id: item._id, + location: item.deliveryAddress, + detail: item.details, + label: item.label || "Home", + }); + toggleShowDetail(); + }, []); + + function onCompleted() { + setMainError({ + message: "Address Removed!", + }); + } + + function onError(error) { + console.log(error); + setMainError({ + type: "error", + message: `An error occured. Please try again. ${error}`, + }); + } + + const toggleSnackbar = useCallback(() => { + setTimeout(() => { + setMainError({}); + }, 200); + }, []); + + return ( + + + {isProfile ? ( + + + {showDetail ? ( + + ) : ( + <> + + {profile?.addresses?.map((item, index) => { + const isSelected = item._id === selectedAddress?._id; + return ( + + + { + setSelectedAddress(item); + setMainError({ + type: "success", + message: "Address Selected", + }); + close && close(); + }} + className={clsx( + classes.width100, + classes.deliveryPaperProfile + )} + > + + + + + {item.deliveryAddress} + + + + + + + + + + + + ); + })} + + + + {!showDetail && ( + + )} + + + )} + + + ) : ( + + + + + + + + + + + Delivery Details + + + + + {t("deliveryAddress")} + + {!showDetail && ( + + )} + + {showDetail ? ( + + ) : ( + + {profile?.addresses?.map((item, index) => { + const isSelected = item._id === selectedAddress?._id; + return ( + + setSelectedAddress(item)} + className={clsx( + classes.width100, + classes.deliveryPaper + )} + > + + + + + + + + + + + {item.deliveryAddress} + + + + {item.details} + + + + + ); + })} + + )} + + + )} + + + + ); +} + +export default React.memo(DeliveryCard); diff --git a/enatega-multivendor-web/src/components/Checkout/OrderOption.js b/enatega-multivendor-web/src/components/Checkout/OrderOption.js new file mode 100644 index 0000000..292fae8 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/OrderOption.js @@ -0,0 +1,470 @@ +import { + Box, + Typography, + useTheme, + Dialog, + useMediaQuery, + IconButton, + Button, + Divider, +} from "@mui/material"; +import React, { useState } from "react"; +import useStyle from "./styles"; +import CloseIcon from "@mui/icons-material/Close"; +import moment from "moment"; +import { useTranslation } from 'react-i18next'; +import Calendar from "react-calendar"; +import "react-calendar/dist/Calendar.css"; + + +function OrderOption(props) { + const theme = useTheme(); + const classes = useStyle(); + const { + setIsPickUp, + selectedDate, + handleDateChange, + setOrderOptionModal, + orderOptionModal, + isPickUp, + } = props; + const [timeType, setTimeType] = useState("PM"); + const { t } = useTranslation() + const extraSmall = useMediaQuery(theme.breakpoints.down("md")); + const [calModal, setCalModal] = useState(false); + const [timeModal, setTimeModal] = useState(false); + const [minutes, setMinutes] = useState(new Date().getMinutes()); + const [hours, setHours] = useState(new Date().getHours() % 12 || 12); + const [date, setDate] = useState(selectedDate); + + const toggleCalModal = () => { + setCalModal((prev) => !prev); + }; + const toggleTimeModal = () => { + setTimeModal((prev) => !prev); + }; + + return ( + <> + setOrderOptionModal((prev) => !prev)} + open={orderOptionModal} + scroll="body" + PaperProps={{ + style: { + borderRadius: 30, + overflowY: "visible", + padding: theme.spacing(4), + }, + }} + > + + setOrderOptionModal((prev) => !prev)} + className={classes.closeContainer} + > + + + + + { + setIsPickUp(false); + }} + display="flex" + justifyContent="center" + alignItems="center" + style={{ + backgroundColor: !isPickUp + ? theme.palette.common.black + : "transparent", + + padding: 10, + borderRadius: 20, + flexBasis: "50%", + }} + > + + {t('deliver')} + + + { + setIsPickUp(true); + }} + display="flex" + justifyContent="center" + alignItems="center" + style={{ + backgroundColor: isPickUp + ? theme.palette.common.black + : "transparent", + padding: 10, + flexBasis: "50%", + borderRadius: 20, + }} + > + + {t('pickup')} + + + + + + {moment(selectedDate).format("HH:mm A")} + + + + {moment(selectedDate).format("DD-mm-yyyy")} + + + + + + + + + + ); +} + +function CalendarComponent({ + calModal, + toggleCalModal, + handleDateChange, + selectedDate, + toggleTimeModal, + setDate, +}) { + const theme = useTheme(); + const { t } = useTranslation() + const extraSmall = useMediaQuery(theme.breakpoints.down("md")); + const classes = useStyle(); + return ( + + + + + + + + { + setDate(new Date(e).getDate()) + }} + value={selectedDate} + tileClassName={classes.tile} + className={classes.cal} + /> + + + + + + ); +} + +function TimeComponent({ + timeModal, + handleDateChange, + toggleTimeModal, + setTimeType, + timeType, + minutes, + hours, + setMinutes, + setHours, + date, +}) { + const theme = useTheme(); + const { t } = useTranslation() + const extraSmall = useMediaQuery(theme.breakpoints.down("md")); + const classes = useStyle(); + const handleHours = (e) => { + const regex = /^[0-9\b]+$/; + if ( + (e.target.value.match(regex) && e.target.value <= 11) || + e.target.value.length < 1 + ) { + setHours(e.target.value); + } + }; + const handleMinutes = (e) => { + const regex = /^[0-9\b]+$/; + if ( + (e.target.value.match(regex) && e.target.value <= 59) || + e.target.value.length < 1 + ) { + setMinutes(e.target.value); + } + }; + + const handleDate = (h, m) => { + if (timeType === "PM") { + h = parseInt(h) + 12; + } + const newDate = new Date(date); + newDate.setHours(h); + newDate.setMinutes(m); + handleDateChange(newDate); + }; + return ( + + + + + + + + {t('selectTime')} + + + + + + + + : + + + + + + + + + setTimeType("AM")} + > + + {t('am')} + + + setTimeType("PM")} + > + + {t('pm')} + + + + + + + + + ); +} +export default React.memo(OrderOption); diff --git a/enatega-multivendor-web/src/components/Checkout/PaymentCard.js b/enatega-multivendor-web/src/components/Checkout/PaymentCard.js new file mode 100644 index 0000000..fcf7177 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/PaymentCard.js @@ -0,0 +1,232 @@ +import { + Box, + Button, + ButtonBase, + CircularProgress, + Container, + Divider, + Paper, + Radio, + Typography, + useTheme, +} from "@mui/material"; +import React, { useContext } from "react"; +import { ReactComponent as CodIcon } from "../../assets/icons/bill_cash.svg"; +import { ReactComponent as MastercardIcon } from "../../assets/icons/master_card.svg"; +import { ReactComponent as PayPalIcon } from "../../assets/icons/paypal_icon.svg"; +import { ReactComponent as VisaIcon } from "../../assets/icons/visa_icon.svg"; +import { ReactComponent as Payment } from "../../assets/icons/payment_method.svg"; +import useStyles from "./styles"; +import UserContext from "../../context/User"; +import ConfigurationContext from "../../context/Configuration"; +import { useTranslation } from "react-i18next"; + +/*const PAYMENT_OPTIONS = [ + { + id: 0, + payment: "STRIPE", + label: "Credit / Debit Card", + icon: , + icon1: , + }, + { + id: 1, + payment: "PAYPAL", + label: "Paypal", + icon: , + }, + { + id: 2, + payment: "COD", + label: "Cash", + icon: , + }, +];*/ + +function PaymentCard({ + paymentMethod, + setPaymentMethod, + validateOrder, + onPayment, + loading, + calculateTotal, +}) { + const { t } = useTranslation(); + const PAYMENT_OPTIONS = [ + { + id: 0, + payment: "STRIPE", + label: t("creditDebitCard"), + icon: , + icon1: , + }, + { + id: 1, + payment: "PAYPAL", + label: t("paypal"), + icon: , + }, + { + id: 2, + payment: "COD", + label: t("cash"), + icon: , + }, + ]; + const theme = useTheme(); + const classes = useStyles(); + const { cart } = useContext(UserContext); + const configuration = useContext(ConfigurationContext); + + return ( + <> + + + + + + + + {t("paymentMethod")} + + + + + {PAYMENT_OPTIONS.map((item, index) => ( + setPaymentMethod(item)} + > + + setPaymentMethod(item)} + /> + + + {item.label} + + + {item.icon} + {item.icon1 && ( + <> + + {item.icon1} + + )} + + + + + ))} + + + + + + + {`${configuration.currencySymbol} ${calculateTotal()}`} + + + {cart && cart.length} + + + + + ); +} + +export default PaymentCard; diff --git a/enatega-multivendor-web/src/components/Checkout/PersonalCard.js b/enatega-multivendor-web/src/components/Checkout/PersonalCard.js new file mode 100644 index 0000000..c966a7c --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/PersonalCard.js @@ -0,0 +1,179 @@ +import { + Box, + Button, + Container, + Paper, + Typography, + useTheme, + Divider, +} from "@mui/material"; +import React, { useContext } from "react"; +import UserContext from "../../context/User"; +import useStyle from "./styles"; +import LocationOnIcon from "@mui/icons-material/LocationOn"; +import { useTranslation } from 'react-i18next'; + +function PersonalCard({ toggleModal, location }) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyle(); + const { profile } = useContext(UserContext); + + return ( + <> + + + + + + + + {t('contactInfo')} + + + + + + + + + {t('name')} : + + + {profile?.name ?? ".."} + + + + + {t('email')} : + + + {profile?.email ?? ""} + + + + + {t('phone')} : + + + {profile?.phone ?? ""} + + + + + + {t('address')}: + + + {location?.deliveryAddress.split(",")[0] ?? ""} + + + + + + + + + + ); +} + +export default React.memo(PersonalCard); diff --git a/enatega-multivendor-web/src/components/Checkout/Voucher.js b/enatega-multivendor-web/src/components/Checkout/Voucher.js new file mode 100644 index 0000000..1ecd2a5 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/Voucher.js @@ -0,0 +1,125 @@ +import { + Box, + Dialog, + IconButton, + Typography, + useMediaQuery, + useTheme, + Grid, + TextField, + Button, + CircularProgress, +} from "@mui/material"; +import React from "react"; +import useStyles from "./styles"; +import CloseIcon from "@mui/icons-material/Close"; +import { ReactComponent as VoucherImage } from "../../assets/images/voucher.svg"; +import { useTranslation } from 'react-i18next'; + +function Voucher({ + isVisible, + toggleModal, + couponError, + couponText, + setCouponText, + couponLoading, + mutateVoucher, +}) { + const theme = useTheme(); + const classes = useStyles(); + const extraSmall = useMediaQuery(theme.breakpoints.down("md")); + const { t } = useTranslation() + + return ( + + + + + + + + + {t('applyAVoucher')} + + + + + + + { + setCouponText(e.target.value); + }} + InputProps={{ + className: classes.inputprops, + }} + InputLabelProps={{ + style: { + fontSize: "14px", + }, + }} + /> + + + + + + + + + + ); +} + +export default Voucher; diff --git a/enatega-multivendor-web/src/components/Checkout/index.js b/enatega-multivendor-web/src/components/Checkout/index.js new file mode 100644 index 0000000..134ec23 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/index.js @@ -0,0 +1,7 @@ +import CartItemCard from "./CartItemCard"; +import DeliveryCard from "./DeliveryCard"; +import PaymentCard from "./PaymentCard"; +import PersonalCard from "./PersonalCard"; +import OrderOption from "./OrderOption"; + +export { CartItemCard, DeliveryCard, PaymentCard, PersonalCard, OrderOption }; diff --git a/enatega-multivendor-web/src/components/Checkout/styles.js b/enatega-multivendor-web/src/components/Checkout/styles.js new file mode 100644 index 0000000..b4c3937 --- /dev/null +++ b/enatega-multivendor-web/src/components/Checkout/styles.js @@ -0,0 +1,313 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + "& .MuiButton-contained": { + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + }, + flex: { + flex: 1, + }, + width100: { + width: "100%", + }, + PH1: { + padding: theme.spacing(0, 1), + }, + PB2: { + paddingBottom: theme.spacing(2), + }, + PT2: { + paddingTop: theme.spacing(2), + }, + MV1: { + margin: theme.spacing(1, 0), + }, + MV2: { + margin: theme.spacing(2, 0), + }, + smallText: { + fontSize: "0.875rem", + }, + wieght300: { + fontWeight: 300, + }, + disableText: { + color: theme.palette.text.disabled, + }, + boldText: { + fontWeight: theme.typography.fontWeightBold, + }, + deliveryPaper: { + background: theme.palette.common.white, + boxShadow: theme.shadows[0], + cursor: "pointer", + }, + shadow: { + boxShadow: theme.shadows[0], + }, + deliveryPaperProfile: { + background: theme.palette.primary.main, + borderRadius: 10, + cursor: "pointer", + border: "none", + }, + containerBox: { + background: theme.palette.common.white, + padding: theme.spacing(2, 0), + }, + + redBox: { + display: "flex", + alignItems: "center", + justifyContent: "center", + width: "32px", + height: "32px", + backgroundColor: theme.palette.primary.main, + }, + totalSmall: { + fontSize: ".7rem", + display: "flex", + alignItems: "flex-end", + }, + textContainer: { + minWidth: "75%", + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + }, + tipRow: { + "& .MuiButton-root.MuiButton-outlined": { + borderRadius: "0px", + margin: theme.spacing(0, 1), + backgroundColor: "transparent", + "& .MuiButton-label": { + color: theme.palette.text.secondary, + }, + "&:hover": { + backgroundColor: theme.palette.primary.main, + color: theme.palette.text.primary, + "& .MuiButton-label": { + color: theme.palette.primary.main, + }, + borderColor: theme.palette.primary.main, + }, + }, + "& .MuiButton-root.MuiButton-contained": { + borderRadius: "0px", + margin: theme.spacing(0, 1), + backgroundColor: theme.palette.primary.main, + "& .MuiButton-label": { + color: theme.palette.text.primary, + }, + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + }, + + inputprops: { + ...theme.typography.subtitle1, + backgroundColor: theme.palette.grey[200], + borderRadius: 30, + }, + couponBtn: { + padding: theme.spacing(1, 0), + alignSelf: "flex-end", + width: 200, + borderRadius: 20, + margin: theme.spacing(2, 0), + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + addressBox: { + boxShadow: theme.shadows[5], + paddingBottom: theme.spacing(2), + }, + deliveryBox: { + border: `1px solid ${theme.palette.grey[300]}`, + }, + selectedDeliveryBox: { + borderColor: theme.palette.primary.main, + }, + wieght600: { + fontWeight: 6000, + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + paymentInfoBtn: { + width: "100%", + height: "100%", + justifyContent: "space-between", + padding: theme.spacing(1), + marginTop: theme.spacing(4), + }, + link: { + textDecoration: "none", + }, + saveBtn: { + backgroundColor: theme.palette.secondary.darkest, + width: 120, + borderRadius: 10, + padding: 0, + opacity: 1, + transition: "opacity 0.3s", + "&:hover": { + backgroundColor: theme.palette.secondary.darkest, + opacity: 0.7, + }, + }, + largeText: { + fontSize: "1.775rem", + fontWeight: 800, + }, + infoText: { + ...theme.typography.body1, + color: theme.palette.text.disabled, + }, + subtotalText: { + ...theme.typography.body1, + fontSize: "0.875rem", + }, + + mobileCartText: { + width: "130px", + fontWeight: 100, + }, + whiteText: { + color: theme.palette.common.white, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + mediumFont: { + fontSize: "1rem", + }, + smallFont: { + fontSize: "0.875rem", + }, + checkoutText: { + ...theme.typography.h6, + fontWeight: 700, + fontSize: "0.875rem", + }, + totalText: { + ...theme.typography.body1, + fontSize: "0.875rem", + fontWeight: 700, + color: theme.palette.text.secondary, + }, + itemTextStyle: { + ...theme.typography.body1, + color: theme.palette.primary.main, + fontWeight: 700, + }, + optionTextStyle: { + ...theme.typography.body1, + color: theme.palette.primary.main, + }, + border: { + borderBottom: `1px solid ${theme.palette.grey[500]}`, + }, + darkGreen: { + color: theme.palette.button.main, + }, + closeContainer: { + position: "absolute", + background: "black", + top: theme.spacing(-1), + right: theme.spacing(-1), + "&:hover": { + backgroundColor: "black", + }, + }, + addressBtn: { + padding: theme.spacing(1, 0), + alignSelf: "flex-end", + width: 200, + borderRadius: 20, + margin: theme.spacing(2, 0), + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + timeContainer: { + backgroundColor: theme.palette.grey[200], + display: "flex", + justifyContent: "center", + alignItems: "center", + padding: "20px", + marginTop: "10px", + marginBottom: "10px", + //marginRight: "50px", + borderRadius: 20, + flexDirection: "column", + }, + divider: { + backgroundColor: theme.palette.common.black, + width: "85%", + height: "0.5px", + }, + btn: { + width: 120, + borderRadius: 20, + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + whiteBox: { + background: theme.palette.common.white, + borderRadius: 10, + padding: 10, + }, + textInput: { + border: "none", + width: "70px", + textAlign: "center", + height: "70px", + fontSize: "3rem", + }, + cal: { + background: theme.palette.grey[200], + borderRadius: 10, + color: "black", + "& .react-calendar__tile--active": { + background: theme.palette.primary.main, + color: "black", + borderRadius: 10, + }, + "& .react-calendar__navigation button": { + fontWeight: 700, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/FlashMessage/index.js b/enatega-multivendor-web/src/components/FlashMessage/index.js new file mode 100644 index 0000000..d3ed31e --- /dev/null +++ b/enatega-multivendor-web/src/components/FlashMessage/index.js @@ -0,0 +1,25 @@ +import React from "react"; +import Snackbar from "@mui/material/Snackbar"; +import { IconButton } from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; + +function FlashMessage(props) { + return ( + + + + } + > + + ); +} + +export default FlashMessage; diff --git a/enatega-multivendor-web/src/components/Footer/Footer.js b/enatega-multivendor-web/src/components/Footer/Footer.js new file mode 100644 index 0000000..e1c4b19 --- /dev/null +++ b/enatega-multivendor-web/src/components/Footer/Footer.js @@ -0,0 +1,257 @@ +import { + Box, + Divider, + Typography, + Grid, + useTheme, + useMediaQuery, +} from "@mui/material"; +import React, { useEffect } from "react"; +import { Link as RouterLink, useLocation } from "react-router-dom"; +import TwitterIcon from "@mui/icons-material/Twitter"; +import GitHubIcon from "@mui/icons-material/GitHub"; +import FacebookIcon from "@mui/icons-material/Facebook"; +import InstagramIcon from "@mui/icons-material/Instagram"; +import LinkedInIcon from "@mui/icons-material/LinkedIn"; +import { useTranslation } from "react-i18next"; + +import useStyles from "./styles"; + +function Footer() { + const { t } = useTranslation(); + const classes = useStyles(); + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + const location = useLocation(); + + const redirectHandler = (link) => { + window.open(link, "_blank"); + }; + + useEffect(() => { + window.scrollTo(0, 0); + }, [location.pathname]); + + const handleButtonClick = () => { + try { + window.scrollTo({ top: 0, behavior: 'smooth' }); + } catch (error) { + console.error("Smooth scroll failed", error); + // Fallback to instant scroll + window.scrollTo(0, 0); + } + }; + + + return ( + + + + + Enatega + + + {t("footerText")} + + + + + + + {t("linksTitle")} + + + + {t("footerLinkHome")} + + + + + {t("footerLinkPP")} + + + + + {t("footerLinkTC")} + + + + + + {t("footerEndText")} + + + + + + {t("followUs")} + + + redirectHandler("https://www.facebook.com/enatega/")} + > + + + redirectHandler("https://twitter.com/NinjasCode1")} + > + + + + redirectHandler("https://www.instagram.com/enatega.nb/") + } + > + + + + redirectHandler("https://www.linkedin.com/company/14583783") + } + > + + + + redirectHandler( + "https://github.com/Ninjas-Code-official/Marketplace-Food-Delivery-Solution" + ) + } + > + + + + + {t("poweredBy")}{" "} + + redirectHandler("https://ninjascode.com/")} + style={{ + display: "inline-block", + cursor: "pointer", + marginTop: "30px", + }} + > + + ninjascode + + + + + + {t("footerEndText")} + + + + ); +} + +export default Footer; diff --git a/enatega-multivendor-web/src/components/Footer/styles.js b/enatega-multivendor-web/src/components/Footer/styles.js new file mode 100644 index 0000000..ef7db04 --- /dev/null +++ b/enatega-multivendor-web/src/components/Footer/styles.js @@ -0,0 +1,26 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => { + return { + left: { + backgroundColor: theme.palette.common.black, + padding: "3rem", + borderRadius: 80, + [theme.breakpoints.down("md")]: { + padding: "3rem", + }, + }, + iconContainer: { + backgroundColor: theme.palette.common.black, + width: 40, + height: 40, + borderRadius: "50%", + display: "flex", + justifyContent: "center", + alignItems: "center", + cursor: "pointer", + }, + }; +}); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Header/Header.js b/enatega-multivendor-web/src/components/Header/Header.js new file mode 100644 index 0000000..30d4d2f --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/Header.js @@ -0,0 +1,82 @@ +import { useMediaQuery, useTheme } from "@mui/material"; +import React, { useContext } from "react"; +import UserContext from "../../context/User"; +import DHeader from "./desktop.header"; +import Analytics from "../../utils/analytics"; +import { useTranslation } from 'react-i18next'; + +const TITLE = "Enatega"; +const NAME = "..."; +/*const NAVITEMS = [ + { + title: "My orders", + link: "/orders", + }, + { + title: "Profile", + link: "/profile", + }, + { + title: "Logout", + link: "/login", + }, + { + title: "Settings", + link: "/settings", + }, +];*/ +const savedLanguage = localStorage.getItem('enatega-language'); + console.log('Saved language in localStorage:', savedLanguage); +function Header() { + const { t } = useTranslation(); + const NAVITEMS = [ + { + title: t('titleOrders'), + link: "/orders", + }, + { + title: t('titleProfile'), + link: "/profile", + }, + { + title: t('titleSettings'), + link: "/settings", + }, + { + title: t('titleLogout'), + link: "/login", + }, + ]; + const theme = useTheme(); + const { logout, loadingProfile, profile, cartCount } = + useContext(UserContext); + const mobile = useMediaQuery(theme.breakpoints.down("sm")); + const [anchorEl, setAnchorEl] = React.useState(null); + + const handleOpen = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = async (route) => { + if (route === t('titleLogout')) { + logout(); + await Analytics.track(Analytics.events.USER_LOGGED_OUT); + await Analytics.identify(null, null); + } + setAnchorEl(null); + }; + return ( + + ); +} + +export default React.memo(Header); diff --git a/enatega-multivendor-web/src/components/Header/LoginHeader/DesktopHeader.js b/enatega-multivendor-web/src/components/Header/LoginHeader/DesktopHeader.js new file mode 100644 index 0000000..b26171f --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/LoginHeader/DesktopHeader.js @@ -0,0 +1,74 @@ +import { Box, Divider } from "@mui/material"; +import AppBar from "@mui/material/AppBar"; +import Button from "@mui/material/Button"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import React from "react"; +import { Link as RouterLink, useLocation } from "react-router-dom"; +import useStyle from "./styles"; +import { ReactComponent as Logo } from "../../../assets/images/logo.svg"; +import { useTheme } from "@emotion/react"; +import LocalMallIcon from "@mui/icons-material/LocalMall"; +import PersonIcon from "@mui/icons-material/Person"; +import { useTranslation } from "react-i18next"; + +function LoginDesktopHeader({ title, showIcon, showCart = false }) { + const { t } = useTranslation(); + const classes = useStyle(); + const theme = useTheme(); + const location = useLocation(); + return ( + + + + + + + {title} + + + + {showIcon && ( + <> + + + + + + + )} + {showCart && ( + + + + + + )} + + + + ); +} + +export default React.memo(LoginDesktopHeader); diff --git a/enatega-multivendor-web/src/components/Header/LoginHeader/LoginHeader.js b/enatega-multivendor-web/src/components/Header/LoginHeader/LoginHeader.js new file mode 100644 index 0000000..04bf933 --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/LoginHeader/LoginHeader.js @@ -0,0 +1,27 @@ +import React from "react"; +import { useLocation } from "react-router"; +import LoginDesktopHeader from "./DesktopHeader"; + +const TITLE = "Enatega"; + +const REGISTRATION_PATH = [ + "/login", + "/new-login", + "/registration", + "/login-email", + "/forgot-password", + "/email-sent", + "/phone-number", + "/verify-email" +]; + +function Header({ showIcon = false }) { + const location = useLocation(); + const showCart = !REGISTRATION_PATH.includes(location.pathname); + + return ( + + ); +} + +export default React.memo(Header); diff --git a/enatega-multivendor-web/src/components/Header/LoginHeader/MobileHeader.js b/enatega-multivendor-web/src/components/Header/LoginHeader/MobileHeader.js new file mode 100644 index 0000000..83d2b94 --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/LoginHeader/MobileHeader.js @@ -0,0 +1,25 @@ +import { Box } from "@mui/material"; +import AppBar from "@mui/material/AppBar"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import React from "react"; +import { Link as RouterLink } from "react-router-dom"; +import useStyles from "./styles"; + +function LoginMobileHeader({ title, showCart }) { + const classes = useStyles(); + return ( + + + + + + {title} + + + + + ); +} + +export default React.memo(LoginMobileHeader); diff --git a/enatega-multivendor-web/src/components/Header/LoginHeader/styles.js b/enatega-multivendor-web/src/components/Header/LoginHeader/styles.js new file mode 100644 index 0000000..7e01f5e --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/LoginHeader/styles.js @@ -0,0 +1,41 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + flex: { + display: "flex", + minHeight: "64px", + }, + toolbar: { + display: "flex", + justifyContent: "space-between", + backgroundColor: theme.palette.primary.light, + }, + font700: { + fontWeight: 700, + }, + ml: { + marginLeft: "8px", + }, + userTitle: { + marginLeft: "8px", + textTransform: "uppercase", + }, + linkDecoration: { + textDecoration: "none", + alignSelf: "center", + display: "flex", + flexDirection: "row", + alignItems: "center", + }, + imageIcon: { + height: "50px", + width: "10px", + }, + iconRoot: { + textAlign: "center", + height: "100%", + display: "inline-flex", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Header/desktop.header.js b/enatega-multivendor-web/src/components/Header/desktop.header.js new file mode 100644 index 0000000..c0808b4 --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/desktop.header.js @@ -0,0 +1,167 @@ +import { Box, Divider, Menu, MenuItem, useTheme } from "@mui/material"; +import AppBar from "@mui/material/AppBar"; +import Button from "@mui/material/Button"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import ExpandLessIcon from "@mui/icons-material/ExpandLess"; +import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; +import React from "react"; +import { Link as RouterLink, useLocation } from "react-router-dom"; +import useStyle from "./styles"; +import FavoriteIcon from "@mui/icons-material/Favorite"; +import { ReactComponent as PersonIcon } from "../../assets/icons/user.svg"; +import { ReactComponent as FavoriteBorderIcon } from "../../assets/icons/favourite.svg"; +import { ReactComponent as LocalMallIcon } from "../../assets/icons/cart.svg"; + +import { ReactComponent as Logo } from "../../assets/images/logo.svg"; + +function DHeader({ + navitems, + title, + close, + open, + anchor, + name, + favLength = 0, + cartCount = 0, + mobile, +}) { + const theme = useTheme(); + const classes = useStyle(); + const location = useLocation(); + return ( + + + + + + + {title} + + + + + + + {navitems.map((item, index) => ( + + + close(item.title)} + > + + {item.title} + + + + + ))} + + + + + {favLength > 0 ? ( + + ) : ( + + )} + + + {cartCount && ( + <> + + + + + + {cartCount} + + + + + )} + + + + + ); +} + +export default React.memo(DHeader); diff --git a/enatega-multivendor-web/src/components/Header/index.js b/enatega-multivendor-web/src/components/Header/index.js new file mode 100644 index 0000000..8e9d7f2 --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/index.js @@ -0,0 +1,4 @@ +import Header from "./Header"; +import LoginHeader from "./LoginHeader/LoginHeader"; + +export { Header, LoginHeader }; diff --git a/enatega-multivendor-web/src/components/Header/mobile.header.js b/enatega-multivendor-web/src/components/Header/mobile.header.js new file mode 100644 index 0000000..5478c70 --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/mobile.header.js @@ -0,0 +1,95 @@ +import { + Box, + Divider, + Menu, + MenuItem, + MenuList, + useTheme, +} from "@mui/material"; +import AppBar from "@mui/material/AppBar"; +import Button from "@mui/material/Button"; +import Toolbar from "@mui/material/Toolbar"; +import Typography from "@mui/material/Typography"; +import React from "react"; +import { Link as RouterLink } from "react-router-dom"; +import CartIcon from "../../assets/icons/CartIcon"; +import HeartIcon from "../../assets/icons/HeartIcon"; +import HeartActiveIcon from "../../assets/icons/HeartActiveIcon"; +import ProfileIcon from "../../assets/icons/ProfileIcon"; +import useStyles from "./styles"; + +function MHeader({ + navitems, + title, + close, + open, + anchor, + favLength = 0, + cartCount = 0, +}) { + const theme = useTheme(); + const classes = useStyles(); + return ( + + + + + + {navitems.map((item, index) => ( + + close(item.title)} + > + + + {item.title} + + + + {index === 2 && } + + ))} + + + + + {title} + + + + + + {favLength > 0 ? : } + + + {cartCount && ( + + + + )} + + + + ); +} + +export default React.memo(MHeader); diff --git a/enatega-multivendor-web/src/components/Header/styles.js b/enatega-multivendor-web/src/components/Header/styles.js new file mode 100644 index 0000000..dfcc8cb --- /dev/null +++ b/enatega-multivendor-web/src/components/Header/styles.js @@ -0,0 +1,62 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + flex: { + display: "flex", + minHeight: "64px", + }, + toolbar: { + display: "flex", + justifyContent: "space-between", + backgroundColor: theme.palette.primary.light, + borderBottomLeftRadius: 15, + borderBottomRightRadius: 15, + }, + font700: { + fontWeight: 700, + }, + ml: { + marginLeft: "8px", + }, + userTitle: { + marginLeft: "8px", + textTransform: "uppercase", + }, + menu: { + marginTop: theme.spacing(3), + }, + menuItem: { + padding: "14px 40px", + width: "100%", + borderTop: "1px solid #737373", + "& .MuiTouchRipple-root span": { + backgroundColor: "rgba(0,0,0,0.3)", + }, + }, + linkDecoration: { + textDecoration: "none", + alignSelf: "center", + display: "flex", + flexDirection: "row", + alignItems: "center", + }, + cartText: { + marginLeft: 2, + fontWeight: 700, + }, + imageIcon: { + height: "100%", + display: "inline-flex", + backgroundColor: "red", + }, + iconRoot: { + textAlign: "center", + height: "50px", + width: "50px", + }, + icon: { + color: theme.palette.common.black, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/HomeScreen/AppComponent/index.js b/enatega-multivendor-web/src/components/HomeScreen/AppComponent/index.js new file mode 100644 index 0000000..e2fc6e7 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/AppComponent/index.js @@ -0,0 +1,113 @@ +import React from "react"; +import { + Box, + Typography, + Button, + useTheme, + useMediaQuery, +} from "@mui/material"; +import PlayStore from "../../../assets/images/play-store.png"; +import AppStore from "../../../assets/images/app-store.png"; +import Banner2 from "../../../assets/images/banner-2.png"; +import Banner1 from "../../../assets/images/banner-1.png"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +export default function AppComponent() { + const { t } = useTranslation() + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + const medium = useMediaQuery(theme.breakpoints.down("lg")); + const classes = useStyles(); + return ( + + + APP + + + + {t('putUsInYourPocket')} + + + {t('containerText')} + + {medium && ( + + + banner2 + + + banner1 + + + )} + + + + {" "} + + + ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/AppComponent/styles.js b/enatega-multivendor-web/src/components/HomeScreen/AppComponent/styles.js new file mode 100644 index 0000000..61f1cb0 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/AppComponent/styles.js @@ -0,0 +1,63 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + container: { + backgroundColor: theme.palette.primary.main, + minHeight: 300, + borderRadius: 40, + display: "flex", + zIndex: 999, + position: "relative", + }, + fontContainer: { + fontWeight: 400, + marginTop: 10, + maxWidth: "340px", + fontSize: "15px", + marginRight: "2%", + }, + btn: { + backgroundColor: theme.palette.button.main, + color: theme.palette.common.white, + "&:hover": { + backgroundColor: theme.palette.button.main, + }, + }, + img2: { + height: "auto", + maxWidth: "100%", + marginTop: "3rem", + width: 220, + }, + img1: { + maxWidth: "100%", + height: "auto", + width: 220, + }, + bgText: { + position: "absolute", + top: -130, + left: -30, + fontSize: 150, + fontWeight: 500, + + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + zIndex: -99999, + }, + bgTextSmall: { + position: "absolute", + top: -70, + left: -20, + fontSize: 100, + fontWeight: 500, + + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + zIndex: -99999, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/Blogs/index.js b/enatega-multivendor-web/src/components/HomeScreen/Blogs/index.js new file mode 100644 index 0000000..2b2f286 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/Blogs/index.js @@ -0,0 +1,154 @@ +import React from "react"; +import { + Box, + Divider, + Typography, + Grid, + Button, + useTheme, + useMediaQuery, +} from "@mui/material"; +import Blog1 from "../../../assets/images/blog1.png"; +import Blog2 from "../../../assets/images/blog2.png"; +import { useTranslation } from "react-i18next"; + +export default function Blogs() { + const { t } = useTranslation(); + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("md")); + return ( + + + + + + + + + + + + + + + ); +} + +function BlogComponent({ title, desc }) { + const { t } = useTranslation(); + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + + return ( + + + + + blog1 + + + + {title} + + + + + {desc} + + + + + + + + + + + ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/CaseStudy/index.js b/enatega-multivendor-web/src/components/HomeScreen/CaseStudy/index.js new file mode 100644 index 0000000..e334b2a --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/CaseStudy/index.js @@ -0,0 +1,129 @@ +import React from "react"; +import Curve from "../../../assets/images/curve.png"; +import EasyEats from "../../../assets/images/easy-eats.png"; + +import { + Box, + Typography, + Button, + useTheme, + useMediaQuery, +} from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + bgText: { + position: "absolute", + bottom: -90, + right: 0, + fontSize: 80, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, + bgTextSmall: { + position: "absolute", + bottom: -100, + right: 0, + fontSize: 30, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, +})); + +export default function CaseStudy() { + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("md")); + const classes = useStyle(); + + return ( + +
+ + Case Study + + curve + + + + Easy Eats + + + We bring great food to
your dorm. +
+
+ + +
+ + easy-eats + +
+
+ ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/index.js b/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/index.js new file mode 100644 index 0000000..c0f4da4 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/index.js @@ -0,0 +1,136 @@ +import { + Typography, + Box, + Button, + useTheme, + useMediaQuery, +} from "@mui/material"; +import useStyle from "./styles"; +import AppStore from "../../../assets/images/AppVector.png"; +import Vector from "../../../assets/images/Vector.png"; +import Demo from "../../../assets/images/demo.png"; +import { useTranslation } from "react-i18next"; + +export default function CategoryCards({ + title, + description, + image, + web, + link, + isMobile, + android, + ios, +}) { + const { t } = useTranslation(); + const classes = useStyle(); + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + return ( + + {!web ? ( + apps + ) : ( + apps + )} + + + + {title} + + + + + + + {description[0]} + + + {description[1]} + +
+
+ {isMobile ? ( + + + + + ) : ( + + + + )} +
+
+ ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/styles.js b/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/styles.js new file mode 100644 index 0000000..fcc11ea --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/CategoryCards/styles.js @@ -0,0 +1,57 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + container: { + width: "340px", + height: "300px", + display: "flex", + position: "relative", + flexDirection: "column", + justifyContent: "center", + marginBottom: "10px", + [theme.breakpoints.down("md")]: { + width: "260px", + }, + }, + top: { + height: "45%", + backgroundColor: theme.palette.common.white, + display: "flex", + justifyContent: "center", + alignItems: "flex-end", + borderTopLeftRadius: 30, + borderTopRightRadius: 30, + }, + bottom: { + height: "55%", + backgroundColor: "#3C8F7C", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + borderBottomLeftRadius: 30, + borderBottomRightRadius: 30, + }, + image: { + position: "absolute", + top: "-50%", + left: "50%", + padding: 0, + margin: 0, + transform: "translate(-50%, 30%)", + width: 90, + height: "auto", + }, + imageWeb: { + position: "absolute", + top: "-50%", + left: "50%", + padding: 0, + margin: 0, + transform: "translate(-50%, 30%)", + width: "225px", + height: "auto", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/Contact/index.js b/enatega-multivendor-web/src/components/HomeScreen/Contact/index.js new file mode 100644 index 0000000..8e9f931 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/Contact/index.js @@ -0,0 +1,308 @@ +import React, { useRef, useState } from "react"; +import { + Box, + Grid, + TextField, + Typography, + useTheme, + useMediaQuery, + Button, + CircularProgress, +} from "@mui/material"; +import useStyles from "./styles"; +import { ReactComponent as WhatsAppIcon } from "../../../assets/icons/whatsapp.svg"; +import { ReactComponent as EmailIcon } from "../../../assets/icons/email.svg"; +import { ReactComponent as LocationOnIcon } from "../../../assets/icons/location.svg"; +import { gql, useMutation } from "@apollo/client"; +import { sendFormSubmission } from "../../../apollo/server"; +import FlashMessage from "../../FlashMessage"; + +const SEND_FORM_SUBMISSION = gql` + ${sendFormSubmission} +`; + +export default function Contact() { + const classes = useStyles(); + const formRef = useRef(null); + + const [nameError, setNameError] = useState(""); + const [emailError, setEmailError] = useState(""); + const [messageError, setMessageError] = useState(""); + const [formMessage, setFormMessage] = useState(""); + const [mutateForm, { loading: formLoading }] = useMutation( + SEND_FORM_SUBMISSION, + { + onError, + onCompleted, + } + ); + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + + function clearContactFields() { + formRef.current["name"].value = ""; + formRef.current["email"].value = ""; + formRef.current["message"].value = ""; + } + + function onError(error) { + console.log("Error while submitting form:", error); + setFormMessage(error.message); + } + + function onCompleted(data) { + console.log( + "Form Submission Successful Response:", + data.sendFormSubmission + ); + clearContactFields(); + setFormMessage(data.sendFormSubmission.message); + } + + const validateEmailAddress = () => { + const emailValue = formRef.current["email"].value; + const reEmail = /\S+@\S+\.\S+/; + if (reEmail.test(emailValue)) { + setEmailError(""); + return true; + } + setEmailError("Invalid Email format"); + return false; + }; + + const validateName = () => { + if (!!formRef.current["name"].value) { + setNameError(""); + return true; + } + setNameError("Name is not given"); + return false; + }; + + const validateMessage = () => { + if (!!formRef.current["message"].value) { + setMessageError(""); + return true; + } + setNameError("Message is not given"); + return false; + }; + + const handleFormSubmission = () => { + const [name, email, message] = [ + formRef.current["name"].value, + formRef.current["email"].value, + formRef.current["message"].value, + ]; + if (validateEmailAddress() && validateName() && validateMessage()) { + mutateForm({ + variables: { + name, + email, + message, + }, + }); + } + }; + + return ( + + setFormMessage("")} + /> + + + + + + + + + + (+92) 3339461270 + + + + + + + + sharan@ninjascode.com + + + + + + + + Islamabad, Pakistan + + + + + + + + Contact + +
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/Contact/styles.js b/enatega-multivendor-web/src/components/HomeScreen/Contact/styles.js new file mode 100644 index 0000000..3600ec9 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/Contact/styles.js @@ -0,0 +1,85 @@ +import makeStyles from "@mui/styles/makeStyles"; +import Info from "../../../assets/images/info-bg.png"; + +const useStyle = makeStyles((theme) => ({ + textField: { + width: "100%", + "& .MuiOutlinedInput-root": { + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + borderWidth: "1px", + }, + }, + }, + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + bgText: { + position: "absolute", + bottom: 0, + left: 0, + fontSize: 80, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, + bgTextSmall: { + position: "absolute", + top: 0, + right: 10, + fontSize: 50, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, + textArea: { + "& .MuiOutlinedInput-root": { + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + borderWidth: "1px", + }, + }, + }, + contactInfo: { + width: "80%", + margin: "auto", + backdropFilter: "blur(3px)", + borderRadius: "38px", + backgroundImage: `url(${Info})`, + backgroundSize: "cover", + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + }, + margin: { + marginTop: "4rem", + marginBottom: "4rem", + }, + contactIcon: { + display: "flex", + flexDirection: "column", + alignItems: "center", + }, + iconContainer: { + backgroundColor: theme.palette.common.black, + width: 40, + height: 40, + borderRadius: "40%", + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + bg: { + backgroundColor: "rgb(60 143 124 / 51%)", + width: "100%", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + minHeight: "460px", + borderRadius: "38px", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/FAQ/FAQ.js b/enatega-multivendor-web/src/components/HomeScreen/FAQ/FAQ.js new file mode 100644 index 0000000..0ff9e16 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/FAQ/FAQ.js @@ -0,0 +1,155 @@ +import { + Grid, + List, + ListItem, + ListItemIcon, + ListItemText, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import DoneIcon from "@mui/icons-material/Done"; +import React from "react"; +import useStyle from "./styles"; + +function FAQ() { + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down('md')); + const classes = useStyle(mobile); + return ( + + + + + + Order food online from the best restaurants and shops on Enatega + + + Are you hungry? Had a long and busy day? Then Enatega is the right place for you! Enatega, offers you a long + and detailed list of the best restaurants near you. Whether it is a delicious Pizza, Burger, Japanese + or any kind of Fast Food you are craving, Enatega has an extensive roaster restaurants available for you to{" "} + order food online with home delivery. + + + What's new? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Frequently Asked Questions + + + How can I get enatega delivery? + + + To get enatega delivery, simply locate the restaurants near you by typing in your address, browse through a + variety of restaurants and cuisines, check menus and prices, choose your dishes and add them to the basket. + Now you only need to checkout and make the payment. Soon your delicious food will arrive at your doorstep! + + + How can I order food? + + + To order food delivery, follow these simple steps: +

+ Find a restaurant. Enter your delivery address in the location form to see all the places that + deliver to your location. It can be your home, office, a hotel or even parks!
+ Choose your dishes. Browse the menu of the chosen restaurant, select your dishes and add them to + your basket. When you are done, press the "Checkout" button.
+ Checkout & Payment. Check your order, payment method selection and exact delivery address. Simply + follow the checkout instructions from there.
+ Delivery. We will send you an email and SMS confirming your order and delivery time. Sit back, + relax and wait for piping hot food to be conveniently delivered to you!.
+

+
+ + Does enatega deliver 24 hours? + + + Yes, enatega in Pakistan delivers 24 hours. However, many restaurants may be unavailable for a late night + delivery. Please check which places in Pakistan deliver to you 24 hours by using your address. + + + Can you pay cash for enatega? + + + Yes, you can pay cash on delivery for enatega in Pakistan. + + + How can I pay enatega online? + + + You can pay online while ordering at enatega Pakistan by using a credit or debit card or PayPal. + + + Can I order enatega for someone else? + + + Yes, enatega Pakistan allows you to place an order for someone else. During checkout, just update the name + and delivery address of the person you're ordering for. Please keep in mind that if the delivery details are + not correct and the order cannot be delivered, we won't be able to process a refund. + + + How much does enatega charge for delivery? + + + Delivery fee charged by enatega in Pakistan depends on many operational factors, most of all - location and + a restaurant you are ordering from. You can always check the delivery fee while forming your order. Besides, + you can filter the restaurants by clicking on "Free Delivery" icon on the top of your restaurants listing. + + + What restaurants let you order online? + + + There are hundreds of restaurants on enatega Pakistan that let you order online. For example, KFC, + McDonald's, Pizza Hut, OPTP, Hardee's, Domino's, Kababjees and many-many more! In order to check all the + restaurants near you that deliver, just type in your address and discover all the available places. + + + What restaurants let you order online? + + + There are hundreds of restaurants on enatega Pakistan that let you order online. For example, KFC, + McDonald's, Pizza Hut, OPTP, Hardee's, Domino's, Kababjees and many-many more! In order to check all the + restaurants near you that deliver, just type in your address and discover all the available places. + + + Does enatega have minimum order? + + + Yes, many restaurants have a minimum order. The minimum order value depends on the restaurant you order from + and is indicated during your ordering process. + +
+
+
+ ); +} + +export default React.memo(FAQ); diff --git a/enatega-multivendor-web/src/components/HomeScreen/FAQ/styles.js b/enatega-multivendor-web/src/components/HomeScreen/FAQ/styles.js new file mode 100644 index 0000000..372c56a --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/FAQ/styles.js @@ -0,0 +1,42 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyle = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + marginTop: "50px", + marginBottom: "120px", + }, + headingContainer: { + display: "flex", + }, + FAQTitle: { + fontWeight: "bold", + width: "100%", + }, + FAQAns: { + margin: theme.spacing(3, 0), + color: theme.palette.secondary.light, + fontWeight: "300", + width: "100%", + }, + btnTransparent: { + borderRadius: "0px", + backgroundColor: "transparent", + "&:hover": { + backgroundColor: theme.palette.secondary.main, + }, + }, + btnText: { + width: "100%", + fontWeight: "300", + textTransform: "none", + color: theme.palette.secondary.light, + }, + btnBase: { + borderRadius: "0px", + height: "55px", + marginRight: "10px", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/InfoBusiness.js b/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/InfoBusiness.js new file mode 100644 index 0000000..a57acb4 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/InfoBusiness.js @@ -0,0 +1,52 @@ +import { Button, Card, CardContent, Grid, Typography, useMediaQuery, useTheme } from "@mui/material"; +import React from "react"; +import useStyle from "./styles"; + +function InfoBusiness() { + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down('md')); + const extraSmall = useMediaQuery(theme.breakpoints.down('sm')); + const classes = useStyle({ mobile, extraSmall }); + return ( + + + + + + Office + + Take your office out to lunch + + + + + + + + + + + Enatega for business + + + Order lunch, fuel for meetings or late-night deliveries to the office. Your favorite restaurants coming + to a desk near you. + + + + + + + + ); +} + +export default React.memo(InfoBusiness); diff --git a/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/styles.js b/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/styles.js new file mode 100644 index 0000000..fbd8f7a --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/InfoBusiness/styles.js @@ -0,0 +1,68 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + marginTop: "50px", + minHeight: "50vh", + marginBottom: "120px", + }, + headingContainer: { + display: "flex", + }, + boldBackground: { + position: "relative", + marginBottom: (props) => (props.extraSmall ? "-30px" : "-50px"), + fontSize: (props) => + props.extraSmall ? "6rem" : props.mobile ? "10rem" : "12rem", + lineHeight: "1em", + color: "rgba(0,0,0,0.04)", + fontWeight: "700", + overflow: "hidden", + }, + bold300: { + position: "absolute", + bottom: (props) => (props.extraSmall ? "30px" : "50px"), + fontWeight: "300", + color: "#333", + }, + infoContainer: { + display: "flex", + minHeight: "50vh", + background: `url(https://images.deliveryhero.io/image/foodpanda/home-corporate-pk.jpg?width=2000&height=1280) no-repeat right top`, + backgroundPositionY: "50%", + }, + infoCard: { + backgroundColor: theme.palette.common.white, + borderRadius: "0px", + maxWidth: "550px", + padding: "20px", + marginBottom: "-70px", + boxShadow: "0px 0px 20px 1px rgba(0,0,0,0.2)", + }, + infotTitle: { + color: theme.palette.secondary.light, + fontWeight: "300", + fontSize: "1.8rem", + lineHeight: "1.2em", + }, + infoDescription: { + color: "#707070", + fontWeight: "300", + fontSize: "1rem", + margin: "16px 0", + }, + infoBtn: { + margin: (props) => (props.extraSmall ? undefined : theme.spacing(3, 0)), + float: (props) => (props.extraSmall ? undefined : "right"), + borderRadius: "0px", + height: "55px", + width: (props) => (props.extraSmall ? "220px" : "250px"), + "&:hover": { + backgroundColor: theme.palette.primary.main, + opacity: 0.8, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/InfoRestaurant.js b/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/InfoRestaurant.js new file mode 100644 index 0000000..4cd976b --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/InfoRestaurant.js @@ -0,0 +1,52 @@ +import { Button, Card, CardContent, Grid, Typography, useMediaQuery, useTheme } from "@mui/material"; +import React from "react"; +import useStyle from "./styles"; + +function InfoRestaurant() { + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down('md')); + const extraSmall = useMediaQuery(theme.breakpoints.down('sm')); + const classes = useStyle({ mobile, extraSmall }); + return ( + + + + + + Partners + + You prepare the food, we handle the rest + + + + + + + + + + + List your restaurant on Enatega + + + Would you like thousands of new customers to taste your amazing food? So would we! + + + It's simple: we list your menu online, help you process orders, pick them up, and deliver them to hungry + pandas - in a heartbeat! + + + Interested? Let's start our partnership today! + + + + + + + + ); +} + +export default React.memo(InfoRestaurant); diff --git a/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/styles.js b/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/styles.js new file mode 100644 index 0000000..3964eb3 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/InfoRestaurant/styles.js @@ -0,0 +1,72 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + marginTop: "50px", + minHeight: "50vh", + marginBottom: "120px", + }, + headingContainer: { + display: "flex", + }, + boldBackground: { + position: "relative", + marginBottom: (props) => (props.extraSmall ? "-30px" : "-50px"), + fontSize: (props) => + props.extraSmall ? "6rem" : props.mobile ? "10rem" : "12rem", + lineHeight: "1em", + color: "rgba(0,0,0,0.04)", + fontWeight: "700", + overflow: "hidden", + }, + bold300: { + position: "absolute", + bottom: (props) => (props.extraSmall ? "30px" : "50px"), + fontWeight: "300", + color: "#333", + }, + modalBox: { + alignSelf: "flex-end", + paddingTop: (props) => (props.extraSmall ? "50px" : undefined), + }, + infoContainer: { + display: "flex", + minHeight: "50vh", + background: `url(https://images.deliveryhero.io/image/foodpanda/home-vendor-pk.jpg?width=2000&height=1280) no-repeat right top`, + backgroundPositionY: "52%", + }, + infoCard: { + backgroundColor: theme.palette.common.white, + borderRadius: "0px", + maxWidth: "550px", + padding: "20px", + marginBottom: "-70px", + boxShadow: "0px 0px 20px 1px rgba(0,0,0,0.2)", + }, + infotTitle: { + color: theme.palette.secondary.light, + fontWeight: "300", + fontSize: "1.8rem", + lineHeight: "1.2em", + }, + infoDescription: { + color: "#707070", + fontWeight: "300", + fontSize: "1rem", + margin: "16px 0", + }, + infoBtn: { + margin: (props) => (props.extraSmall ? undefined : theme.spacing(3, 0)), + float: (props) => (props.extraSmall ? undefined : "right"), + borderRadius: "0px", + height: "55px", + width: (props) => (props.extraSmall ? "220px" : "250px"), + "&:hover": { + backgroundColor: theme.palette.primary.main, + opacity: 0.8, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/PriceCard/index.js b/enatega-multivendor-web/src/components/HomeScreen/PriceCard/index.js new file mode 100644 index 0000000..9e68ed9 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/PriceCard/index.js @@ -0,0 +1,115 @@ +import { Typography, Box, Divider, Button, useTheme } from "@mui/material"; +import useStyle from "./styles"; +import { useTranslation } from "react-i18next"; + +export default function PriceCard({ price, offer, desc, center }) { + const { t } = useTranslation(); + const classes = useStyle(); + const theme = useTheme(); + return ( + + + + + $ + + {price} + + + + {offer[0]} + + {offer[1]} + + + + + + + + + {desc[0]} + + + + + {desc[1]} + + + + + + + + + ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/PriceCard/styles.js b/enatega-multivendor-web/src/components/HomeScreen/PriceCard/styles.js new file mode 100644 index 0000000..f520ebd --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/PriceCard/styles.js @@ -0,0 +1,46 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + container: { + width: "300px", + height: "570px", + display: "flex", + position: "relative", + flexDirection: "column", + justifyContent: "center", + [theme.breakpoints.down("md")]: { + width: "275px", + }, + }, + outsideBottom: { + padding: "1.25rem", + height: "55%", + paddingTop: 0, + }, + top: { + backgroundColor: theme.palette.common.black, + display: "flex", + height: "25%", + justifyContent: "center", + alignItems: "center", + borderRadius: 30, + }, + bottom: { + height: "100%", + display: "flex", + justifyContent: "center", + alignItems: "center", + borderBottomLeftRadius: 30, + borderBottomRightRadius: 30, + }, + image: { + position: "absolute", + top: "-50%", + left: "50%", + padding: 0, + margin: 0, + transform: "translate(-50%, 30%)", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/SearchContainer.js b/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/SearchContainer.js new file mode 100644 index 0000000..ad9a8e4 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/SearchContainer.js @@ -0,0 +1,636 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-undef */ +import { gql, useLazyQuery } from "@apollo/client"; +import { + Button, + Grid, + InputAdornment, + TextField, + Typography, + useMediaQuery, + useTheme, + Box, +} from "@mui/material"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import LocationOnIcon from "@mui/icons-material/LocationOn"; +import Autocomplete from "@mui/material/Autocomplete"; +import { restaurantList } from "../../../apollo/server"; +import parse from "autosuggest-highlight/parse"; +import throttle from "lodash/throttle"; +import React, { useEffect, useState, useCallback, useRef } from "react"; +import SyncLoader from "react-spinners/SyncLoader"; +import LocationIcon from "../../../assets/icons/LocationIcon"; +import { useLocationContext } from "../../../context/Location"; +import { useLocation } from "../../../hooks"; +import FlashMessage from "../../FlashMessage"; +import useStyle from "./styles"; +import MarkerImage from "../../../assets/images/marker.png"; +import { mapStyles } from "../../../screens/OrderDetail/mapStyles"; +import SearchIcon from "@mui/icons-material/Search"; +import { SearchRestaurant } from "../../RestaurantComponent"; +import { useNavigate } from "react-router-dom"; +import RestMarker from "../../../assets/images/rest-map-2.png"; +import { useTranslation } from "react-i18next"; + +const autocompleteService = { current: null }; +const RESTAURANTS = gql` + ${restaurantList} +`; + +function SearchContainer({ + isHome, + search: searchProp, + setSearch: setSearchProp, +}) { + const { t } = useTranslation(); + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("md")); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyle({ mobile, extraSmall }); + const [value, setValue] = useState(null); + const [inputValue, setInputValue] = useState(""); + const [options, setOptions] = useState(["Loading ..."]); + const { getCurrentLocation } = useLocation(); + const [open, setOpen] = useState(); + const { location, setLocation } = useLocationContext(); + const [search, setSearch] = useState(""); + const navigateTo = useNavigate(); + const [alertError, setAlertError] = useState(null); + const [loading, setLoading] = useState(false); + const [map, setMap] = React.useState(false); + const fetchRef = useRef(false); + + const [fetchRestaurants, { data }] = useLazyQuery(RESTAURANTS, { + fetchPolicy: "network-only", + }); + const fetch = React.useMemo( + () => + throttle((request, callback) => { + autocompleteService.current.getPlacePredictions(request, callback); + }, 200), + [] + ); + const locationCallback = (error, data) => { + setLoading(false); + if (error) { + setAlertError(error); + setOpen(true); + return; + } + setSearch(data.deliveryAddress); + setLocation(data); + }; + const handleClose = useCallback(() => { + setOpen(false); + }, []); + + useEffect(() => { + loadMap(); + return () => { + setMap(false); + }; + }, []); + const loadMap = async () => { + setTimeout(() => { + setMap(true); + }, 100); + }; + useEffect(() => { + let active = true; + + if (!autocompleteService.current && window.google) { + autocompleteService.current = + new window.google.maps.places.AutocompleteService(); + } + if (!autocompleteService.current) { + return undefined; + } + + if (inputValue === "") { + setOptions(value ? [value] : []); + return undefined; + } + + fetch({ input: inputValue }, (results) => { + if (active) { + let newOptions = []; + if (value) { + newOptions = [value]; + } + if (results) { + newOptions = [...newOptions, ...results]; + } + setOptions(newOptions); + } + }); + + return () => { + active = false; + }; + }, [value, inputValue, fetch]); + + useEffect(() => { + if (!location) return; + if (fetchRef.current) return; + const variables = { + longitude: parseFloat(location.longitude) || null, + latitude: parseFloat(location.latitude) || null, + }; + fetchRestaurants({ variables }); + fetchRef.current = true; + }, [location]); + + const handleLocationButtonClick = () => { + setLoading(true); + getCurrentLocation(locationCallback); + }; + + window.onload = () => { + handleLocationButtonClick(); + }; + + const { restaurants } = data?.nearByRestaurants ?? {}; + return ( +
+ + + + {map && ( + + {location && ( + + )} + {restaurants?.map((item) => { + return ( + { + navigateTo(`/restaurant/${item.slug}`); + }} + title={item.name} + icon={RestMarker} + /> + ); + })} + + )} + {mobile ? ( + + + + + {isHome ? ( + + typeof option === "string" + ? option + : option.description + } + filterOptions={(x) => x} + options={options} + autoComplete + InputLabelProps={{ style: { display: "none" } }} + freeSolo + includeInputInList + filterSelectedOptions + style={{ width: "100%" }} + value={ + loading + ? "Loading ..." + : search + ? search + : location + ? location.deliveryAddress + : "" + } + onChange={(event, newValue) => { + if (newValue) { + const b = new window.google.maps.Geocoder(); + b.geocode({ placeId: newValue.place_id }, (res) => { + const location = res[0].geometry.location; + setLocation({ + label: "Home", + deliveryAddress: newValue.description, + latitude: location.lat(), + longitude: location.lng(), + }); + }); + } else { + setSearch(""); + } + setOptions(newValue ? [...options] : options); + setValue(newValue); + }} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => ( + + + + ), + endAdornment: ( + <> + {params.InputProps.endAdornment} + { + e.preventDefault(); + setValue(search?.deliveryAddress ?? ""); + setSearch( + location?.deliveryAddress ?? "" + ); + }} + > + {loading ? ( + + ) : ( + <> + { + e.preventDefault(); + setLoading(true); + getCurrentLocation( + locationCallback + ); + }} + /> + {/* */} + + )} + + + ), + }} + /> + )} + renderOption={(props, option) => { + const matches = + option.structured_formatting + ?.main_text_matched_substrings; + let parts = null; + if (matches) { + parts = parse( + option.structured_formatting.main_text, + matches.map((match) => [ + match.offset, + match.offset + match.length, + ]) + ); + } + return ( + + + + + + {parts && + parts.map((part, index) => ( + + {part.text} + + ))} + + {option.structured_formatting?.secondary_text} + + + + ); + }} + /> + ) : ( + + )} + + {isHome ? ( + + + + ) : null} + + + + ) : null} + + + {mobile ? null : ( + + + + + + {isHome ? ( + + typeof option === "string" ? option : option.description + } + filterOptions={(x) => x} + options={options} + autoComplete + includeInputInList + filterSelectedOptions + value={ + loading + ? "Loading ..." + : search + ? search + : location + ? location.deliveryAddress + : "" + } + onChange={(event, newValue) => { + if (newValue) { + const b = new window.google.maps.Geocoder(); + b.geocode({ placeId: newValue.place_id }, (res) => { + const location = res[0].geometry.location; + setLocation({ + label: "Home", + deliveryAddress: newValue.description, + latitude: location.lat(), + longitude: location.lng(), + }); + }); + } else { + setSearch(""); + } + setOptions(newValue ? [...options] : options); + setValue(newValue); + }} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => ( + { if(event.key === 'Enter'){ + if (location) { + navigateTo("/restaurant-list"); + } + } }} + InputLabelProps={{ style: { display: "none" } }} + fullWidth + InputProps={{ + ...params.InputProps, + endAdornment: ( + <> + {params.InputProps.endAdornment} + { + e.preventDefault(); + setValue(search?.deliveryAddress ?? ""); + setSearch(location?.deliveryAddress ?? ""); + }} + > + {loading ? ( + + ) : ( + { + e.preventDefault(); + setLoading(true); + getCurrentLocation(locationCallback); + }} + /> + )} + + + ), + }} + /> + )} + renderOption={(props, option) => { + const matches = + option.structured_formatting + ?.main_text_matched_substrings; + let parts = null; + if (matches) { + parts = parse( + option.structured_formatting.main_text, + matches.map((match) => [ + match.offset, + match.offset + match.length, + ]) + ); + } + return ( + + + + + + {parts && + parts.map((part, index) => ( + + {part.text} + + ))} + + + {option.structured_formatting?.secondary_text} + + + + ); + }} + /> + ) : ( + + + + + + )} + + {isHome ? ( + + + + ) : null} + + + + )} +
+ ); +} + +// function CategorySmallCard({ image, title }) { +// const theme = useTheme(); +// return ( +// +// +// icon +// +// +// {title} +// +// +// ); +// } + +export default React.memo(SearchContainer); diff --git a/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/styles.js b/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/styles.js new file mode 100644 index 0000000..904a819 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/SearchContainer/styles.js @@ -0,0 +1,143 @@ +import makeStyles from "@mui/styles/makeStyles"; +import Fish from "../../../assets/images/fish.png"; + +const useStyle = makeStyles((theme) => ({ + option: { + minHeight: "auto", + alignItems: "flex-start", + padding: 8, + '&[aria-selected="true"]': { + backgroundColor: "transparent", + }, + '&[data-focus="true"]': { + backgroundColor: theme.palette.action.hover, + }, + }, + icon: { + color: theme.palette.text.secondary, + marginRight: theme.spacing(2), + }, + mainContainer: { + display: "flex", + paddingTop: "70px", + minWidth: "100%", + backgroundColor: "transparent", + }, + temp: { + height: "80vh", + width: "100%", + }, + left: { + minHeight: "80vh", + + [theme.breakpoints.down("md")]: { + position: "relative", + }, + }, + right: { + backgroundColor: theme.palette.primary.main, + borderBottomLeftRadius: "5rem", + borderTopLeftRadius: "5rem", + minHeight: "80vh", + display: "flex", + marginTop: "2px", + justifyContent: "center", + alignItems: "center", + backgroundImage: `url(${Fish})`, + backgroundSize: "contain", + backgroundPosition: "right", + backgroundRepeat: "no-repeat", + [theme.breakpoints.down("md")]: { + borderBottomLeftRadius: "0rem", + borderTopLeftRadius: "0rem", + backgroundSize: "cover", + backgroundPosition: "center", + minHeight: "60vh", + }, + }, + headingContainer: { + display: "flex", + alignItems: "center", + position: "absolute", + bottom: 20, + left: 0, + }, + searchContainer: { + display: "flex", + justifyContent: "center", + padding: theme.spacing(2), + backgroundColor: theme.palette.common.black, + boxShadow: "0px 0px 20px 1px rgba(0,0,0,0.2)", + borderRadius: 10, + position: "relative", + }, + button: { + // margin: (props) => (props.extraSmall ? "10px 0px 0px" : "0px 10px"), + height: "55px", + color: theme.palette.common.black, + fontWeight: 700, + borderRadius: 10, + width: "100%", + [theme.breakpoints.down("md")]: { + width: "180px", + }, + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + foodCategories: { + background: " rgb(0 0 0 / 48%)", + backdropFilter: "blur(16px)", + display: "flex", + justifyContent: "space-around", + alignItems: "center", + minHeight: "160px", + borderBottomLeftRadius: 20, + borderBottomRightRadius: 20, + width: "75% ", + }, + mobileheadingContainer: { + padding: 10, + position: "absolute", + bottom: -10, + left: 0, + background: "rgb(0 0 0 / 48%)", + backdropFilter: "blur(16px)", + borderRadius: 30, + marginBottom: "50px", + }, + mobileheadingContainerNotHome: { + padding: 20, + position: "absolute", + bottom: -10, + left: 0, + background: "rgb(0 0 0 / 48%)", + backdropFilter: "blur(16px)", + borderRadius: 30, + marginBottom: "50px", + }, + foodCategoriesMobile: { + display: "flex", + justifyContent: "space-between", + alignItems: "center", + minHeight: "160px", + width: "100% ", + }, + mobileBox: { + width: "100%", + }, + textField: { + color: "initial", + backgroundColor: "white", + borderRadius: 10, + border: "none", + "& .MuiOutlinedInput-root": { + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + borderWidth: "1px", + }, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/StoreContainer.js b/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/StoreContainer.js new file mode 100644 index 0000000..faa960d --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/StoreContainer.js @@ -0,0 +1,83 @@ +import { Button, Grid, Typography, useMediaQuery, useTheme } from "@mui/material"; +import { Apple } from "@mui/icons-material"; +import React from "react"; +import PlayStore from "../../../assets/icons/PlayStore"; +import useStyle from "./styles"; +import { Link as RouterLink } from "react-router-dom"; +import { useTranslation } from 'react-i18next'; + +function StoreContainer() { + const { t } = useTranslation() + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down('md')); + const extraSmall = useMediaQuery(theme.breakpoints.down('sm')); + const classes = useStyle({ mobile, extraSmall }); + return ( + + + + + + App + + {t('putUsInYourPocket')} + + + + + + + + + + + Download the food you love and more + + + {t('containerText')} + + + + + + + + + + + + + + + ); +} + +export default React.memo(StoreContainer); diff --git a/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/styles.js b/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/styles.js new file mode 100644 index 0000000..0c05448 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/StoreContainer/styles.js @@ -0,0 +1,66 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyle = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + marginTop: "50px", + minHeight: "50vh", + marginBottom: "120px", + }, + headingContainer: { + display: "flex", + }, + boldBackground: { + position: "relative", + marginBottom: "-50px", + fontSize: (props) => (props.extraSmall ? "8rem" : props.mobile ? "10rem" : "12rem"), + lineHeight: "1em", + color: "rgba(0,0,0,0.04)", + fontWeight: "700", + }, + bold300: { + position: "absolute", + bottom: "50px", + fontWeight: "300", + color: "#333", + }, + storeContainer: { + display: "flex", + minHeight: "50vh", + backgroundColor: theme.palette.primary.main, + alignItems: "center", + paddingTop: (props) => (props.mobile ? "50px" : undefined), + paddingBottom: (props) => (props.mobile ? "50px" : undefined), + }, + storeTitle: { + fontSize: "1.8rem", + lineHeight: "1.14em", + }, + storeDescription: { + fontSize: "1rem", + fontWeight: "300", + lineHeight: "1.14em", + margin: "16px 0", + }, + btnBase: { + borderRadius: "0px", + height: "55px", + marginRight: "10px", + marginTop: (props) => (props.mobile ? "10px" : undefined), + borderWidth: "1px", + borderColor: "white", + }, + imgContainer: { + display: (props) => (props.extraSmall ? "flex" : "block"), + overflow: "hidden", + alignSelf: "center", + justifyContent: (props) => (props.extraSmall ? "center" : "flex-end"), + // marginTop: (props) => (props.extraSmall ? "20px" : undefined), + }, + linkDecoration: { + textDecoration: "none", + alignSelf: "center", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/HomeScreen/Tech/index.js b/enatega-multivendor-web/src/components/HomeScreen/Tech/index.js new file mode 100644 index 0000000..fbd4159 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/Tech/index.js @@ -0,0 +1,95 @@ +import { + Grid, + useMediaQuery, + useTheme, + Box, + Container, + Typography, +} from "@mui/material"; +import React from "../../../assets/images/react.png"; +import Node from "../../../assets/images/node.png"; +import Mongo from "../../../assets/images/mongodb.png"; +import Firebase from "../../../assets/images/firebase.png"; +import Graphql from "../../../assets/images/gql.png"; +import MUI from "../../../assets/images/mui.png"; +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + bgText: { + position: "absolute", + bottom: -90, + left: 0, + fontSize: 80, + fontWeight: 500, + color: "#000000", + mixBlendMode: "normal", + opacity: 0.24, + }, + bgTextSmall: { + position: "absolute", + top: -90, + left: 20, + fontSize: 50, + fontWeight: 500, + color: "#000000", + mixBlendMode: "normal", + opacity: 0.24, + }, +})); + +export default function Tech() { + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + const classes = useStyle(); + return ( + + + Tech + + + + + React + + + + + Node + + + + + + Mongo + + + + + + + + MUI + + + + + + + Firebase + + + + + Graphql + + + + + ); +} diff --git a/enatega-multivendor-web/src/components/HomeScreen/index.js b/enatega-multivendor-web/src/components/HomeScreen/index.js new file mode 100644 index 0000000..2cc0884 --- /dev/null +++ b/enatega-multivendor-web/src/components/HomeScreen/index.js @@ -0,0 +1,7 @@ +import FAQ from "./FAQ/FAQ"; +import InfoBusiness from "./InfoBusiness/InfoBusiness"; +import InfoRestaurant from "./InfoRestaurant/InfoRestaurant"; +import SearchContainer from "./SearchContainer/SearchContainer"; +import StoreContainer from "./StoreContainer/StoreContainer"; + +export { SearchContainer, StoreContainer, InfoRestaurant, FAQ, InfoBusiness }; diff --git a/enatega-multivendor-web/src/components/Language/LanguageCard.js b/enatega-multivendor-web/src/components/Language/LanguageCard.js new file mode 100644 index 0000000..e89a63b --- /dev/null +++ b/enatega-multivendor-web/src/components/Language/LanguageCard.js @@ -0,0 +1,148 @@ +import { useMutation } from "@apollo/client"; +import { + Button, + CircularProgress, + Grid, + Typography, + Box, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { useCallback, useRef, useState } from "react"; +import { updateUser } from "../../apollo/server"; +import FlashMessage from "../FlashMessage"; +import useStyle from "./styles"; +//import { Link as RouterLink } from "react-router-dom"; +import Radio from "@mui/material/Radio"; +import RadioGroup from "@mui/material/RadioGroup"; +import FormControlLabel from "@mui/material/FormControlLabel"; +import { useTranslation } from "react-i18next"; +import i18n from "../../i18n"; +console.log(i18n); + +const UPDATEUSER = gql` + ${updateUser} +`; +const languageTypes = [ + { value: "English", code: "en", index: 0 }, + { value: "français", code: "fr", index: 1 }, + { value: "ភាសាខ្មែរ", code: "km", index: 2 }, + { value: "中文", code: "zh", index: 3 }, + { value: "Deutsche", code: "de", index: 4 }, + { value: "arabic", code: "ar", index: 5 }, +]; +function LanguageCard() { + const { t } = useTranslation(); + const theme = useTheme(); + const formRef = useRef(null); + const classes = useStyle(); + + const [error, setError] = useState({}); + const [mutate, { loading }] = useMutation(UPDATEUSER, { + onCompleted, + onError, + }); + console.log(mutate); + function onError(error) { + setError({ type: "error", message: error.message }); + } + + function onCompleted({ updateUser }) { + if (updateUser) { + setError({ type: "success", message: "User's Info Updated" }); + } + } + + const toggleSnackbar = useCallback(() => { + setError({}); + }, []); + + const currentLang = localStorage.getItem("enatega-language"); + const [selectedLanguage, setSelectedLanguage] = useState( + currentLang ? currentLang : "en" + ); + console.log(selectedLanguage); + + const handleLanguageChange = (event) => { + setSelectedLanguage(event.target.value); + localStorage.setItem("enatega-language", event.target.value); + const savedLanguage = localStorage.getItem("enatega-language"); + console.log("Saved language in localStorage:", savedLanguage); + }; + + return ( + + + + {/* */} + + + {t("selectLanguage")} + + +
+ + {languageTypes.map((lang) => ( + } + label={lang.value} + checked={lang.code === localStorage.getItem("enatega-language")} + /> + ))} + + + + + +
+
+
+ ); +} + +export default React.memo(LanguageCard); diff --git a/enatega-multivendor-web/src/components/Language/styles.js b/enatega-multivendor-web/src/components/Language/styles.js new file mode 100644 index 0000000..65519d2 --- /dev/null +++ b/enatega-multivendor-web/src/components/Language/styles.js @@ -0,0 +1,64 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + MH3: { + margin: theme.spacing(3, 0), + }, + + mainContainer: { + justifyContent: "center", + }, + MB0: { + marginBottom: "0px !important", + }, + profileContainer: { + padding: theme.spacing(3, 3), + backgroundColor: theme.palette.common.white, + borderRadius: 30, + }, + textBold: { + fontWeight: 700, + }, + btnContainer: { + display: "flex", + justifyContent: "center", + }, + headerBar: { + background: + "linear-gradient(261.53deg, theme.palette.success.light -8.04%, theme.palette.primary.main 111.96%)", + borderRadius: 30, + height: 80, + display: "flex", + alignItems: "center", + }, + titleText: { + fontWeight: 600, + marginLeft: 20, + fontSize: "1.2rem", + }, + fieldWrapper: { + display: "flex", + alignItems: "center", + marginBottom: theme.spacing(3), + }, + formMargin: { + marginTop: 30, + }, + btn: { + borderRadius: "10px !important", + height: "40px !important", + background: theme.palette.primary.main, + width: 120, + }, + textField: { + color: theme.palette.grey[600], + padding: 10, + fontSize: "1.2rem", + width: "100%", + borderRadius: 20, + border: "none", + backgroundColor: "#F3F4F8", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Modals/AddressModal/AddressModal.js b/enatega-multivendor-web/src/components/Modals/AddressModal/AddressModal.js new file mode 100644 index 0000000..bb21bf2 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/AddressModal/AddressModal.js @@ -0,0 +1,301 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Button, + CircularProgress, + Dialog, + DialogContent, + DialogTitle, + IconButton, + InputAdornment, + TextField, + Typography, + useTheme, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import GpsFixedIcon from "@mui/icons-material/GpsFixed"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import clsx from "clsx"; +import React, { useCallback, useEffect, useState } from "react"; +import { useLocation } from "../../../hooks"; +import FlashMessage from "../../FlashMessage"; +import useStyle from "./styles"; +import MarkerImage from "../../../assets/images/marker.png"; +import ClearIcon from "@mui/icons-material/Clear"; +import PlacesAutocomplete from "react-places-autocomplete"; + +import ConfigurableValues from "../../../config/constants"; + +import { useTranslation } from "react-i18next"; + + + +function AddressModal({ + toggleModal, + isVisible, + regionDetail, + changeAddress, + settingRegionDetail, + setShowDetail, +}) { + console.log(settingRegionDetail); + + + const { GOOGLE_MAPS_KEY } = ConfigurableValues(); + + const theme = useTheme(); + + const classes = useStyle(); + const [region, setRegion] = useState(null); + const [mainError, setMainError] = useState({}); + const [locationName, setLocationName] = useState(""); + const { t } = useTranslation(); + const { getCurrentLocation } = useLocation(); + const { latLngToGeoString } = useLocation(); + const [loading, setLoading] = useState(); + const handleLocationSelection = (selectedLocation) => { + const apiKey = GOOGLE_MAPS_KEY; + + setLocationName(selectedLocation); + const encodedLocation = encodeURIComponent(selectedLocation); + + const apiUrl = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodedLocation}&key=${apiKey}`; + fetch(apiUrl) + .then((response) => response.json()) + .then((data) => { + if (data.status === "OK" && data.results.length > 0) { + const location = data.results[0].geometry.location; + const latitude = location.lat; + const longitude = location.lng; + setRegion({ + lat: latitude, + lng: longitude, + }); + } else { + console.error("Location not found"); + } + }); + }; + + useEffect(() => { + if (regionDetail) { + console.log(regionDetail); + setRegion({ + lat: regionDetail.lat, + lng: regionDetail.lng, + }); + setLocationName(regionDetail.location); + } + }, [regionDetail]); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + const handleClearClick = () => { + setLocationName(""); + }; + + const changeCoordinates = async (coordinates, index) => { + setLoading(true); + (async () => { + const { latLng } = coordinates; + const regionChange = { + lat: latLng.lat(), + lng: latLng.lng(), + }; + const geoCodeData = await latLngToGeoString({ + latitude: latLng.lat(), + longitude: latLng.lng(), + }); // pass a callback + setLocationName(geoCodeData); + setRegion(regionChange); + return; + })().finally(() => { + setLoading(false); + }); + }; + + const submitAddress = useCallback(() => { + if (region) { + changeAddress((prev) => { + return { + ...prev, + lat: region.lat, + lng: region.lng, + location: locationName, + }; + }); + } + toggleModal(); + }, [locationName, region]); + const locationCallback = (error, data) => { + setLoading(false); + if (error) { + setMainError({ type: "error", message: error }); + return; + } + setRegion({ + lat: data.latitude, + lng: data.longitude, + }); + setLocationName(data.deliveryAddress); + }; + return ( + <> + + + + { + toggleModal(); + setShowDetail(); + }} + className={classes.closeContainer} + > + + + + + + + {t("exactLocation")} + + + + + + {({ + getInputProps, + suggestions, + getSuggestionItemProps, + loading, + }) => ( +
+ + {loading ? ( + + ) : ( + <> + {locationName && ( + + + + )} + { + e.preventDefault(); + if (!loading) { + setLoading(true); + getCurrentLocation(locationCallback); + } + }} + size="large" + > + + + + )} + + ), + }} + /> +
+ {loading ?
Loading...
: null} + {suggestions.map((suggestion) => { + const style = { + backgroundColor: suggestion.active + ? theme.palette.primary.main + : theme.palette.common.white, + color: "black", + fontSize: "16px", + padding: "10px 16px", + }; + return ( +
+ {suggestion.description} +
+ ); + })} +
+
+ )} +
+ + + + + + + +
+
+ + ); +} + +export default React.memo(AddressModal); diff --git a/enatega-multivendor-web/src/components/Modals/AddressModal/styles.js b/enatega-multivendor-web/src/components/Modals/AddressModal/styles.js new file mode 100644 index 0000000..7965ae7 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/AddressModal/styles.js @@ -0,0 +1,63 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiDialog-paper": { + padding: theme.spacing(1, 1), + }, + "& .MuiButton-containedPrimary:hover": { + backgroundColor: theme.palette.primary.main, + }, + "& .MuiButton-outlinedPrimary": { + margin: theme.spacing(2, 0), + }, + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + }, + mapContainer: { + margin: theme.spacing(3, 0), + }, + title: { + paddingRight: theme.spacing(1.5), + marginBottom: theme.spacing(2), + }, + lightText: { + fontWeight: theme.typography.fontWeightLight, + }, + boldText: { + fontWeight: theme.typography.fontWeightBold, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + smallText: { + fontSize: "0.875rem", + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + linkBtn: { + textDecoration: "none", + }, + closeContainer: { + position: "absolute", + background: "rgba(0,0,0,0.1)", + top: theme.spacing(1), + right: theme.spacing(1), + "&:hover": { + backgroundColor: "rgba(255,255,255,0.3)", + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Modals/ClearCart/ClearCart.js b/enatega-multivendor-web/src/components/Modals/ClearCart/ClearCart.js new file mode 100644 index 0000000..5fe8f18 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/ClearCart/ClearCart.js @@ -0,0 +1,76 @@ +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + IconButton, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import clsx from "clsx"; +import React from "react"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +function ClearCart({ isVisible, toggleModal, action }) { + const theme = useTheme(); + const classes = useStyles(); + const extraSmall = useMediaQuery(theme.breakpoints.down('md')); + const { t } = useTranslation() + return ( + + + + + + + + + + {t('areYouSure')} + + + {t('clearCartText')} + + + + + + + + + + + ); +} + +export default React.memo(ClearCart); diff --git a/enatega-multivendor-web/src/components/Modals/ClearCart/styles.js b/enatega-multivendor-web/src/components/Modals/ClearCart/styles.js new file mode 100644 index 0000000..24b959b --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/ClearCart/styles.js @@ -0,0 +1,58 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiDialog-paper": { + padding: theme.spacing(1, 1), + }, + "& .MuiButton-containedPrimary:hover": { + backgroundColor: theme.palette.primary.main, + }, + "& .MuiButton-outlinedPrimary": { + margin: theme.spacing(1, 1), + }, + }, + MB2: { + marginBottom: theme.spacing(2), + }, + lightText: { + fontWeight: theme.typography.fontWeightLight, + }, + boldText: { + fontWeight: theme.typography.fontWeightBold, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + titleText: { + ...theme.typography.h6, + color: theme.palette.text.disabled, + }, + xSmallText: { + ...theme.typography.caption, + color: theme.palette.text.disabled, + }, + smallText: { + ...theme.typography.body2, + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + linkBtn: { + textDecoration: "none", + }, + closeContainer: { + position: "absolute", + background: "rgba(0,0,0,0.1)", + top: theme.spacing(1), + right: theme.spacing(1), + "&:hover": { + backgroundColor: "rgba(255,255,255,0.3)", + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Modals/RestaurantClose/RestaurantClose.js b/enatega-multivendor-web/src/components/Modals/RestaurantClose/RestaurantClose.js new file mode 100644 index 0000000..c1d06ee --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/RestaurantClose/RestaurantClose.js @@ -0,0 +1,64 @@ +import { Box, Button, Dialog, DialogContent, DialogTitle, IconButton, Typography } from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import clsx from "clsx"; +import React from "react"; +import { Link as RouterLink } from "react-router-dom"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; +function RestaurantClose({ isVisible, toggleModal, restaurant, closeMenu = true }) { + const classes = useStyles(); + const { t } = useTranslation(); + return ( + + + + + + + + + + {`${restaurant} is closed Now.`} + + + {t('restaurantCloseText')} + + + + + + + + {closeMenu && ( + + )} + + + ); +} + +export default React.memo(RestaurantClose); diff --git a/enatega-multivendor-web/src/components/Modals/RestaurantClose/styles.js b/enatega-multivendor-web/src/components/Modals/RestaurantClose/styles.js new file mode 100644 index 0000000..fc5cefe --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/RestaurantClose/styles.js @@ -0,0 +1,59 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiDialog-paper": { + padding: theme.spacing(1, 1), + }, + "& .MuiButton-containedPrimary:hover": { + backgroundColor: theme.palette.primary.main, + }, + "& .MuiButton-outlinedPrimary": { + margin: theme.spacing(2, 0), + }, + }, + title: { + paddingRight: theme.spacing(1.5), + marginBottom: theme.spacing(2), + }, + lightText: { + fontWeight: theme.typography.fontWeightLight, + }, + boldText: { + fontWeight: theme.typography.fontWeightBold, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + titleText: { + ...theme.typography.h6, + color: theme.palette.text.disabled, + }, + xSmallText: { + ...theme.typography.caption, + color: theme.palette.text.disabled, + }, + smallText: { + ...theme.typography.body2, + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + linkBtn: { + textDecoration: "none", + }, + closeContainer: { + position: "absolute", + background: "rgba(0,0,0,0.1)", + top: theme.spacing(1), + right: theme.spacing(1), + "&:hover": { + backgroundColor: "rgba(255,255,255,0.3)", + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Modals/RestaurantInfo/RestaurantInfo.js b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/RestaurantInfo.js new file mode 100644 index 0000000..3775c67 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/RestaurantInfo.js @@ -0,0 +1,278 @@ +import { + Box, + Container, + Dialog, + Divider, + IconButton, + Tab, + Tabs, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import FiberManualRecordIcon from "@mui/icons-material/FiberManualRecord"; +import StarSharpIcon from "@mui/icons-material/StarSharp"; +import React, { useCallback, useState } from "react"; +import { useTranslation } from "react-i18next"; +import useStyles from "./styles"; +import TabContainer from "./TabContainer"; + +function a11yProps(index) { + return { + id: `simple-tab-${index}`, + "aria-controls": `simple-tabpanel-${index}`, + }; +} + +function RestaurantInfo({ isVisible, toggleModal, restaurantInfo }) { + const theme = useTheme(); + const classes = useStyles(); + const extraSmall = useMediaQuery(theme.breakpoints.down("md")); + const [tabValue, setTabValue] = useState(0); + const { t } = useTranslation(); + + const handleChange = useCallback((event, newValue) => { + setTabValue(newValue); + }, []); + + return ( + + + + + + + + + + + + {restaurantInfo.name} + + + + + {restaurantInfo.reviewData.ratings} + + /5 + + {` (${restaurantInfo.reviewData.total})`} + + + + + {restaurantInfo.deals.map((item, index) => ( + + + + {item.title} + + + ))} + + + + {`${t("delivery")} ${restaurantInfo.deliveryTime} ${t("minute")}`}{" "} + + + + + + + + + + + + + + + {t("deliveryHours")} + + + {restaurantInfo.openingTimes.map((dayOb, index) => ( + + + + {" "} + {`${dayOb.day}`} + + {dayOb.times.length < 1 ? ( + + {" "} + {t("closedAllDay")} + + ) : ( + dayOb.times.map((timeObj, index) => ( + + {" "} + {timeObj.startTime[0]}:{timeObj.startTime[1]} + {" - "} + {timeObj.endTime[0]}:{timeObj.endTime[1]} + + )) + )} + + + ))} + + + + {t("address")} + + + + + + {restaurantInfo.address || ""} + + + + + + + {`${restaurantInfo.reviewData.total} ${t("reviews")}`} + + + + + {restaurantInfo.reviewData.reviews.map((review, index) => ( + + + + + {review.order.user.name} + + + + + {review.rating} + + + /5 + + + + + {review.description} + + + + + ))} + + + + ); +} + +export default React.memo(RestaurantInfo); diff --git a/enatega-multivendor-web/src/components/Modals/RestaurantInfo/TabContainer.js b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/TabContainer.js new file mode 100644 index 0000000..4c4ef44 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/TabContainer.js @@ -0,0 +1,23 @@ +import { Box } from "@mui/material"; +import React from "react"; + +function TabContainer(props) { + const { children, value, index, ...other } = props; + return ( + + ); +} + +export default React.memo(TabContainer); diff --git a/enatega-multivendor-web/src/components/Modals/RestaurantInfo/styles.js b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/styles.js new file mode 100644 index 0000000..3c96d7a --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/RestaurantInfo/styles.js @@ -0,0 +1,65 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + imgContainer: { + height: "200px", + width: "100%", + backgroundImage: `url('https://images.deliveryhero.io/image/fd-pk/LH/v6ai-hero.jpg?width=2000&height=500')`, + backgroundSize: "cover", + backgroundPositionX: "center", + backgroundPositionY: "center", + }, + line: { + margin: theme.spacing(2, 0), + }, + lightText: { + fontWeight: theme.typography.fontWeightBolder, + }, + restaurantContainer: { + background: theme.palette.common.white, + marginTop: "-50px", + paddingLeft: "0px", + paddingRight: "0px", + boxShadow: theme.shadows[1], + }, + titleText: { + ...theme.typography.h6, + color: theme.palette.text.disabled, + }, + xSmallText: { + ...theme.typography.caption, + color: theme.palette.text.disabled, + }, + smallText: { + ...theme.typography.body2, + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + reviewContainer: { + backgroundColor: "black", + padding: "12px", + borderRadius: "10px", + marginLeft: "10px", + marginRight: "10px", + marginBottom: "10px", + }, + closeContainer: { + position: "absolute", + background: "rgba(0,0,0,0.1)", + top: theme.spacing(1), + right: theme.spacing(1), + "&:hover": { + backgroundColor: "rgba(255,255,255,0.3)", + }, + }, + starIcon: { + fontSize: "14px", + color: theme.palette.info.main, + }, + starSharp: { + fontSize: "14px", + color: theme.palette.warning.light, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Modals/VariationModal/HeadingView.js b/enatega-multivendor-web/src/components/Modals/VariationModal/HeadingView.js new file mode 100644 index 0000000..22edcec --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/VariationModal/HeadingView.js @@ -0,0 +1,39 @@ +import { Box, Typography } from "@mui/material"; +import clsx from "clsx"; +import React from "react"; +import useStyles from "./styles"; +import { useTranslation } from "react-i18next" + +function ItemHeadingView({ + /*title = "Select Variation", + subTitle = "Select 1", + status = "Required",*/ + error = false, +}) { + const classes = useStyles(); + const { t } = useTranslation(); + return ( + <> + + + {t('selectVariation')} + + + + {t('required')} + + + + + {t('subTitle')} + + + ); +} + +export default React.memo(ItemHeadingView); diff --git a/enatega-multivendor-web/src/components/Modals/VariationModal/VariationModal.js b/enatega-multivendor-web/src/components/Modals/VariationModal/VariationModal.js new file mode 100644 index 0000000..b83f5b7 --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/VariationModal/VariationModal.js @@ -0,0 +1,505 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Button, + Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Divider, + FormControl, + FormControlLabel, + FormGroup, + IconButton, + Radio, + RadioGroup, + OutlinedInput, + Typography, + useMediaQuery, + useTheme, + Paper, +} from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; +import CloseIcon from "@mui/icons-material/Close"; +import RemoveIcon from "@mui/icons-material/Remove"; +import clsx from "clsx"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import UserContext from "../../../context/User"; +import HeadingView from "./HeadingView"; +import { useTranslation } from 'react-i18next'; +import useStyles from "./styles"; + +function VariationModal({ isVisible, toggleModal, data }) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const configuration = useContext(ConfigurationContext); + const extraSmall = useMediaQuery(theme.breakpoints.down("lg")); + const [quantity, setQuantity] = useState(1); + const [selectedAddons, setSelectedAddons] = useState([]); + const [selectedVariation, setSelectedVariation] = useState(null); + const [specialInstructions, setSpecialInstructions] = useState(""); + const { + restaurant: restaurantCart, + setCartRestaurant, + cart, + addQuantity, + addCartItem, + } = useContext(UserContext); + + useEffect(() => { + setSelectedVariation({ + ...data?.food.variations[0], + addons: data?.food.variations[0].addons.map((fa) => { + const addon = data?.addons.find((a) => a._id === fa); + const addonOptions = addon.options.map((ao) => { + return data?.options.find((o) => o._id === ao); + }); + return { + ...addon, + options: addonOptions, + }; + }), + }); + return () => { + setSelectedAddons([]); + setSelectedVariation(null); + }; + }, [data]); + + const onAdd = useCallback(() => { + setQuantity(quantity + 1); + }, []); + + const onRemove = useCallback(() => { + setQuantity((prev) => { + if (prev > 1) return prev - 1; + else return prev; + }); + }, []); + + const calculatePrice = useCallback(() => { + const variation = selectedVariation?.price; + let addons = 0; + selectedAddons?.forEach((addon) => { + addons += addon.options.reduce((acc, option) => { + return acc + option.price; + }, 0); + }); + return (variation + addons).toFixed(2); + }, [data, selectedVariation]); + + const onSelectVariation = useCallback( + (variation) => { + setSelectedVariation({ + ...variation, + addons: variation.addons.map((fa) => { + const addon = data?.addons.find((a) => a._id === fa); + const addonOptions = addon.options.map((ao) => { + return data?.options.find((o) => o._id === ao); + }); + return { + ...addon, + options: addonOptions, + }; + }), + }); + }, + [data] + ); + + const onSelectOption = async (addon, option) => { + const index = selectedAddons.findIndex((ad) => ad._id === addon._id); + if (index > -1) { + if (addon.quantityMinimum === 1 && addon.quantityMaximum === 1) { + selectedAddons[index].options = [option]; + } else { + const optionIndex = selectedAddons[index].options.findIndex( + (opt) => opt._id === option._id + ); + if (optionIndex > -1) { + selectedAddons[index].options = selectedAddons[index].options.filter( + (opt) => opt._id !== option._id + ); + } else { + selectedAddons[index].options.push(option); + } + if (!selectedAddons[index].options.length) { + selectedAddons.splice(index, 1); + } + } + } else { + selectedAddons.push({ _id: addon._id, options: [option] }); + } + setSelectedAddons([...selectedAddons]); + }; + + const validateButton = () => { + if (!selectedVariation) return false; + const validatedAddons = []; + selectedVariation?.addons?.forEach((addon) => { + const selected = selectedAddons.find((ad) => ad._id === addon._id); + if (!selected && addon.quantityMinimum === 0) { + validatedAddons.push(false); + } else if ( + selected && + selected.options.length >= addon.quantityMinimum && + selected.options.length <= addon.quantityMaximum + ) { + validatedAddons.push(false); + } else validatedAddons.push(true); + }); + return validatedAddons.every((val) => val === false); + }; + + const validateOrderItem = () => { + const validatedAddons = selectedVariation?.addons.map((addon) => { + const selected = selectedAddons.find((ad) => ad._id === addon._id); + + if (!selected && addon.quantityMinimum === 0) { + addon.error = false; + } else if ( + selected && + selected.options.length >= addon.quantityMinimum && + selected.options.length <= addon.quantityMaximum + ) { + addon.error = false; + } else addon.error = true; + return addon; + }); + setSelectedVariation({ ...selectedVariation, addons: validatedAddons }); + return validatedAddons.every((addon) => addon.error === false); + }; + + const onPressAddToCart = async () => { + if (validateOrderItem()) { + if (!restaurantCart || data?.restaurant === restaurantCart) { + await addToCart(quantity, data?.restaurant !== restaurantCart); + } + } + }; + + const addToCart = async (quantity, clearFlag) => { + const addons = selectedAddons?.map((addon) => ({ + ...addon, + options: addon.options.map(({ _id }) => ({ + _id, + })), + })); + + const cartItem = clearFlag + ? null + : cart.find((cartItem) => { + if ( + cartItem._id === data?.food._id && + cartItem.variation._id === selectedVariation?._id + ) { + if (cartItem.addons.length === addons.length) { + if (addons.length === 0) return true; + const addonsResult = addons.every((newAddon) => { + const cartAddon = cartItem.addons.find( + (ad) => ad._id === newAddon._id + ); + + if (!cartAddon) return false; + const optionsResult = newAddon.options.every((newOption) => { + const cartOption = cartAddon.options.find( + (op) => op._id === newOption._id + ); + + if (!cartOption) return false; + return true; + }); + + return optionsResult; + }); + + return addonsResult; + } + } + return false; + }); + + if (!cartItem) { + await setCartRestaurant(data?.restaurant); + await addCartItem( + data?.food?._id, + selectedVariation?._id, + quantity, + addons, + clearFlag, + specialInstructions + ); + } else { + await addQuantity(cartItem.key, quantity); + } + toggleModal(); + }; + + const radioORcheckboxes = useCallback( + (addon) => { + if (addon.quantityMinimum === 1 && addon.quantityMaximum === 1) { + return ( + + {addon?.options.map((option, index) => ( + + onSelectOption(addon, option)} + control={} + label={ + + {option.title} + + } + /> + + {`${configuration.currencySymbol} ${option.price.toFixed(2)}`} + + + ))} + + ); + } else { + return addon?.options.map((option, index) => ( + + } + onClick={() => onSelectOption(addon, option)} + name={option._id} + label={ + + {option.title} + + } + /> + + {`${configuration.currencySymbol} ${option.price.toFixed(2)}`} + + + )); + } + }, + [selectedVariation] + ); + + return ( + <> + + + + + {t('customize')} + + + + + + + + + {data?.food?.title ?? ""} + + {` ${ + configuration.currencySymbol + } ${calculatePrice()}`} + + + + {data?.food?.description ?? ""} + + + + + + {data?.food.variations.length > 1 && ( + <> + + + + {data?.food.variations.map((variation, index) => ( + + onSelectVariation(variation)} + control={} + label={ + + {variation.title} + + } + /> + + + {`${ + configuration.currencySymbol + } ${variation.price.toFixed(2)}`} + + + ))} + + + + + )} + + + + {selectedVariation?.addons?.map((addon, index) => ( + + + {radioORcheckboxes(addon)} + + ))} + + + + + + setSpecialInstructions(event.target.value) + } + placeholder={t('placeholder')} + variant="filled" + color="primary" + inputProps={{ + style: { color: theme.palette.grey[600] }, + maxLength: 144, + }} + size="small" + /> + + + + + + { + e.preventDefault(); + onRemove(); + }} + > + + + + {quantity} + + { + e.preventDefault(); + onAdd(); + }} + > + + + + + + + + + + + ); +} +export default React.memo(VariationModal); diff --git a/enatega-multivendor-web/src/components/Modals/VariationModal/styles.js b/enatega-multivendor-web/src/components/Modals/VariationModal/styles.js new file mode 100644 index 0000000..adb99fa --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/VariationModal/styles.js @@ -0,0 +1,119 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiTextField-root": { + marginBottom: theme.spacing(3), + }, + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiDialog-paper": { + backgroundColor: "transparent", + borderRadius: 40, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey[200], + }, + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + "& .MuiButton-contained": { + borderRadius: "0px", + height: "50px", + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main, + }, + }, + }, + itemTitle: { + ...theme.typography.h5, + fontWeight: 500, + color: theme.palette.text.secondary, + }, + priceTitle: { + ...theme.typography.subtitle2, + color: theme.palette.text.disabled, + }, + infoStyle: { + ...theme.typography.caption, + textTransform: "uppercase", + background: "black", + color: "white", + padding: "4px 6px", + fontWeight: 500, + borderRadius: 10, + }, + checkoutContainer: { + width: "200px", + borderRadius: "12px !important", + padding: "10px 0px", + "&:hover": { + background: theme.palette.primary.main, + }, + }, + imageContainer: { + width: "100%", + height: "180px", + backgroundImage: `url('https://images.deliveryhero.io/image/fd-pk/LH/v1bq-hero.jpg?width=2000&height=500')`, + backgroundSize: "cover", + backgroundPositionX: "center", + backgroundPositionY: "center", + position: "relative", + borderRadius: 40, + boxShadow: + "inset 0 0 0 1000px rgba(0, 0, 0, 0), inset 0 0 0 1000px theme.palette.common.lightBlack", + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + checkoutText: { + ...theme.typography.h6, + fontWeight: 700, + fontSize: "0.875rem", + color: theme.palette.common.black, + }, + closeContainer: { + background: theme.palette.common.white, + width: "54px", + height: "54px", + borderRadius: "50%", + position: "absolute", + right: 0, + top: 0, + }, + itemError: { + color: theme.palette.common.white, + backgroundColor: theme.palette.warning.main, + }, + disableBtn: { + background: theme.palette.grey[400], + "&:hover": { + background: theme.palette.grey[400], + }, + }, + outerContainer: { + borderRadius: 40, + background: "#F5F6F6", + }, + innerContainer: { + background: "#F5F6F6", + padding: "20px 40px", + }, + lowerContainer: { + background: theme.palette.common.white, + boxShadow: theme.shadows["2"], + borderRadius: 20, + }, + mr: { + marginRight: theme.spacing(1), + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/Modals/index.js b/enatega-multivendor-web/src/components/Modals/index.js new file mode 100644 index 0000000..9a376ca --- /dev/null +++ b/enatega-multivendor-web/src/components/Modals/index.js @@ -0,0 +1,7 @@ +import RestaurantInfo from "./RestaurantInfo/RestaurantInfo"; +import VariationModal from "./VariationModal/VariationModal"; +import RestaurantClose from "./RestaurantClose/RestaurantClose"; +import ClearCart from "./ClearCart/ClearCart"; +import AddressModal from "./AddressModal/AddressModal"; + +export { AddressModal, RestaurantInfo, VariationModal, RestaurantClose, ClearCart }; diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/ActiveOrder.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/ActiveOrder.js new file mode 100644 index 0000000..d1a2846 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/ActiveOrder.js @@ -0,0 +1,67 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Grid, Box, Typography, useTheme, useMediaQuery } from "@mui/material"; +import React, { useContext } from "react"; +import UserContext from "../../../../context/User"; +import { Link as RouterLink } from "react-router-dom"; +import useStyles from "./styles"; +import { useSubscription } from "@apollo/client"; +import { subscriptionOrder } from "../../../../apollo/server"; +import gql from "graphql-tag"; +import { OrderCard } from "../OrderCard/OrderCard"; +import { ACTIVE_STATUS } from "../../../../utils/constantValues"; + +function ActiveOrder(props) { + useSubscription( + gql` + ${subscriptionOrder} + `, + { variables: { id: props._id } } + ); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + const { loadingOrders, errorOrders, orders } = useContext(UserContext); + const order = orders.filter((o) => ACTIVE_STATUS.includes(o.orderStatus)); + if (loadingOrders) return Loading...; + if (errorOrders) { + if (errorOrders.message === "Unauthenticated!") { + return null; + } + return {errorOrders.message}; + } + + return ( + + + + {order.map((item, index) => ( + <>{index < 4 && } + ))} + + + + {order.length > 4 && ( + + + + See More + + + + )} + + + + ); +} + +export default React.memo(ActiveOrder); diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/styles.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/styles.js new file mode 100644 index 0000000..a0bee81 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/Card/styles.js @@ -0,0 +1,25 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + mt: { + marginTop: theme.spacing(4), + }, + m: { + marginTop: theme.spacing(4), + marginRight: theme.spacing(10), + }, + link: { + textDecoration: "none", + }, + button: { + background: theme.palette.primary.main, + padding: "10px", + width: theme.spacing(25), + borderRadius: "5px", + "&:hover": { + backgroundColor: theme.palette.success.main, + }, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/ProgressBar.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/ProgressBar.js new file mode 100644 index 0000000..000f537 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/ProgressBar.js @@ -0,0 +1,55 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, useTheme, LinearProgress, useMediaQuery } from "@mui/material"; +import React, { useEffect, useState, useRef } from "react"; +import useStyles from "./styles"; + +function ProgressBar(props) { + const [progress, setProgress] = useState(0); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + let timer = useRef(null); + useEffect(() => { + timer.current = setInterval(() => { + setProgress((oldProgress) => { + if (oldProgress === 100) { + return 0; + } + const diff = Math.random() * 10; + const abc = Math.min(oldProgress + diff, 100); + return abc; + }); + }, 2500); + + return () => { + clearInterval(timer.current); + }; + }, []); + + return ( + + + + + + + ); +} + +export default React.memo(ProgressBar); diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/styles.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/styles.js new file mode 100644 index 0000000..a8d527e --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/LinearProgress/styles.js @@ -0,0 +1,15 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + margin: { + margin: theme.spacing(1), + }, + linearProgress: { + width: (extraSmall) => (extraSmall ? theme.spacing(4) : theme.spacing(6)), + }, + bar: { + borderRadius: 10, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/OrderCard.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/OrderCard.js new file mode 100644 index 0000000..9dadec9 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/OrderCard.js @@ -0,0 +1,103 @@ +import { + Grid, + Box, + Typography, + useTheme, + Paper, + useMediaQuery, +} from "@mui/material"; +import React from "react"; +import { Link as RouterLink } from "react-router-dom"; +import useStyles from "./styles"; +import ProgressBar from "../LinearProgress/ProgressBar"; +import { useTranslation } from 'react-i18next'; +const { t } = useTranslation(); +const orderStatuses = [ + { + key: t('pending'), + status: 1, + statusText: "Your order is still pending.", + }, + { + key: t('accepted'), + status: 2, + statusText: "Restaurant is preparing Food.", + }, + { + key: t('assigned'), + status: 3, + statusText: "Your order is assigned to rider.", + }, + { + key: t('picked'), + status: 4, + statusText: "Rider is on the way.", + }, + { + key: t('delivered'), + status: 5, + statusText: "Order is delivered.", + }, + { + key: t('completed'), + status: 6, + statusText: "Order is completed.", + }, +]; + +const checkStatus = (status) => { + const obj = orderStatuses.filter((x) => { + return x.key === status; + }); + return obj[0]; +}; +export const OrderCard = (props) => { + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + const { item } = props; + + return ( + <> + + + + + + + {item.orderId} + + + + {checkStatus(item.orderStatus)?.statusText} + + + + + {checkStatus(item.orderStatus)?.key} + + + + + + + + + ); +}; diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/styles.js b/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/styles.js new file mode 100644 index 0000000..618cf09 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrder/OrderCard/styles.js @@ -0,0 +1,21 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + mt: { + marginTop: theme.spacing(4), + }, + box: { + padding: "20px", + background: theme.palette.common.white, + borderRadius: 0, + boxShadow: `0px 1px 20px 1px ${theme.palette.grey[300]}`, + }, + textBold: { + fontWeight: 700, + }, + link: { + textDecoration: "none", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/ActiveOrderCard.js b/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/ActiveOrderCard.js new file mode 100644 index 0000000..4266676 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/ActiveOrderCard.js @@ -0,0 +1,175 @@ +import { + Box, + Divider, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import React, {useContext} from "react"; +import { Link as RouterLink } from "react-router-dom"; +import ConfigurationContext from "../../../context/Configuration"; +import { Status } from "../Status/Status"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + + +function ActiveOrderCard(props) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + const configuration = useContext(ConfigurationContext); + + const STATUS_ORDER = [ + t('pending'), + t('accepted'), + t('assigned'), + t('picked'), + t('delivered'), + t('completed'), + ]; + + return ( + + + + + + + {props.restaurant?.name ?? "..."} + + + + + + + + + + + + {props?.items.length} item(s) |{" "} + {`${configuration.currencySymbol} ${parseFloat( + props.orderAmount + ).toFixed(2)}`} + + + + {/* {props?.items?.length} item(s) | + {`${configuration.currencySymbol} ${parseFloat( + props.orderAmount + ).toFixed(2)}`} */} + {props.orderStatus === "PENDING" + ? t('orderPending') + : props.orderStatus === "ASSIGNED" || + props.orderStatus === "ACCEPTED" + ? t('restaurantDeliver') + : props.orderStatus === "PICKED" + ? t('riderDeliver') + : null} + + {/* + {new Date(props.createdAt).toDateString()} + */} + + + Restaurant + + + + {/* {props.items.map((item) => ( + + + {`${item.quantity}x ${item.title}${ + item.variation.title ? `(${item.variation.title})` : "" + }`} + + {item.addons.map((addon) => + addon.options.map((option, index) => ( + + +{option.title} + + )) + )} + + ))} */} + + + + + {t(props?.orderStatus)} + + + + + + ); +} + +export default React.memo(ActiveOrderCard); diff --git a/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/styles.js b/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/styles.js new file mode 100644 index 0000000..d6c7aa9 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/ActiveOrderCard/styles.js @@ -0,0 +1,45 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: 700, + }, + smallText: { + fontSize: "0.875rem", + }, + link: { + textDecoration: "none", + }, + card: { + background: theme.palette.primary.main, + padding: theme.spacing(2), + marginBottom: theme.spacing(4), + + borderRadius: theme.spacing(2), + }, + img: { + borderRadius: theme.spacing(2), + width: 100, + height: 100, + [theme.breakpoints.down("md")]: { + width: 60, + height: 60, + }, + }, + divider: { + background: theme.palette.common.black, + marginTop: 10, + }, + status: { + borderRadius: 10, + backgroundColor: theme.palette.common.white, + padding: 13, + width: 100, + marginTop: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/DetailedOrderCard.js b/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/DetailedOrderCard.js new file mode 100644 index 0000000..cad9e63 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/DetailedOrderCard.js @@ -0,0 +1,166 @@ +import { Box, Typography, useMediaQuery, useTheme } from "@mui/material"; +import React, { useContext } from "react"; +import { Link as RouterLink } from "react-router-dom"; +import ConfigurationContext from "../../../context/Configuration"; +import { Status } from "../Status/Status"; +import useStyles from "./styles"; +import { useTranslation } from "react-i18next"; + +function DetailedOrderCard(props) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + + const configuration = useContext(ConfigurationContext); + const STATUS_ORDER = [ + t("pending"), + t("accepted"), + t("assigned"), + t("picked"), + t("delivered"), + t("completed"), + ]; + return ( + + + + + Restaurant + + + + + {(props.restaurant?.name ?? "...") + .slice(0, 8) + .replace(/\s/g, "") + + (props.restaurant?.name?.length > 9 ? "..." : "")} + + + + + + + + + + + + + {t(props.orderStatus)} {console.log(props?.orderStatus)} + + + + + + + + {props?.items.length} item(s) |{" "} + {`${configuration.currencySymbol} ${parseFloat( + props.orderAmount + ).toFixed(2)}`} + + + + + {props.orderStatus === "PENDING" + ? t("orderPending") + : props.orderStatus === "ASSIGNED" || + props.orderStatus === "ACCEPTED" + ? t("restaurantDeliver").slice(0, 40) + "..." + : props.orderStatus === "PICKED" + ? t("riderDeliver").slice(0, 40) + "..." + : null} + + + + + + + ); +} + +export default React.memo(DetailedOrderCard); diff --git a/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/styles.js b/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/styles.js new file mode 100644 index 0000000..1d82bb2 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/DetailedOrderCard/styles.js @@ -0,0 +1,58 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: 700, + maxWidth: "110px", + }, + textPrice: { + fontWeight: 700, + marginTop: "10px", + marginBottom: "10px", + }, + smallText: { + fontSize: "0.875rem", + }, + link: { + textDecoration: "none", + }, + + card: { + background: "White", + //padding: theme.spacing(2), + //marginBottom: theme.spacing(4), + borderRadius: theme.spacing(2), + [theme.breakpoints.down("sm")]: { + width: "250px", + marginLeft: "-20px", + }, + }, + img: { + borderStartStartRadius: theme.spacing(2), + borderBottomLeftRadius: theme.spacing(2), + width: 100, + height: 100, + [theme.breakpoints.down("sm")]: { + width: 60, + height: 60, + borderBottomLeftRadius: theme.spacing(0), + borderTopRightRadius: theme.spacing(2), + }, + }, + divider: { + background: theme.palette.common.black, + marginTop: 10, + }, + status: { + borderRadius: 10, + backgroundColor: theme.palette.common.white, + padding: 13, + width: 100, + marginTop: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/AmountCard.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/AmountCard.js new file mode 100644 index 0000000..c8cb867 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/AmountCard.js @@ -0,0 +1,191 @@ +import { Box, Divider, Grid, Paper, Typography, useTheme } from "@mui/material"; +import clsx from "clsx"; +import React, { useContext } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import { calculatePrice } from "../../../utils/customFunction"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +export default function AmountCard(props) { + const { t } = useTranslation(); + const classes = useStyles(); + const configuration = useContext(ConfigurationContext); + const deliveryCharges = props.isPickedUp ? 0 : props.deliveryCharges; + const theme = useTheme(); + return ( + <> + + + + + + {props.items.map((item) => ( + + + + {`${item.quantity}x`} + + + + + {`${item.title}${ + item.variation.title ? `(${item.variation.title})` : "" + }`} + + + {item.addons.map((addon, index) => ( + + +{addon.options.map((option) => option.title)} + + ))} + + + + + {`${configuration.currencySymbol} ${parseFloat( + calculatePrice(item) + ).toFixed(2)}`} + + + + + + + ))} + + + + + {t('subTotal')} + + + + + {`${configuration.currencySymbol} ${parseFloat( + props.orderAmount - + deliveryCharges - + props.taxationAmount - + props.tipping + ).toFixed(2)}`} + + + + + + + + {t('tip')} + + + + + {`${configuration.currencySymbol} ${parseFloat( + props.tipping + ).toFixed(2)}`} + + + + + + + {t('taxFee')} + + + + + {`${configuration.currencySymbol} ${parseFloat( + props.taxationAmount + ).toFixed(2)}`} + + + + {!props.isPickedUp && ( + + + + {t('deliveryFee')} + + + + + {`${configuration.currencySymbol} ${parseFloat( + props.deliveryCharges + ).toFixed(2)}`} + + + + )} + + + + + {t('total')} + + + (Incl. TAX) + + + + + + {`${configuration.currencySymbol} ${parseFloat( + props.orderAmount + ).toFixed(2)}`} + + + + + + + + ); +} diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/DetailCard.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/DetailCard.js new file mode 100644 index 0000000..661032a --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/DetailCard.js @@ -0,0 +1,122 @@ +import { Divider, Grid, Paper, Typography, useTheme } from "@mui/material"; +import clsx from "clsx"; +import React from "react"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; +function DetailCard(props) { + const classes = useStyles(); + const theme = useTheme(); + const { t } = useTranslation() + + return ( + + + + + {t('orderDetail')} + + + + + {/* first box */} + + + + {t('orderFrom')}: + + + + + {props.restaurant?.name ?? "..."} + + + + + + + {t('orderNo')}: + + + + + {props.orderId ?? "..."} + + + + + + + {!!props.isPickedUp ? "Pick Up Address:" : t('deliveryAddress')+":"} + + + + {!!props.isPickedUp ? ( + + {props.restaurant?.address ?? "..."} + + ) : ( + + {props.deliveryAddress?.deliveryAddress ?? "..."} + + )} + + + + + + ); +} + +export default DetailCard; diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/Modal.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/Modal.js new file mode 100644 index 0000000..2386e1d --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/Modal.js @@ -0,0 +1,58 @@ +import * as React from "react"; +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import Typography from "@mui/material/Typography"; +import Modal from "@mui/material/Modal"; +import useStyles from "./styles"; +import { Link as RouterLink } from "react-router-dom"; + +export default function ModalView() { + const [open, setOpen] = React.useState(true); + const classes = useStyles(); + const handleClose = () => setOpen(false); + return ( + <> + + + + Your order was
declined +
+ + + + + + +
+
+ + ); +} diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/StatusCard.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/StatusCard.js new file mode 100644 index 0000000..f1c168b --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/StatusCard.js @@ -0,0 +1,249 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Typography, useTheme, Avatar, Divider } from "@mui/material"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import React from "react"; +import useStyles from "./styles"; +import Scooter from "../../../assets/images/scooter.png"; +import Arrow from "../../../assets/images/arrow.png"; +import Preparing from "../../../assets/images/preparing.png"; +import Delivered from "../../../assets/images/delivered.png"; +import { useTranslation } from 'react-i18next'; + +export default function StatusCard(props) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + const { + orderStatus = "CANCELLED", + createdAt, + acceptedAt, + deliveredAt, + pickedAt, + assignedAt, + } = props; + + const STATUS_ORDER = [ + t('pending'), + t('accepted'), + t('assigned'), + t('picked'), + t('delivered'), + t('completed'), + ]; + + const formatTime = (date) => + new Date(date).toLocaleTimeString("en-US", { timeStyle: "short" }); + + function getOrderStatusValues({ + preparationTime, + isPickedUp, + orderStatus, + restaurant, + }) { + const calculateTime = Math.floor( + (new Date(preparationTime) - Date.now()) / 1000 / 60 + ); + + let description = ""; + let estimated_time = ""; + let feedback = ""; + let status_image = ""; + switch (orderStatus) { + case "PENDING": + description = t('pendingText'); + estimated_time = restaurant?.name ?? "..."; + feedback = ""; + status_image = Arrow; + break; + case "ACCEPTED": + description = `${t('acceptedText')}`; + estimated_time = + calculateTime > 0 + ? `${calculateTime} Min` + : t('orderLateText'); + feedback = `Preparing your food.${ + isPickedUp ? "" : t('riderPickText') + }`; + status_image = Preparing; + break; + case "ASSIGNED": + description = `${t('orderIs')}`; + estimated_time = t('orderAssigned'); + feedback = `${t('orderAssignedToRider')}`; + status_image = Scooter; + break; + case "PICKED": + description = t('orderIs'); + estimated_time = t('picked'); + feedback = t('riderOnWay'); + status_image = Scooter; + break; + case "DELIVERED": + description = t('orderHasBeen'); + estimated_time = t('delivered'); + feedback = t('enjoyYourMeal'); + status_image = Delivered; + break; + case "CANCELLED": + description = t('orderHasBeen'); + estimated_time = t('cancelled'); + feedback = ""; + status_image = null; + break; + default: + break; + } + return { + description, + estimated_time, + feedback, + status_image, + }; + } + + const { description, estimated_time, status_image } = + getOrderStatusValues(props); + + return ( + <> + + + scooty + + {description} + + + + {estimated_time} + + + + + + + + + + + + + + ); +} + +export function StatusRow({ first, isEta, status, time, number, last }) { + const theme = useTheme(); + const classes = useStyles(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + + return ( + + + + {number} + + + + + {status} + + + {isEta ? "ETA " : ""} + {time} + + + {!last && ( + + )} + + ); +} diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/SupportCard.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/SupportCard.js new file mode 100644 index 0000000..f4df6b0 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/SupportCard.js @@ -0,0 +1,37 @@ +import { Button, Grid, Paper, Typography } from "@mui/material"; +import clsx from "clsx"; +import React from "react"; +import useStyles from "./styles"; + +function SupportCard() { + const classes = useStyles(); + return ( + + + + + Need support + + + Questions regarding your order? Reach out to us. + + + + + + ); +} + +export default SupportCard; diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/TrackingRider.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/TrackingRider.js new file mode 100644 index 0000000..acda59a --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/TrackingRider.js @@ -0,0 +1,46 @@ +import React, { useEffect } from "react"; +import { useQuery } from "@apollo/client"; +import gql from "graphql-tag"; +import { Marker } from "@react-google-maps/api"; +import { subscriptionRiderLocation, rider } from "../../../apollo/server"; +import RiderMarker from "../../../assets/images/rider-map-2.png"; + +const RIDER = gql` + ${rider} +`; +const RIDER_LOCATION = gql` + ${subscriptionRiderLocation} +`; +const TrackingRider = ({ id }) => { + const { loading, error, data, subscribeToMore } = useQuery(RIDER, { + variables: { id }, + fetchPolicy: "network-only", + }); + useEffect(() => { + const unsubscribe = subscribeToMore({ + document: RIDER_LOCATION, + variables: { riderId: id }, + updateQuery: (prev, { subscriptionData }) => { + + if (!subscriptionData.data) return prev; + return { + rider: { + ...prev.rider, + ...subscriptionData.data.subscriptionRiderLocation, + }, + }; + }, + }); + return unsubscribe; + }, [id, subscribeToMore]); + + if (loading) return null; + if (error) return null; + let riderCoordinates = { + lat: parseFloat(data.rider.location.coordinates[1]), + lng: parseFloat(data.rider.location.coordinates[0]), + }; + return ; +}; + +export default TrackingRider; diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/index.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/index.js new file mode 100644 index 0000000..7e5f462 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/index.js @@ -0,0 +1,6 @@ +import StatusCard from "./StatusCard"; +import DetailCard from "./DetailCard"; +import SupportCard from "./SupportCard"; +import AmountCard from "./AmountCard"; +import ModalView from "./Modal"; +export { StatusCard, DetailCard, SupportCard, AmountCard, ModalView }; diff --git a/enatega-multivendor-web/src/components/Orders/OrderDetail/styles.js b/enatega-multivendor-web/src/components/Orders/OrderDetail/styles.js new file mode 100644 index 0000000..6ff4d03 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/OrderDetail/styles.js @@ -0,0 +1,136 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + w70: { + width: "70%", + }, + mv2: { + margin: theme.spacing(2, 0), + }, + mt3: { + marginTop: theme.spacing(3), + }, + ph1: { + padding: theme.spacing(0, 1), + }, + center: { + justifyContent: "center", + padding: theme.spacing(2, 3), + }, + cardContainer: { + background: theme.palette.common.white, + borderRadius: 0, + }, + dot: { + fontSize: 10, + margin: theme.spacing(2, 0), + marginRight: theme.spacing(0.5), + }, + imgContainer: { + maxWidth: "158px", + backgroundSize: "cover", + }, + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: 700, + }, + smallText: { + fontSize: "0.875rem", + }, + cardRow: { + display: "flex", + justifyContent: "space-between", + padding: theme.spacing(0.1, 0), + }, + btnBase: { + borderRadius: "0px", + }, + topOrder: { + display: "flex", + alignItems: "center", + }, + innerTopOrder: { + display: "flex", + alignItems: "center", + justifyContent: "center", + [theme.breakpoints.down("sm")]: { + padding: 10, + backgroundColor: theme.palette.common.black, + width: "100%", + justifyContent: "flex-start", + borderRadius: 20, + }, + }, + typos: { + [theme.breakpoints.down("sm")]: { + display: "flex", + width: "100%", + justifyContent: "space-between", + }, + }, + + innerBottomOrder: { + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + [theme.breakpoints.down("sm")]: { + width: "100%", + marginTop: theme.spacing(3), + }, + }, + heading: { + fontSize: "2.175rem", + }, + bottomOrder: { + display: "flex", + alignItems: "center", + justifyContent: "space-around", + [theme.breakpoints.down("sm")]: { + flexDirection: "column", + marginBottom: theme.spacing(3), + padding: 10, + }, + }, + mediumText: { + fontSize: "1.0rem", + }, + mediumBoldText: { + fontSize: "1.2rem", + color: theme.palette.common.black, + fontWeight: "600", + }, + modal: { + position: "absolute", + top: "50%", + left: "50%", + transform: "translate(-50%, -50%)", + width: 450, + backgroundColor: theme.palette.common.white, + border: "2px solid theme.palette.common.white", + outline: 0, + borderRadius: 10, + padding: `${theme.spacing(6)} ${theme.spacing(4)} ${theme.spacing( + 6 + )} ${theme.spacing(4)}`, + }, + btn: { + width: "200px", + borderRadius: 20, + padding: 10, + marginTop: theme.spacing(4), + fontWeight: 600, + color: "black", + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + + btnWrapper: { + display: "flex", + justifyContent: "space-between", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/PastOrderCard/PastOrderCard.js b/enatega-multivendor-web/src/components/Orders/PastOrderCard/PastOrderCard.js new file mode 100644 index 0000000..c79bd30 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/PastOrderCard/PastOrderCard.js @@ -0,0 +1,230 @@ +import { + Grid, + Box, + Button, + Typography, + useTheme, + CircularProgress, + Divider, + useMediaQuery, +} from "@mui/material"; +import React, { useContext, useState } from "react"; +import { useNavigate } from "react-router"; +import ConfigurationContext from "../../../context/Configuration"; +import UserContext from "../../../context/User"; +import useStyles from "./styles"; +import { Status } from "../Status/Status"; +import { Link as RouterLink } from "react-router-dom"; +import { useTranslation } from 'react-i18next'; +function PastOrderCard({ item }) { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const configuration = useContext(ConfigurationContext); + const { setCartRestaurant, addCartItem } = useContext(UserContext); + const small = useMediaQuery(theme.breakpoints.down("sm")); + + const STATUS_ORDER = [ + t('pending'), + t('accepted'), + t('assigned'), + t('picked'), + t('delivered'), + t('completed'), + ]; + + const onAddToCart = async () => { + setLoading(true); + try { + await setCartRestaurant(item.restaurant._id); + item.items.forEach(async (cartItem, index) => { + const addons = cartItem.addons.map((addon) => ({ + _id: addon._id, + options: addon.options.map(({ _id }) => ({ + _id, + })), + })); + await addCartItem( + cartItem.food, + cartItem.variation._id, + cartItem.quantity, + addons, + index === 0 + ); + }); + navigate(`/restaurant/${item.restaurant.slug}`, { + state: { + id: item.restaurant._id, + name: item.restaurant.name, + image: item.restaurant.image, + slug: item.restaurant.slug, + }, + }); + } catch (e) { + console.error(e); + } finally { + setLoading(false); + } + }; + return ( + + + + + + + {item.restaurant?.name ?? "..."} + + + + + + + + + + {item?.items.length} item(s) |{" "} + {`${configuration.currencySymbol} ${parseFloat( + item.orderAmount + ).toFixed(2)}`} + + + + + {item?.orderStatus === "CANCELLED" + ? t('orderCancelled') + : item?.orderStatus === "DELIVERED" + ? t('orderCompleted') + : null} + + + + + + {new Date(item.createdAt).toDateString()} + + + {!item.review && ( + + )} + + + Restaurant + + + + + + + + {item?.orderStatus} + + + + + + ); +} + +export default React.memo(PastOrderCard); diff --git a/enatega-multivendor-web/src/components/Orders/PastOrderCard/styles.js b/enatega-multivendor-web/src/components/Orders/PastOrderCard/styles.js new file mode 100644 index 0000000..f026691 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/PastOrderCard/styles.js @@ -0,0 +1,63 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + link: { + textDecoration: "none", + }, + disabledText: { + color: "black", + }, + textBold: { + fontWeight: 600, + }, + smallText: { + fontSize: "0.875rem", + }, + line: { + margin: theme.spacing(2, 0), + }, + card: { + background: theme.palette.primary.dark, + boxShadow: " 0px 0px 8px rgba(0, 0, 0, 0.18)", + padding: theme.spacing(2), + marginBottom: theme.spacing(4), + borderRadius: theme.spacing(2), + }, + img: { + borderRadius: theme.spacing(2), + width: 100, + height: 100, + [theme.breakpoints.down("md")]: { + width: 60, + height: 60, + }, + }, + divider: { + background: theme.palette.common.black, + marginTop: 10, + }, + status: { + borderRadius: 10, + backgroundColor: theme.palette.primary.dark, + padding: 13, + width: 100, + marginTop: theme.spacing(2), + border: "2px solid", + borderColor: theme.palette.button.main + }, + reOrder: { + maxWidth: "auto", + border: `1px solid ${theme.palette.primary.main}`, + borderRadius: 0, + padding: `0px ${theme.spacing(1)}`, + }, + review: { + maxWidth: "auto", + border: `1px solid ${theme.palette.primary.main}`, + borderRadius: 0, + padding: `0px ${theme.spacing(1)}`, + marginLeft: " 10px", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/PaymentOrderCard.js b/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/PaymentOrderCard.js new file mode 100644 index 0000000..d562157 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/PaymentOrderCard.js @@ -0,0 +1,70 @@ +import { Grid, Paper, Typography } from "@mui/material"; +import clsx from "clsx"; +import React from "react"; +import ThreeDots from "../../ThreeDots/ThreeDots"; +import { DetailCard } from "../OrderDetail"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +function PaymentOrderCard(props) { + const { t } = useTranslation() + const classes = useStyles(); + return ( + + + + + + + {t('personalDetail')} + + + + + + + {t('name')} + + + + + {props.user?.name ?? "..."} + + + + + + + {t('email')} + + + + + {props.user?.email ?? "..."} + + + + + + + {t('phone')} + + + + + {props.user.phone ?? "..."} + + + + + + + + + + + + ); +} + +export default React.memo(PaymentOrderCard); diff --git a/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/styles.js b/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/styles.js new file mode 100644 index 0000000..810d29a --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/PaymentOrderCard/styles.js @@ -0,0 +1,52 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + w70: { + width: "70%", + }, + mv2: { + margin: theme.spacing(2, 0), + }, + mt3: { + marginTop: theme.spacing(3), + }, + ph1: { + padding: theme.spacing(0, 1), + }, + center: { + justifyContent: "center", + padding: theme.spacing(2, 3), + }, + cardContainer: { + background: theme.palette.common.white, + borderRadius: 0, + }, + dot: { + fontSize: 10, + margin: theme.spacing(2, 0), + marginRight: theme.spacing(0.5), + }, + imgContainer: { + maxWidth: "158px", + backgroundSize: "cover", + }, + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: 700, + }, + smallText: { + fontSize: "0.875rem", + }, + cardRow: { + display: "flex", + justifyContent: "space-between", + padding: theme.spacing(0.1, 0), + }, + btnBase: { + borderRadius: "0px", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Orders/Status/Status.js b/enatega-multivendor-web/src/components/Orders/Status/Status.js new file mode 100644 index 0000000..616a2d0 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/Status/Status.js @@ -0,0 +1,84 @@ +import { Box, useTheme } from "@mui/material"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import React from "react"; +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + center: { + justifyContent: "center", + padding: theme.spacing(2, 3), + }, + + smallText: { + fontSize: "0.875rem", + }, + + innerBottomOrder: { + display: "flex", + justifyContent: "flex-start", + alignItems: "center", + [theme.breakpoints.down("sm")]: { + width: "100%", + marginTop: theme.spacing(3), + }, + }, + heading: { + fontSize: "2.175rem", + }, + bottomOrder: { + display: "flex", + alignItems: "center", + justifyContent: "space-around", + [theme.breakpoints.down("sm")]: { + flexDirection: "column", + marginBottom: theme.spacing(3), + padding: 10, + }, + }, +})); + +export function Status({ + first, + isEta, + last, + isActive, + firstCol = "#90EA93", + secondCol = "#C4C4C4", +}) { + const theme = useTheme(); + const classes = useStyles(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + + return ( + + + {!last && ( + + )} + + ); +} diff --git a/enatega-multivendor-web/src/components/Orders/Tabs/Tabs.js b/enatega-multivendor-web/src/components/Orders/Tabs/Tabs.js new file mode 100644 index 0000000..727d15a --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/Tabs/Tabs.js @@ -0,0 +1,57 @@ +import React from "react"; +import { Box, Button } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; +import { useTranslation } from 'react-i18next'; +const useStyles = makeStyles((theme) => ({ + container: { + backgroundColor: theme.palette.primary.main, + borderRadius: 15, + width: 280, + height: 60, + position: "absolute", + top: -30, + left: "50%", + transform: "translate(-50%, 0px)", + display: "flex", + justifyContent: "center", + alignItems: "center", + }, + btn: { + color: theme.palette.common.black, + width: 120, + fontSize: "0.775rem", + borderRadius: 12, + fontWeight: 700, + }, +})); +const OrderTabs = ({ tab, setTab }) => { + const classes = useStyles(); + const { t } = useTranslation() + return ( + + + + + ); +}; +export default OrderTabs; diff --git a/enatega-multivendor-web/src/components/Orders/index.js b/enatega-multivendor-web/src/components/Orders/index.js new file mode 100644 index 0000000..1eee9c8 --- /dev/null +++ b/enatega-multivendor-web/src/components/Orders/index.js @@ -0,0 +1,20 @@ +import PastOrderCard from "./PastOrderCard/PastOrderCard"; +import ActiveOrderCard from "./ActiveOrderCard/ActiveOrderCard"; +import { + StatusCard, + DetailCard, + SupportCard, + AmountCard, + ModalView, +} from "./OrderDetail"; +import PaymentOrderCard from "./PaymentOrderCard/PaymentOrderCard"; +export { + PastOrderCard, + ActiveOrderCard, + StatusCard, + DetailCard, + SupportCard, + AmountCard, + PaymentOrderCard, + ModalView, +}; diff --git a/enatega-multivendor-web/src/components/Profile/AddressCard/AddressCard.js b/enatega-multivendor-web/src/components/Profile/AddressCard/AddressCard.js new file mode 100644 index 0000000..817ec7c --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/AddressCard/AddressCard.js @@ -0,0 +1,54 @@ +import { Grid, Typography, Box } from "@mui/material"; +import React, { useState } from "react"; +import useStyle from "./styles"; +import { DeliveryCard } from "../../Checkout"; +import { useLocationContext } from "../../../context/Location"; +import { ReactComponent as Address } from "../../../assets/images/Address.svg"; +import { useTranslation } from 'react-i18next'; + +function AddressCard() { + const { t } = useTranslation(); + const classes = useStyle(); + const [selectedAddress, setSelectedAddress] = useState(); + const { setLocation } = useLocationContext(); + + const setDeliveryAddress = (item) => { + + setSelectedAddress(item); + setLocation({ + _id: item?._id, + label: item?.label, + latitude: Number(item?.location.coordinates[1]), + longitude: Number(item?.location.coordinates[0]), + deliveryAddress: item?.deliveryAddress, + details: item?.details, + }); + }; + + return ( + + + + {t('myAddresses')} + + +
+ + + + + ); +} + +export default React.memo(AddressCard); diff --git a/enatega-multivendor-web/src/components/Profile/AddressCard/styles.js b/enatega-multivendor-web/src/components/Profile/AddressCard/styles.js new file mode 100644 index 0000000..6b6730d --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/AddressCard/styles.js @@ -0,0 +1,54 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + MH3: { + margin: theme.spacing(3, 0), + }, + mainContainer: { + justifyContent: "center", + "& .MuiTextField-root": { + marginBottom: theme.spacing(0), + }, + }, + profileContainer: { + padding: theme.spacing(3, 3), + backgroundColor: theme.palette.common.white, + borderRadius: 30, + }, + textBold: { + fontWeight: 700, + }, + btnContainer: { + display: "flex", + justifyContent: "center", + }, + headerBar: { + background: + "linear-gradient(261.53deg, theme.palette.success.light -8.04%, theme.palette.primary.main 111.96%)", + borderRadius: 30, + height: 80, + display: "flex", + alignItems: "center", + }, + titleText: { + fontWeight: 600, + marginLeft: 20, + fontSize: "1.2rem", + }, + fieldWrapper: { + display: "flex", + alignItems: "center", + marginBottom: theme.spacing(3), + }, + formMargin: { + marginTop: 30, + }, + btn: { + borderRadius: "10px !important", + height: "40px !important", + background: theme.palette.primary.main, + width: 120, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Profile/PasswordCard/PasswordCard.js b/enatega-multivendor-web/src/components/Profile/PasswordCard/PasswordCard.js new file mode 100644 index 0000000..2f688ad --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/PasswordCard/PasswordCard.js @@ -0,0 +1,186 @@ +import { gql, useMutation } from "@apollo/client"; +import { + Button, + CircularProgress, + Grid, + Typography, + Box, + useTheme, + IconButton, +} from "@mui/material"; +import React, { useCallback, useRef, useState } from "react"; +import { changePassword } from "../../../apollo/server"; +import FlashMessage from "../../FlashMessage"; +import useStyle from "./styles"; +import PasswordIcon from "@mui/icons-material/Password"; +import { Visibility, VisibilityOff } from "@mui/icons-material"; +import { useTranslation } from 'react-i18next'; + +const CHANGE_PASSWORD = gql` + ${changePassword} +`; + +function PasswordCard() { + const { t } = useTranslation(); + const theme = useTheme(); + const formRef = useRef(null); + const classes = useStyle(); + const [passError, setPassError] = useState(""); + const [confirmError, setConfirmError] = useState(""); + const [error, setError] = useState({}); + const [mutate, { loading }] = useMutation(CHANGE_PASSWORD, { + onError, + onCompleted, + }); + const [showCurrentPassword, setShowCurrentPassword] = useState(false); + const [showNewPassword, setShowNewPassword] = useState(false); + + function onError(error) { + setError({ type: "error", message: error.message }); + } + + function onCompleted(data) { + if (data.changePassword) { + clearErrors(); + setError({ type: "success", message: "Password Updated" }); + } else { + setError({ type: "error", message: "Invalid password" }); + } + } + + const clearErrors = useCallback(() => { + setPassError(""); + setConfirmError(""); + setError({}); + }, []); + + const handleAction = () => { + console.log(passError + " " + confirmError); + clearErrors(); + let validate = true; + const oldPassword = formRef.current["currentPassword"].value; + const newPassword = formRef.current["newPassword"].value; + + // Password validation requirements + const passwordRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/; // At least 8 characters, one lowercase letter, one uppercase letter, one number + if (!passwordRegex.test(newPassword)) { + setConfirmError("Password must be at least 8 characters long and contain at least one lowercase letter, one uppercase letter, and one number"); + validate = false; + return; + } + + if (!oldPassword) { + setPassError("Current password is required"); + validate = false; + return; + } + if (!newPassword) { + setConfirmError("New password is required"); + validate = false; + return; + } + if (validate) { + mutate({ variables: { oldPassword, newPassword } }); + } else { + setError({ type: "error", message: "Invalid password" }); + } + }; + + const toggleSnackbar = useCallback(() => { + setError({}); + }, []); + + const handleTogglePasswordVisibility = (field) => { + if (field === "current") { + setShowCurrentPassword((prevShowCurrentPassword) => !prevShowCurrentPassword); + } else if (field === "new") { + setShowNewPassword((prevShowNewPassword) => !prevShowNewPassword); + } + }; + + return ( + + + + + {t('passwordInfo')} + +
+ + + + handleTogglePasswordVisibility("current")} + aria-label="toggle current password visibility" + edge="end" + > + {showCurrentPassword ? : } + + + {passError && {passError}} + + + + handleTogglePasswordVisibility("new")} + aria-label="toggle new password visibility" + edge="end" + > + {showNewPassword ? : } + + + {confirmError && {confirmError}} + + + +
+
+
+ ); +} + +export default React.memo(PasswordCard); diff --git a/enatega-multivendor-web/src/components/Profile/PasswordCard/styles.js b/enatega-multivendor-web/src/components/Profile/PasswordCard/styles.js new file mode 100644 index 0000000..5e72a7e --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/PasswordCard/styles.js @@ -0,0 +1,63 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + MH3: { + margin: theme.spacing(3, 0), + }, + mainContainer: { + justifyContent: "center", + }, + profileContainer: { + padding: theme.spacing(3, 3), + backgroundColor: theme.palette.common.white, + borderRadius: 30, + }, + textBold: { + fontWeight: 700, + }, + btnContainer: { + display: "flex", + justifyContent: "center", + }, + headerBar: { + background: + "linear-gradient(261.53deg, theme.palette.success.light -8.04%, theme.palette.primary.main 111.96%)", + borderRadius: 30, + height: 80, + display: "flex", + alignItems: "center", + }, + titleText: { + fontWeight: 600, + marginLeft: 20, + fontSize: "1.2rem", + }, + fieldWrapper: { + display: "flex", + alignItems: "center", + marginBottom: theme.spacing(3), + }, + formMargin: { + marginTop: 30, + }, + btn: { + borderRadius: "10px !important", + height: "40px !important", + background: theme.palette.primary.main, + width: 120, + }, + MB0: { + marginBottom: "0px !important", + }, + textField: { + color: theme.palette.grey[600], + padding: 10, + fontSize: "1.2rem", + width: "100%", + borderRadius: 20, + border: "none", + backgroundColor: "#F3F4F8", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Profile/ProfileCard/ProfileCard.js b/enatega-multivendor-web/src/components/Profile/ProfileCard/ProfileCard.js new file mode 100644 index 0000000..d25c389 --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/ProfileCard/ProfileCard.js @@ -0,0 +1,210 @@ +import { useMutation } from "@apollo/client"; +import { + Button, + CircularProgress, + Grid, + Tooltip, + Typography, + Box, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { useCallback, useContext, useRef, useState } from "react"; +import { updateUser } from "../../../apollo/server"; +import UserContext from "../../../context/User"; +import FlashMessage from "../../FlashMessage"; +import useStyle from "./styles"; +import IconButton from "@mui/material/IconButton"; +import VerifiedIcon from "@mui/icons-material/Verified"; +import UnpublishedIcon from "@mui/icons-material/Unpublished"; +import { Link as RouterLink } from "react-router-dom"; +import PersonIcon from "@mui/icons-material/Person"; +import EmailIcon from "@mui/icons-material/Email"; +import PhoneIcon from "@mui/icons-material/Phone"; +import { useTranslation } from 'react-i18next'; + +const UPDATEUSER = gql` + ${updateUser} +`; + +function ProfileCard() { + const { t } = useTranslation(); + const theme = useTheme(); + const formRef = useRef(null); + const classes = useStyle(); + const [nameError, setNameError] = useState(""); + // const [phoneError, setPhoneError] = useState(""); + const { profile } = useContext(UserContext); + const [error, setError] = useState({}); + const [mutate, { loading }] = useMutation(UPDATEUSER, { + onCompleted, + onError, + }); + function onError(error) { + setError({ type: "error", message: error.message }); + } + + function onCompleted({ updateUser }) { + if (updateUser) { + setError({ type: "success", message: "User's Info Updated" }); + } + } + + const clearErrors = useCallback(() => { + setNameError(""); + // setPhoneError(""); + setError({}); + }, []); + + const handleAction = () => { + clearErrors(); + let validate = true; + const name = formRef.current["name"].value; + + if (!name) { + setNameError("Name is required"); + validate = false; + return; + } + if (validate) { + mutate({ + variables: { + name: name, + }, + }); + } else { + setError({ type: "error", message: "Something is missing" }); + } + }; + + const toggleSnackbar = useCallback(() => { + setError({}); + }, []); + + return ( + + + + {/* */} + + {t('contactInfo')} + +
+ + + + + + + + + + + + + + + + {t('edit')} + + + + {profile?.phoneIsVerified ? ( + <> + + + + + ) : ( + profile?.phone && ( + <> + + + Verify? + + + + + + + + ) + )} + + + + + + + +
+
+
+ ); +} + +export default React.memo(ProfileCard); diff --git a/enatega-multivendor-web/src/components/Profile/ProfileCard/styles.js b/enatega-multivendor-web/src/components/Profile/ProfileCard/styles.js new file mode 100644 index 0000000..65519d2 --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/ProfileCard/styles.js @@ -0,0 +1,64 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + MH3: { + margin: theme.spacing(3, 0), + }, + + mainContainer: { + justifyContent: "center", + }, + MB0: { + marginBottom: "0px !important", + }, + profileContainer: { + padding: theme.spacing(3, 3), + backgroundColor: theme.palette.common.white, + borderRadius: 30, + }, + textBold: { + fontWeight: 700, + }, + btnContainer: { + display: "flex", + justifyContent: "center", + }, + headerBar: { + background: + "linear-gradient(261.53deg, theme.palette.success.light -8.04%, theme.palette.primary.main 111.96%)", + borderRadius: 30, + height: 80, + display: "flex", + alignItems: "center", + }, + titleText: { + fontWeight: 600, + marginLeft: 20, + fontSize: "1.2rem", + }, + fieldWrapper: { + display: "flex", + alignItems: "center", + marginBottom: theme.spacing(3), + }, + formMargin: { + marginTop: 30, + }, + btn: { + borderRadius: "10px !important", + height: "40px !important", + background: theme.palette.primary.main, + width: 120, + }, + textField: { + color: theme.palette.grey[600], + padding: 10, + fontSize: "1.2rem", + width: "100%", + borderRadius: 20, + border: "none", + backgroundColor: "#F3F4F8", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/Profile/index.js b/enatega-multivendor-web/src/components/Profile/index.js new file mode 100644 index 0000000..a81e2b1 --- /dev/null +++ b/enatega-multivendor-web/src/components/Profile/index.js @@ -0,0 +1,5 @@ +import ProfileCard from "./ProfileCard/ProfileCard"; +import PasswordCard from "./PasswordCard/PasswordCard"; +import AddressCard from "./AddressCard/AddressCard"; + +export { ProfileCard, PasswordCard, AddressCard }; diff --git a/enatega-multivendor-web/src/components/Promotion/Promotion.js b/enatega-multivendor-web/src/components/Promotion/Promotion.js new file mode 100644 index 0000000..c829724 --- /dev/null +++ b/enatega-multivendor-web/src/components/Promotion/Promotion.js @@ -0,0 +1,52 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Hidden, + Typography, + useTheme, + Link as MaterialLink, +} from "@mui/material"; +import React from "react"; +import AppStoreIcon from "../../assets/icons/AppStoreIcon"; +import PlayStoreIcon from "../../assets/icons/PlayStoreIcon"; +import useStyles from "./styles"; + +export default function Promotion() { + const theme = useTheme(); + const classes = useStyles(); + return ( + + + delivery status + + Download our free app! + + + + + + + + + + + ); +} diff --git a/enatega-multivendor-web/src/components/Promotion/styles.js b/enatega-multivendor-web/src/components/Promotion/styles.js new file mode 100644 index 0000000..436d88b --- /dev/null +++ b/enatega-multivendor-web/src/components/Promotion/styles.js @@ -0,0 +1,41 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + contentContainer: { + padding: theme.spacing(0, 3), + }, + center: { + justifyContent: "center", + }, + textBold: { + fontWeight: 700, + }, + heading: { + fontSize: "2.175rem", + }, + bottomContainer: { + marginTop: theme.spacing(10), + backgroundColor: theme.palette.grey[100], + }, + w70: { + width: "70%", + }, + mv2: { + margin: theme.spacing(2, 0), + }, + mt3: { + marginTop: theme.spacing(3), + }, + ph1: { + padding: theme.spacing(0, 1), + }, + + disabledText: { + color: theme.palette.text.disabled, + }, + smallText: { + fontSize: "0.875rem", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Card/Card.js b/enatega-multivendor-web/src/components/RestaurantComponent/Card/Card.js new file mode 100644 index 0000000..b62eb9f --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Card/Card.js @@ -0,0 +1,341 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useMutation } from "@apollo/client"; +import { + Box, + CircularProgress, + Divider, + Card as ICard, + Typography, + CardActionArea, + useTheme, +} from "@mui/material"; +import FavoriteIcon from "@mui/icons-material/Favorite"; +import FavoriteBorderIcon from "@mui/icons-material/FavoriteBorder"; +import StarSharpIcon from "@mui/icons-material/StarSharp"; +import gql from "graphql-tag"; +import React, { useCallback, useContext } from "react"; +import { useNavigate } from "react-router-dom"; +import { addFavouriteRestaurant, profile } from "../../../apollo/server"; +import ConfigurationContext from "../../../context/Configuration"; +import UserContext from "../../../context/User"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +const ADD_FAVOURITE = gql` + ${addFavouriteRestaurant} +`; +const PROFILE = gql` + ${profile} +`; + +function PricingDelivery({ + grid, + minimum, + deliveryCharges, + currencySymbol, + isSmall, + index, +}) { + + const classes = useStyles(); + const theme = useTheme(); + const containerStyle = !grid + ? { + display: "flex", + alignItems: "center", + justifyContent: isSmall ? "center" : "flex-start", + } + : { display: "block" }; + return ( + + + + {currencySymbol} {minimum} + + + Minimum + + + {grid && ( + + )} + + + {deliveryCharges > 0 ? `${currencySymbol} ${deliveryCharges}` : ``} + + + {deliveryCharges > 0 ? "delivery fee" : ""} + + + + ); +} +function Card(props) { + const { t } = useTranslation(); + const item = props.data ?? null; + const navigateTo = useNavigate(); + const { profile } = useContext(UserContext); + const theme = useTheme(); + const grid = props.grid ? props.grid : false; + const heart = profile ? profile.favourite.includes(item?._id) : false; + const cardImageHeight = props.cardImageHeight + ? props.cardImageHeight + : "144px"; + const category = item.categories.map((category) => category.title); + const configuration = useContext(ConfigurationContext); + const classes = useStyles(props); + const [mutate, { loading }] = useMutation(ADD_FAVOURITE, { + onCompleted, + refetchQueries: [{ query: PROFILE }], + }); + + function onCompleted() { + props.showMessage({ + type: "success", + message: t('favouriteListUpdated'), + }); + } + + const navigate = useCallback(() => { + if ( + props.checkCart(item._id, item.name, item.image, item.slug) && + !loading + ) { + navigateTo(`/restaurant/${item.slug}`, { + state: { + id: item._id, + name: item.name, + image: item.image, + slug: item.slug, + }, + }); + } + }, [navigateTo, item._id]); + + return ( + + { + e.preventDefault(); + navigate(); + }} + > + + + + + + {item.deliveryTime} + + + {" "} + MIN + + + e.stopPropagation()} + size="small" + disabled={loading} + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + if (!profile) { + props.showMessage({ + type: "error", + message: "You are not logged in.", + }); + } + if (!loading && profile) { + mutate({ variables: { id: item._id } }); + } + }} + className={ + props.isSmall ? classes.smallHeartBtn : classes.heartBtn + } + > + {loading ? ( + + ) : heart ? ( + + ) : ( + + )} + + + + + {item.name} + + + + + {item.reviewData.ratings} + + + /5 + + + ({item.reviewData.reviews.length}) + + + + + + {category.toString()} + + + + + + + ); +} + +export default React.memo(Card); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Card/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/Card/styles.js new file mode 100644 index 0000000..2842077 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Card/styles.js @@ -0,0 +1,130 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + imageContainer: { + width: "100%", + height: "144px", + position: "relative", + overflow: "hidden", + borderRadius: 15, + }, + imgContainer: { + backgroundSize: "cover", + backgroundPositionX: "50%", + backgroundPositionY: "center", + transition: "transform 0.2s", + height: "100%", + "&:hover": { + transform: "scale(1.1)", + }, + }, + timeText: { + ...theme.typography.caption, + fontSize: "0.5rem", + textAlign: "center", + lineHeight: "normal", + display: "inline", + fontWeight: 700, + }, + timeContainer: { + padding: "5px 10px", + backgroundColor: theme.palette.primary.light, + position: "absolute", + left: "10px", + top: "10px", + borderRadius: "0.75rem", + }, + offText: { + textAlign: "center", + color: theme.palette.text.primary, + fontWeight: 700, + }, + offContainer: { + padding: "5px 15px", + backgroundColor: theme.palette.primary.main, + position: "absolute", + top: "10px", + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + totalRatingText: { + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + subDescription: { + color: theme.palette.text.disabled, + overflow: "hidden", + fontSize: "0.875rem", + flex: 0.9, + }, + priceText: { + fontWeight: 700, + fontSize: "0.875rem", + }, + priceDescription: { + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + heartBtn: { + minWidth: "36px", + height: "36px", + borderRadius: "18px", + backgroundColor: theme.palette.common.white, + position: "absolute", + top: "10px", + right: "10px", + display: "flex", + justifyContent: "center", + alignItems: "center", + "&:hover": { + backgroundColor: theme.palette.common.white, + }, + "&:disabled": { + backgroundColor: theme.palette.common.white, + }, + }, + smallHeartBtn: { + minWidth: "30px", + height: "30px", + borderRadius: "18px", + backgroundColor: theme.palette.common.white, + position: "absolute", + top: "10px", + right: "10px", + display: "flex", + justifyContent: "center", + alignItems: "center", + "&:hover": { + backgroundColor: theme.palette.common.white, + }, + "&:disabled": { + backgroundColor: theme.palette.common.white, + }, + }, + card: { + backgroundColor: "white", + boxShadow: theme.shadows[0], + borderRadius: 25, + padding: 8, + }, + icon: { + color: "black", + }, + row: { + marginTop: 10, + width: "90%", + margin: "auto", + }, + largeWidth: { + minWidth: "200px", + }, + smallWidth: { + width: "200px", + [theme.breakpoints.down("md")]: { + width: "150px", + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/RestaurantGrid.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/RestaurantGrid.js new file mode 100644 index 0000000..2033608 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/RestaurantGrid.js @@ -0,0 +1,78 @@ +import { Box, Grid, Typography, useMediaQuery, useTheme } from "@mui/material"; +import React from "react"; +import Card from "../Card/Card"; +import Title from "../Title/Title"; +import useStyles from "./styles"; +import { ReactComponent as EmptyIcon } from "../../../assets/images/empty-search.svg"; +import { useTranslation } from 'react-i18next'; + +function RestaurantGrid(props) { + const { t } = useTranslation(); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + + return ( + + + + + + + <Box mt={5} /> + <Grid container rowSpacing={8} columnSpacing={{ xs: 0, md: 4 }} > + {props.restaurants.length < 1 ? ( + <Grid container item xs={12} justifyContent="center"> + <Box display="flex" flexDirection="column" alignItems="center"> + <EmptyIcon /> + <Typography + variant="h5" + align="center" + color="textSecondary" + style={{ fontWeight: 800, marginTop: 15 }} + > + {props?.search + ? "That's not in the list" + : "No restaurants found"}{" "} + </Typography> + <Typography + variant="h5" + align="center" + color="textSecondary" + style={{ fontWeight: 800, marginTop: 15 }} + > + {props?.search && "yet"} + </Typography> + <Typography + variant="h6" + align="center" + color="textSecondary" + style={{ marginTop: 15 }} + > + {props?.search && "Try different search"} + </Typography> + </Box> + </Grid> + ) : ( + props.restaurants.map((value, index) => ( + <Grid key={index} item xs={12} sm={12} md={4}> + <Card + data={value} + cardImageHeight="144px" + grid={true} + checkCart={props.checkCart} + showMessage={props.showMessage} + isSmall={false} + /> + </Grid> + )) + )} + </Grid> + </Grid> + <Grid item sm={1} /> + </Grid> + </Box> + ); +} + +export default React.memo(RestaurantGrid); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/styles.js new file mode 100644 index 0000000..0259ca5 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGrid/styles.js @@ -0,0 +1,33 @@ +import makeStyles from "@mui/styles/makeStyles"; +import { useTheme } from "@mui/material"; +import Restaurants from "../../../assets/images/restaurants.png"; + +const useStyle = makeStyles((theme) => { + const currentTheme = useTheme(); + + return { + mainContainer: { + padding: (extraSmall) => (extraSmall ? "5px" : "0px"), + backgroundColor: currentTheme.palette.success.dark, + position: "relative", + minHeight: "100vh", + backgroundImage: `url(${Restaurants})`, + backgroundSize: "contain", + backgroundPosition: "right", + backgroundRepeat: "no-repeat", + }, + bgImage: { + position: "absolute", + top: 0, + right: 0, + zIndex: -9, + }, + divider: { + width: "180px", + backgroundColor: currentTheme.palette.success.dark, // Use currentTheme here + height: 10, + }, + }; +}); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/RestaurantGridForPickup.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/RestaurantGridForPickup.js new file mode 100644 index 0000000..756145c --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/RestaurantGridForPickup.js @@ -0,0 +1,56 @@ +import { Grid, Typography, useMediaQuery, useTheme } from "@mui/material"; +import React from "react"; +import Card from "../Card/Card"; +import Title from "../Title/Title"; +import useStyles from "./styles"; + +function RestaurantGridForPickup(props) { + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + + return ( + <Grid container item className={classes.mainContainer}> + <Grid item sm={1} /> + <Grid item xs={12} sm={10} spacing={1}> + <Title title="All restaurants" /> + <Grid container spacing={2}> + {props.restaurants?.length < 1 ? ( + <Grid container item xs={12} justifyContent="center"> + <Typography + variant="h5" + align="center" + color="textSecondary" + > + No restaurants found + </Typography> + </Grid> + ) : ( + props.restaurants?.map((value, index) => ( + <Grid + tabIndex="0" + id={value._id} + className={classes.card} + key={index} + p={2} + item + xs={12} + > + <Card + data={value} + cardImageHeight="200px" + grid={true} + checkCart={props.checkCart} + showMessage={props.showMessage} + /> + </Grid> + )) + )} + </Grid> + </Grid> + <Grid item sm={1} /> + </Grid> + ); +} + +export default RestaurantGridForPickup; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/styles.js new file mode 100644 index 0000000..931b62f --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantGridForPickup/styles.js @@ -0,0 +1,20 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + mainContainer: { + marginTop: "50px", + padding: (extraSmall) => (extraSmall ? "0px 5vw" : "0px"), + }, + card: { + "&:hover": { + boxShadow: `0 0 10px ${theme.palette.grey[300]}`, + border: `2px solid ${theme.palette.primary.main}`, + }, + "&:focus": { + boxShadow: `0 0 10px ${theme.palette.grey[300]}`, + border: `2px solid ${theme.palette.primary.main}`, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/RestaurantSection.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/RestaurantSection.js new file mode 100644 index 0000000..d3f0475 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/RestaurantSection.js @@ -0,0 +1,103 @@ +import { Box, Button, Grid, useMediaQuery, useTheme } from "@mui/material"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import ArrowForwardIcon from "@mui/icons-material/ArrowForward"; +import React, { useCallback, useRef } from "react"; +import Card from "../Card/Card"; +import Title from "../Title/Title"; +import useStyles from "./styles"; + +function RestaurantSection(props) { + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const small = useMediaQuery(theme.breakpoints.down("md")); + const classes = useStyles(extraSmall); + const ref = useRef([]); + + const ScrollLeft = useCallback((index1) => { + ref.current[index1].scrollTo({ + left: ref.current[index1].scrollLeft + 500, + behavior: "smooth", + }); + }, []); + + const ScrollRight = useCallback((index1) => { + ref.current[index1].scrollTo({ + left: ref.current[index1].scrollLeft - 500, + behavior: "smooth", + }); + }, []); + + return ( + <Grid container item className={classes.mainContainer}> + <Grid item sm={1} /> + <Grid item xs={12} sm={10}> + {props.restaurantSections.map((section, index1) => ( + <Box + style={{ marginTop: "50px", position: "relative", width: "100%" }} + key={section._id} + > + {section.restaurants.length > 4 && ( + <Button + className={classes.nextButtonStyles} + style={{ + left: "-2vw", + }} + onClick={() => ScrollRight(index1)} + > + <ArrowBackIcon style={{ color: "black", fontSize: 40 }} /> + </Button> + )} + <Box className={classes.divider} /> + + <Title title={section.name} /> + <Box + style={{ + overflow: "auto", + whiteSpace: "nowrap", + marginLeft: small ? "0px" : "40px", + marginRight: small ? "0px" : "40px", + }} + ref={(el) => (ref.current[index1] = el)} + className={classes.restauranCardContainer} + > + {section.restaurants.map((data, index) => ( + <Box + style={{ + display: "inline-block", + marginRight: small ? "4px" : "25px", + }} + key={index} + > + <Card + data={data} + cardImageHeight="144px" + showMessage={props.showMessage} + checkCart={props.checkCart} + isSmall={true} + index={index} + /> + </Box> + ))} + </Box> + {section.restaurants.length > 4 && ( + <Button + className={classes.nextButtonStyles} + style={{ + right: "-2vw", + }} + onClick={() => ScrollLeft(index1)} + > + <ArrowForwardIcon + style={{ color: small ? "00FFFFFF" : "black", fontSize: 40 }} + /> + </Button> + )} + </Box> + ))} + </Grid> + <Grid item sm={1} /> + </Grid> + ); +} + +export default React.memo(RestaurantSection); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/styles.js new file mode 100644 index 0000000..836a15b --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/RestaurantSection/styles.js @@ -0,0 +1,38 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + restauranCardContainer: { + msOverflowStyle: "none", + scrollbarWidth: "none", + "&::-webkit-scrollbar": { + display: "none", + }, + }, + nextButtonStyles: { + minWidth: "auto", + width: "40px", + height: "50px", + position: "absolute", + top: "50%", + zIndex: 5, + borderRadius: "inherit", + + [theme.breakpoints.down("md")]: { + zIndex: -999, + }, + }, + mainContainer: { + padding: (extraSmall) => (extraSmall ? "0px 2vw" : "0px"), + marginBottom: 40, + [theme.breakpoints.down("md")]: { + width: "100%", + }, + }, + divider: { + width: "165px", + backgroundColor: "#448B7B", + height: 10, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/SearchRestaurant.js b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/SearchRestaurant.js new file mode 100644 index 0000000..9567962 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/SearchRestaurant.js @@ -0,0 +1,63 @@ +import { + Button, + Grid, + Input, + Paper, + useMediaQuery, + useTheme, +} from "@mui/material"; +import HighlightOffIcon from "@mui/icons-material/HighlightOff"; +import React from "react"; +import SearchIcon from "../../../assets/icons/SearchIcon"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +function SearchRestaurant({ search, setSearch }) { + const { t } = useTranslation(); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + + return ( + <Grid container item className={`${classes.root}`}> + <Grid container item xs={12} className={classes.searchContainer}> + <Paper + elevation={0} + style={{ + display: "flex", + flex: 1, + alignItems: "center", + padding: "12px", + background: theme.palette.common.white, + borderRadius: 5, + }} + > + <SearchIcon /> + <Input + disableUnderline={true} + fullWidth + type="text" + placeholder= {t('searchRestaurantPlaceholder')} + value={search} + onChange={(event) => setSearch(event.target.value)} + inputProps={{ + style: { + borderWidth: 0, + textOverflow: "ellipsis", + }, + }} + /> + {search ? ( + <Button onClick={() => setSearch("")} style={{ maxWidth: "auto" }}> + <HighlightOffIcon + style={{ color: theme.palette.text.secondary }} + /> + </Button> + ) : null} + </Paper> + </Grid> + </Grid> + ); +} + +export default React.memo(SearchRestaurant); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/styles.js new file mode 100644 index 0000000..69f7b84 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/styles.js @@ -0,0 +1,20 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiInput-root": { + marginLeft: "10px", + caretColor: theme.palette.primary.main, + color: theme.palette.text.secondary, + }, + }, + mt: { + marginTop: theme.spacing(6), + }, + searchContainer: { + //padding: (extraSmall) => (extraSmall ? "0px 5vw" : "0px"), + boxShadow: "0px 0px 20px 1px rgba(0,0,0,0.2)", + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/temp.js b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/temp.js new file mode 100644 index 0000000..7a8971a --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/SearchRestaurant/temp.js @@ -0,0 +1,62 @@ +import { + Button, + Grid, + Input, + Paper, + useMediaQuery, + useTheme, +} from "@mui/material"; +import HighlightOffIcon from "@mui/icons-material/HighlightOff"; +import React from "react"; +import SearchIcon from "../../../assets/icons/SearchIcon"; +import useStyles from "./styles"; + +function SearchRestaurant({ search, setSearch }) { + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(extraSmall); + + return ( + <Grid container item className={`${classes.mt} ${classes.root}`}> + <Grid item xs={1} sm={1} /> + <Grid container item xs={10} sm={8} className={classes.searchContainer}> + <Paper + elevation={0} + style={{ + display: "flex", + flex: 1, + alignItems: "center", + padding: "20px", + background: theme.palette.common.white, + borderRadius: 0, + }} + > + <SearchIcon /> + <Input + disableUnderline={true} + fullWidth + type="text" + placeholder="Search for restaurant and cuisines" + value={search} + onChange={(event) => setSearch(event.target.value)} + inputProps={{ + style: { + borderWidth: 0, + textOverflow: "ellipsis", + }, + }} + /> + {search ? ( + <Button onClick={() => setSearch("")} style={{ maxWidth: "auto" }}> + <HighlightOffIcon + style={{ color: theme.palette.text.secondary }} + /> + </Button> + ) : null} + </Paper> + </Grid> + </Grid> + ); +} + +export default React.memo(SearchRestaurant); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/Subheader.js b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/Subheader.js new file mode 100644 index 0000000..65a3da2 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/Subheader.js @@ -0,0 +1,356 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Button, + Container, + Divider, + Grid, + InputAdornment, + TextField, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import LocationOnIcon from "@mui/icons-material/LocationOn"; +import Autocomplete from "@mui/material/Autocomplete"; +import parse from "autosuggest-highlight/parse"; +import throttle from "lodash/throttle"; +import React, { useEffect, useState } from "react"; +import SyncLoader from "react-spinners/SyncLoader"; +import LocationIcon from "../../../assets/icons/LocationIcon"; +import { ReactComponent as ArrowIcon } from "../../../assets/images/arrow.svg"; +import RightIcon from "../../../assets/icons/RightIcon"; +import { useLocationContext } from "../../../context/Location"; +import { useLocation } from "../../../hooks"; +import FlashMessage from "../../FlashMessage"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; +import { DeliveryCard } from "../../Checkout"; + +const autocompleteService = { current: null }; + +function Subheader() { + const { t } = useTranslation(); + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("sm")); + const spacingTop = mobile ? "52px" : "63px"; + const classes = useStyles(); + const [expand, setExpand] = useState(false); + const { location, setLocation } = useLocationContext(); + const { getCurrentLocation } = useLocation(); + const [search, setSearch] = useState( + location ? location.deliveryAddress : "" + ); + const [open, setOpen] = useState(false); + const [alertMessage, setAlertMessage] = useState(); + const [value, setValue] = useState(null); + const [inputValue, setInputValue] = useState(""); + const [options, setOptions] = useState([]); + const [latLng, setLatLng] = useState({}); + const [loading, setLoading] = useState(); + const [selectedAddress, setSelectedAddress] = useState(); + + const setDeliveryAddress = (item) => { + setSelectedAddress(item); + setLocation({ + _id: item?._id, + label: item?.label, + latitude: Number(item?.location.coordinates[1]), + longitude: Number(item?.location.coordinates[0]), + deliveryAddress: item?.deliveryAddress, + details: item?.details, + }); + }; + const fetch = React.useMemo( + () => + throttle((request, callback) => { + autocompleteService.current.getPlacePredictions(request, callback); + }, 200), + [] + ); + + useEffect(() => { + let active = true; + + if (!autocompleteService.current && window.google) { + autocompleteService.current = + new window.google.maps.places.AutocompleteService(); + } + if (!autocompleteService.current) { + return undefined; + } + + if (inputValue === "") { + setOptions(value ? [value] : []); + return undefined; + } + + fetch({ input: inputValue }, (results) => { + if (active) { + let newOptions = []; + + if (value) { + newOptions = [value]; + } + + if (results) { + newOptions = [...newOptions, ...results]; + } + + setOptions(newOptions); + } + }); + + return () => { + active = false; + }; + }, [value, inputValue, fetch]); + + const locationCallback = (error, data) => { + setLoading(false); + if (error) { + setAlertMessage(error); + setOpen(true); + return; + } + setSearch(data?.deliveryAddress ?? ""); + setValue(data?.deliveryAddress ?? ""); + setLatLng({ + lat: data.latitude, + lng: data.longitude, + }); + }; + return ( + <Box + style={{ + top: spacingTop, + }} + className={classes.upsideContainer} + > + <Box + style={{ + overflowY: "auto", // Make the inner Box scrollable + marginTop: "60px", + maxHeight: `calc(100vh - ${spacingTop})`, // Limit the inner Box height + }} + className={`${classes.root} ${classes.shadow} ${classes.mainContainer}`} + > + <FlashMessage alertMessage={alertMessage} open={open} setOpen={setOpen} /> + <Grid container> + <Grid item xs={12}> + <Button + style={{ + display: mobile ? "block" : "flex", + }} + className={classes.addressBtn} + onClick={() => setExpand(!expand)} + > + <Typography + variant="body1" + color="textSecondary" + className={`${classes.smallText} ${classes.upperContainer}`} + style={{ + backgroundColor: theme.palette.primary.main, + fontWeight: theme.typography.fontWeightBold, + }} + > + {t('deliveringTo')} + </Typography> + <Box + style={{ + display: "flex", + alignItems: "center", + backgroundColor: "rgb(216 222 232 / 63%)", + justifyContent: "space-between", + flexGrow: 1, + padding: "17px", + borderTopRightRadius: mobile ? 0 : 20, + borderBottomRightRadius: mobile ? 0 : 20, + }} + > + <Typography + variant="body1" + color="textSecondary" + className={`${classes.smallText} ${classes.mr10} ${classes.textMBold}`} + > + {location?.deliveryAddress} + </Typography> + {!expand ? ( + <ArrowIcon /> + ) : ( + <ArrowIcon style={{ transform: "rotate(180deg)" }} /> + )} + </Box> + </Button> + </Grid> + </Grid> + {expand && ( + <> + <Box + style={{ + width: "100%", + padding: "20px 0px", + display: "flex", + marginTop: "10px", + alignItems: "center", + }} + > + <Container style={{ display: "flex", marginLeft: "0px" }}> + <Autocomplete + style={{ width: "100%" }} + id="google-map-demo" + getOptionLabel={(option) => + typeof option === "string" ? option : option.description + } + filterOptions={(x) => x} + options={options} + autoComplete + includeInputInList + filterSelectedOptions + value={value ? value : search ?? "Loading ..."} + onChange={(event, newValue) => { + if (newValue) { + const b = new window.google.maps.Geocoder(); + b.geocode({ placeId: newValue.place_id }, (res) => { + const location = res[0].geometry.location; + setSearch(res[0].formatted_address); + setLatLng({ + lat: location.lat(), + lng: location.lng(), + }); + }); + } else { + setSearch(""); + setLatLng({}); + } + setOptions(newValue ? [newValue, ...options] : options); + setValue(newValue); + }} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => ( + <TextField + {...params} + style={{ + color: "initial", + backgroundColor: "#F3F4F8", + borderRadius: 20, + }} + variant="outlined" + label="Enter your full address" + fullWidth + InputProps={{ + ...params.InputProps, + endAdornment: ( + <> + {params.InputProps.endAdornment} + <InputAdornment + position="end" + onClick={(e) => { + e.preventDefault(); + setLoading(true); + getCurrentLocation(locationCallback); + }} + > + {loading ? ( + <SyncLoader + color={theme.palette.primary.main} + size={5} + speedMultiplier={0.7} + margin={1} + /> + ) : ( + <LocationIcon style={{ fill: "#3C8F7C" }} /> + )} + </InputAdornment> + </> + ), + }} + /> + )} + renderOption={(props, option) => { + const matches = + option.structured_formatting.main_text_matched_substrings; + let parts = null; + if (matches) { + parts = parse( + option.structured_formatting.main_text, + matches.map((match) => [ + match.offset, + match.offset + match.length, + ]) + ); + } + return ( + <Grid {...props} container alignItems="center"> + <Grid item> + <LocationOnIcon className={classes.icon} /> + </Grid> + <Grid item xs> + {parts && + parts.map((part, index) => ( + <span + key={index} + style={{ + fontWeight: part.highlight ? 700 : 400, + color: "black", + }} + > + {part.text} + </span> + ))} + + <Typography variant="body2" color="textSecondary"> + {option.structured_formatting.secondary_text} + </Typography> + </Grid> + </Grid> + ); + }} + /> + </Container> + </Box> + <Box display="flex" justifyContent="center" mb={2}> + <Button + onClick={(e) => { + e.preventDefault(); + setExpand(false); + if (search) { + setLocation({ + label: "Home", + latitude: latLng.lat, + longitude: latLng.lng, + deliveryAddress: search, + }); + } + }} + className={classes.button} + > + <RightIcon /> + </Button> + </Box> + <Divider + orientation="horizontal" + style={{ + backgroundColor: theme.palette.common.black, + width: "80%", + margin: "auto", + }} + /> + <Box style={{ margin: "auto", width: "90%" }}> + <DeliveryCard + selectedAddress={selectedAddress} + setSelectedAddress={setDeliveryAddress} + isProfile={true} + isModal={true} + /> + </Box> + </> + )} + </Box> + </Box> + ); +} + +export default React.memo(Subheader); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/styles.js b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/styles.js new file mode 100644 index 0000000..8d25aff --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/styles.js @@ -0,0 +1,103 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + root: { + "& .MuiInputBase-root": { + color: theme.palette.text.secondary, + }, + "& label.Mui-focused": { + color: theme.palette.text.secondary, + }, + "& .MuiInput-underline:after": { + borderColor: theme.palette.grey["300"], + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey["300"], + borderRadius: 20, + }, + "&:hover fieldset": { + borderColor: theme.palette.grey["300"], + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.grey["300"], + }, + }, + }, + icon: { + color: theme.palette.text.secondary, + marginRight: theme.spacing(2), + }, + upsideContainer: { + position: "fixed", + maxHeight: "100%", // Set the maximum height to the viewport height + minWidth: "670px", + zIndex: 1300, + top: "63px", + [theme.breakpoints.down("sm")]: { + minWidth: "300px", + width: "95%", + top: "63px", + }, + }, + mainContainer: { + position: "fixed", + minWidth: "670px", + zIndex: 1300, + top: "63px", + backgroundColor: "#ffffffd1", + borderRadius: 20, + margin: 10, + [theme.breakpoints.down("sm")]: { + minWidth: "300px", + width: "95%", + top: "63px", + }, + }, + upperContainer: { + padding: "20px 20px", + borderTopLeftRadius: 20, + borderBottomLeftRadius: 20, + [theme.breakpoints.down("sm")]: { + borderTopLeftRadius: 0, + borderBottomLeftRadius: 0, + }, + }, + mr10: { + marginRight: "10px", + }, + smallText: { + fontSize: "0.75rem", + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + textMBold: { + fontWeight: theme.typography.fontWeightMedium, + }, + button: { + width: "70px", + backgroundColor: theme.palette.primary.main, + alignItems: "center", + justifyContent: "center", + display: "flex", + padding: 10, + borderRadius: 10, + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, + shadow: { + boxShadow: theme.shadows["1"], + }, + addressBtn: { + textAlign: "inherit", + justifyContent: "flex-start", + padding: 0, + width: "100%", + boxShadow: "0px 4px 4px rgba(0, 0, 0, 0.25)", + borderRadius: 20, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/temp.js b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/temp.js new file mode 100644 index 0000000..212e2e7 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Subheader/temp.js @@ -0,0 +1,291 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Button, + Container, + Divider, + Grid, + InputAdornment, + TextField, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import ExpandLessIcon from "@mui/icons-material/ExpandLess"; +import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; +import LocationOnIcon from "@mui/icons-material/LocationOn"; +import Autocomplete from "@mui/material/Autocomplete"; +import parse from "autosuggest-highlight/parse"; +import throttle from "lodash/throttle"; +import React, { useEffect, useState } from "react"; +import SyncLoader from "react-spinners/SyncLoader"; +import LocationIcon from "../../../assets/icons/LocationIcon"; +import RightIcon from "../../../assets/icons/RightIcon"; +import { useLocationContext } from "../../../context/Location"; +import { useLocation } from "../../../hooks"; +import FlashMessage from "../../FlashMessage"; +import useStyles from "./styles"; + +const autocompleteService = { current: null }; + +function Subheader() { + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("sm")); + const spacingTop = mobile ? "56px" : "63px"; + const classes = useStyles(); + const [expand, setExpand] = useState(false); + const { location, setLocation } = useLocationContext(); + const { getCurrentLocation } = useLocation(); + const [search, setSearch] = useState( + location ? location.deliveryAddress : "" + ); + const [open, setOpen] = useState(false); + const [alertMessage, setAlertMessage] = useState(); + const [value, setValue] = useState(null); + const [inputValue, setInputValue] = useState(""); + const [options, setOptions] = useState([]); + const [latLng, setLatLng] = useState({}); + const [loading, setLoading] = useState(); + const fetch = React.useMemo( + () => + throttle((request, callback) => { + autocompleteService.current.getPlacePredictions(request, callback); + }, 200), + [] + ); + + useEffect(() => { + let active = true; + + if (!autocompleteService.current && window.google) { + autocompleteService.current = + new window.google.maps.places.AutocompleteService(); + } + if (!autocompleteService.current) { + return undefined; + } + + if (inputValue === "") { + setOptions(value ? [value] : []); + return undefined; + } + + fetch({ input: inputValue }, (results) => { + if (active) { + let newOptions = []; + + if (value) { + newOptions = [value]; + } + + if (results) { + newOptions = [...newOptions, ...results]; + } + + setOptions(newOptions); + } + }); + + return () => { + active = false; + }; + }, [value, inputValue, fetch]); + + const locationCallback = (error, data) => { + setLoading(false); + if (error) { + setAlertMessage(error); + setOpen(true); + return; + } + setSearch(data?.deliveryAddress ?? ""); + setValue(data?.deliveryAddress ?? ""); + setLatLng({ + lat: data.latitude, + lng: data.longitude, + }); + }; + return ( + <Box + style={{ top: spacingTop }} + className={`${classes.root} ${classes.shadow} ${classes.mainContainer}`} + > + <FlashMessage alertMessage={alertMessage} open={open} setOpen={setOpen} /> + <Grid container item> + <Grid item className={classes.upperContainer}> + <Button + style={{ display: mobile ? "block" : "flex", textAlign: "inherit" }} + onClick={() => setExpand(!expand)} + > + <Typography + variant="body1" + color="textSecondary" + className={`${classes.smallText} ${classes.mr10}`} + > + DELIVERING TO + </Typography> + <Box style={{ display: "flex", alignItems: "center" }}> + <Typography + variant="body1" + color="textSecondary" + className={`${classes.smallText} ${classes.mr10} ${classes.textBold}`} + > + {location?.deliveryAddress} + </Typography> + {!expand ? ( + <ExpandMoreIcon color="primary" /> + ) : ( + <ExpandLessIcon color="primary" /> + )} + </Box> + </Button> + </Grid> + </Grid> + <Divider light orientation="horizontal" /> + {expand && ( + <> + <Box + style={{ + width: "100%", + padding: "20px 0px", + display: "flex", + alignItems: "center", + }} + > + <Container style={{ display: "flex", marginLeft: "0px" }}> + <Autocomplete + style={{ width: "100%" }} + id="google-map-demo" + getOptionLabel={(option) => + typeof option === "string" ? option : option.description + } + filterOptions={(x) => x} + options={options} + autoComplete + includeInputInList + filterSelectedOptions + value={value ? value : search ?? "Loading ..."} + onChange={(event, newValue) => { + if (newValue) { + const b = new window.google.maps.Geocoder(); + b.geocode({ placeId: newValue.place_id }, (res) => { + const location = res[0].geometry.location; + setSearch(res[0].formatted_address); + setLatLng({ + lat: location.lat(), + lng: location.lng(), + }); + }); + } else { + setSearch(""); + setLatLng({}); + } + setOptions(newValue ? [newValue, ...options] : options); + setValue(newValue); + }} + onInputChange={(event, newInputValue) => { + setInputValue(newInputValue); + }} + renderInput={(params) => ( + <TextField + {...params} + style={{ color: "initial" }} + variant="outlined" + label="Enter your full address" + fullWidth + InputProps={{ + ...params.InputProps, + endAdornment: ( + <> + {params.InputProps.endAdornment} + <InputAdornment + position="end" + onClick={(e) => { + e.preventDefault(); + setLoading(true); + getCurrentLocation(locationCallback); + }} + > + {loading ? ( + <SyncLoader + color={theme.palette.primary.main} + size={5} + speedMultiplier={0.7} + margin={1} + /> + ) : ( + <LocationIcon /> + )} + </InputAdornment> + </> + ), + }} + /> + )} + renderOption={(props, option) => { + const matches = + option.structured_formatting.main_text_matched_substrings; + let parts = null; + if (matches) { + parts = parse( + option.structured_formatting.main_text, + matches.map((match) => [ + match.offset, + match.offset + match.length, + ]) + ); + } + return ( + <Grid {...props} container alignItems="center"> + <Grid item> + <LocationOnIcon className={classes.icon} /> + </Grid> + <Grid item xs> + {parts && + parts.map((part, index) => ( + <span + key={index} + style={{ + fontWeight: part.highlight ? 700 : 400, + color: "black", + }} + > + {part.text} + </span> + ))} + + <Typography variant="body2" color="textSecondary"> + {option.structured_formatting.secondary_text} + </Typography> + </Grid> + </Grid> + ); + }} + /> + <Button + onClick={(e) => { + e.preventDefault(); + setExpand(false); + if (search) { + setLocation({ + label: "Home", + latitude: latLng.lat, + longitude: latLng.lng, + deliveryAddress: search, + }); + } + }} + className={classes.button} + > + <RightIcon /> + </Button> + </Container> + </Box> + <Divider light orientation="horizontal" /> + </> + )} + </Box> + ); +} + +export default React.memo(Subheader); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/Title/Title.js b/enatega-multivendor-web/src/components/RestaurantComponent/Title/Title.js new file mode 100644 index 0000000..9eb6c38 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/Title/Title.js @@ -0,0 +1,27 @@ +import { Typography, useMediaQuery, useTheme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; +import React from "react"; + +const useStyles = makeStyles((theme) => ({ + restaurantTitle: { + color: theme.palette.common.black, + fontWeight: 700, + }, +})); +function Title({ title }) { + const classes = useStyles(); + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("sm")); + const fontSize = mobile ? theme.typography.h5.fontSize : "1.8rem"; + return ( + <Typography + style={{ paddingBottom: "20px", fontSize: fontSize }} + variant="h4" + className={classes.restaurantTitle} + > + {title} + </Typography> + ); +} + +export default React.memo(Title); diff --git a/enatega-multivendor-web/src/components/RestaurantComponent/index.js b/enatega-multivendor-web/src/components/RestaurantComponent/index.js new file mode 100644 index 0000000..10f9572 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantComponent/index.js @@ -0,0 +1,7 @@ +import Subheader from "./Subheader/Subheader"; +import ProductCard from "./Card/Card"; +import SearchRestaurant from "./SearchRestaurant/SearchRestaurant"; +import RestaurantRow from "./RestaurantSection/RestaurantSection"; +import RestaurantGrid from "./RestaurantGrid/RestaurantGrid"; + +export { Subheader, SearchRestaurant, RestaurantRow, RestaurantGrid, ProductCard }; diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/ItemCard.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/ItemCard.js new file mode 100644 index 0000000..f01a0cf --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/ItemCard.js @@ -0,0 +1,98 @@ +import { + Box, + Button, + Container, + Grid, + Paper, + Typography, + useTheme, +} from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; +import React, { useContext } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import useStyles from "./styles"; + +function ItemCard(props) { + const theme = useTheme(); + const { title, foods } = props; + const classes = useStyles(); + const configuration = useContext(ConfigurationContext); + return ( + <Container className={classes.cardContainer}> + <Typography + variant="h5" + color="textSecondary" + className={`${classes.titleText} ${classes.boldText}`} + > + {title} + </Typography> + <Grid container spacing={2}> + {foods.map((item, index) => ( + <Grid + key={index} + item + xs={12} + md={6} + style={{ paddingBottom: "20px" }} + > + <Paper + elevation={1} + square + className={classes.itemContainer} + onClick={() => props.onPress({ ...item, ...props.restaurant })} + > + <Box + display="flex" + flexDirection="column" + justifyContent="space-between" + > + <Box> + <Typography + variant="body1" + color="textSecondary" + className={classes.boldText} + > + {item.title} + </Typography> + <Typography variant="caption" className={classes.itemDesc}> + {item.description.length > 80 + ? `${item.description.substring(0, 80)}...` + : item.description} + </Typography> + </Box> + <Typography variant="body2" color="textSecondary"> + {`${configuration.currencySymbol} ${parseFloat( + item.variations[0].price + ).toFixed(2)}`} + {item.variations[0].discounted > 0 && ( + <Typography + variant="caption" + className={classes.discountText} + > + {`${configuration.currencySymbol} ${parseFloat( + item.variations[0].price + item.variations[0].discounted + ).toFixed(2)}`} + </Typography> + )} + </Typography> + </Box> + <Box + className={classes.imageContainer} + style={{ + backgroundImage: `url(${item.image})`, + borderRadius: 10, + }} + > + <Button className={classes.addContainer}> + <AddIcon style={{ color: theme.palette.common.white }} /> + </Button> + </Box> + </Paper> + </Grid> + ))} + </Grid> + </Container> + ); +} + +export default React.memo(ItemCard); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/styles.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/styles.js new file mode 100644 index 0000000..3b674ed --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/styles.js @@ -0,0 +1,57 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + cardContainer: { + margin: "20px 0px", + backgroundColor: theme.palette.common.white, + }, + itemContainer: { + display: "flex", + justifyContent: "space-between", + padding: "25px", + cursor: "pointer", + backgroundColor: theme.palette.common.white, + borderRadius: 10 + }, + titleText: { + paddingTop: "20px", + paddingBottom: "20px", + }, + boldText: { + fontWeight: 700, + }, + itemDesc: { + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + discountText: { + color: theme.palette.text.disabled, + fontWeight: theme.typography.fontWeightLight, + fontSize: "0.875rem", + textDecoration: "line-through", + marginLeft: "5px", + }, + imageContainer: { + width: "88px", + height: "88px", + backgroundImage: `url('https://images.deliveryhero.io/image/fd-pk/Products/4387883.jpg')`, + backgroundSize: "cover", + backgroundPositionX: "center", + backgroundPositionY: "center", + position: "relative", + }, + addContainer: { + backgroundColor: theme.palette.primary.main, + padding: "1px", + borderRadius: "inherit", + minWidth: "auto", + position: "absolute", + right: 0, + bottom: 0, + "&:hover": { + backgroundColor: theme.palette.primary.main, + }, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/temp.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/temp.js new file mode 100644 index 0000000..3fc8921 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/ItemCard/temp.js @@ -0,0 +1,87 @@ +import { + Box, + Button, + Container, + Grid, + Paper, + Typography, + useTheme, +} from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; +import React, { useContext } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import useStyles from "./styles"; + +function ItemCard(props) { + const theme = useTheme(); + const { title, foods } = props; + const classes = useStyles(); + const configuration = useContext(ConfigurationContext); + return ( + <Container className={classes.cardContainer}> + <Typography + variant="h5" + color="textSecondary" + className={`${classes.titleText} ${classes.boldText}`} + > + {title} + </Typography> + <Grid container spacing={2}> + {foods.map((item, index) => ( + <Grid key={index} item xs={12} md={6}> + <Paper + elevation={1} + square + className={classes.itemContainer} + onClick={() => props.onPress({ ...item, ...props.restaurant })} + > + <Box + display="flex" + flexDirection="column" + justifyContent="space-between" + > + <Box> + <Typography + variant="body1" + color="textSecondary" + className={classes.boldText} + > + {item.title} + </Typography> + <Typography variant="caption" className={classes.itemDesc}> + {item.description} + </Typography> + </Box> + <Typography variant="body2" color="textSecondary"> + {`${configuration.currencySymbol} ${parseFloat( + item.variations[0].price + ).toFixed(2)}`} + {item.variations[0].discounted > 0 && ( + <Typography + variant="caption" + className={classes.discountText} + > + {`${configuration.currencySymbol} ${parseFloat( + item.variations[0].price + item.variations[0].discounted + ).toFixed(2)}`} + </Typography> + )} + </Typography> + </Box> + <Box + className={classes.imageContainer} + style={{ backgroundImage: `url(${item.image})` }} + > + <Button className={classes.addContainer}> + <AddIcon style={{ color: theme.palette.common.white }} /> + </Button> + </Box> + </Paper> + </Grid> + ))} + </Grid> + </Container> + ); +} + +export default React.memo(ItemCard); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartItem.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartItem.js new file mode 100644 index 0000000..00bb833 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartItem.js @@ -0,0 +1,120 @@ +import { Box, IconButton, Typography, useTheme } from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; +import RemoveIcon from "@mui/icons-material/Remove"; +import React, { useContext } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import useStyles from "./styles"; + +function CartItem(props) { + const classes = useStyles(); + const theme = useTheme(); + const configuration = useContext(ConfigurationContext); + + return ( + <Box + style={{ marginTop: theme.spacing(3), marginBottom: theme.spacing(3) }} + display="flex" + alignItems="center" + justifyContent="space-between" + > + <Box display="flex" alignItems="center" justifyContent="space-between"> + <IconButton + size="small" + onClick={(e) => { + e.preventDefault(); + props.removeQuantity(); + }} + style={{ background: theme.palette.primary.main }} + > + <RemoveIcon + fontSize="small" + style={{ color: theme.palette.common.black }} + /> + </IconButton> + <Typography + style={{ + ...theme.typography.caption, + fontWeight: theme.typography.fontWeightBold, + color: theme.palette.common.black, + padding: "5px 10px", + borderRadius: 5, + border: "1px solid theme.palette.common.black", + margin: "0 8px", + }} + > + {props.quantity ? props.quantity : 0} + </Typography> + <IconButton + size="small" + onClick={(e) => { + e.preventDefault(); + props.addQuantity(); + }} + style={{ background: theme.palette.primary.main }} + > + <AddIcon + fontSize="small" + color="primary" + style={{ color: theme.palette.common.black }} + /> + </IconButton> + </Box> + <Box + display="flex" + flexDirection="column" + flexGrow={1} + ml={1} + justifyContent="flex-end" + > + <Box + display="flex" + justifyContent="space-between" + alignItems="flex-end" + style={{ + flexGrow: 1, + }} + > + <Box> + <Typography className={classes.itemTextStyle}> + {props.foodTitle ? props.foodTitle : ""} + </Typography> + <Typography + style={{ + color: theme.palette.common.black, + fontSize: "0.7rem", + marginTop: theme.spacing(0.5), + }} + className={classes.itemTextStyle} + > + {props.variationTitle ? `(${props.variationTitle})` : ""} + </Typography> + {props?.optionTitles?.map((title, index) => ( + <Box key={index} display="flex"> + <Typography + style={{ + color: theme.palette.common.black, + fontSize: "0.7rem", + }} + className={classes.optionTextStyle} + > + +{title} + </Typography> + </Box> + ))} + </Box> + <Box> + <Typography + style={{ color: theme.palette.common.black }} + className={classes.subtotalText} + > + {` ${configuration.currencySymbol} ${parseFloat( + props.dealPrice + ).toFixed(2)}`} + </Typography> + </Box> + </Box> + </Box> + </Box> + ); +} +export default React.memo(CartItem); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartView.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartView.js new file mode 100644 index 0000000..3bd0559 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/CartView.js @@ -0,0 +1,204 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + CircularProgress, + Container, + Typography, + useTheme, +} from "@mui/material"; +import React, { useContext, useEffect, useState } from "react"; +import RiderImage from "../../../assets/images/rider.png"; +import UserContext from "../../../context/User"; +import { useRestaurant } from "../../../hooks"; +import CartItem from "./CartItem"; +import PricingView from "./PricingView"; +import useStyles from "./styles"; +import { useTranslation } from "react-i18next"; + +function CartView(props) { + const { t } = useTranslation(); + const classes = useStyles(); + const theme = useTheme(); + const [loadingData, setLoadingData] = useState(true); + const { + clearCart, + restaurant: cartRestaurant, + cart, + cartCount, + addQuantity, + removeQuantity, + updateCart, + } = useContext(UserContext); + const { data } = useRestaurant(cartRestaurant); + const restaurantData = data?.restaurant ?? null; + + useEffect(() => { + if (restaurantData) didFocus(); + }, [restaurantData, cartCount]); + + const didFocus = async () => { + const foods = restaurantData.categories.map((c) => c.foods.flat()).flat(); + const { addons, options } = restaurantData; + + try { + if (cart && cartCount) { + const transformCart = cart.map((cartItem) => { + const foodItem = foods.find((food) => food._id === cartItem._id); + if (!foodItem) return null; + const variationItem = foodItem.variations.find( + (variation) => variation._id === cartItem.variation._id + ); + if (!variationItem) return null; + const foodItemTitle = `${foodItem.title}${ + variationItem.title ? `(${variationItem.title})` : "" + }`; + let foodItemPrice = variationItem.price; + let optionTitles = []; + if (cartItem.addons) { + cartItem.addons.forEach((addon) => { + const cartAddon = addons.find((add) => add._id === addon._id); + if (!cartAddon) return null; + addon.options.forEach((option) => { + const cartOption = options.find( + (opt) => opt._id === option._id + ); + if (!cartOption) return null; + foodItemPrice += cartOption.price; + optionTitles.push(cartOption.title); + }); + }); + } + return { + ...cartItem, + title: foodItemTitle, + foodTitle: foodItem.title, + variationTitle: variationItem.title, + optionTitles, + price: foodItemPrice.toFixed(2), + }; + }); + const updatedItems = transformCart.filter((item) => item); + if (updatedItems.length === 0) await clearCart(); + await updateCart(updatedItems); + setLoadingData((prev) => { + if (prev) return false; + else return prev; + }); + if (transformCart.length !== updatedItems.length) { + props.showMessage({ + type: t("warning"), + message: t("warningText"), + }); + } + } + } catch (e) { + props.showMessage({ + type: "error", + message: e.message, + }); + } finally { + setLoadingData((prev) => { + if (prev) return false; + else return prev; + }); + } + }; + + if (loadingData) { + return ( + <Box display="flex" justifyContent="center" alignItems="center"> + <CircularProgress /> + </Box> + ); + } + + return ( + <> + <Box + style={{ + background: + "linear-gradient(260.99deg, theme.palette.primary.main 2.79%, theme.palette.success.light 96.54%)", + borderRadius: "20px", + padding: "30px 20px", + }} + display="flex" + alignItems={"center"} + > + <Box display="flex" alignItems="center" justifyContent="center"> + {/* <DeliveryIcon /> */} + <img src={RiderImage} alt="rider" /> + </Box> + <Box + display="flex" + justifyContent="center" + flexDirection="column" + style={{ + marginLeft: "5px", + }} + > + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.common.black, + fontSize: "1.275rem", + fontWeight: 600, + }} + > + {t("deliveryTime")} + </Typography> + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }} + > + {`${restaurantData?.deliveryTime ?? "..."} min`} + </Typography> + <Typography + variant="h6" + color="textSecondary" + style={{ fontSize: "0.78rem" }} + className={classes.textBold} + > + {`${t("orderFrom")} ${restaurantData?.name ?? "..."}`} + </Typography> + </Box> + </Box> + <Container + style={{ + maxHeight: "30vh", + overflowY: "scroll", + paddingBottom: theme.spacing(2), + background: theme.palette.common.white, + marginBottom: 10, + }} + > + {cart?.map((foodItem) => ( + <CartItem + key={`ITEM_${foodItem.key}`} + quantity={foodItem.quantity} + dealName={foodItem.title} + foodTitle={foodItem.foodTitle} + variationTitle={foodItem.variationTitle} + optionTitles={foodItem.optionTitles} + dealPrice={(parseFloat(foodItem.price) * foodItem.quantity).toFixed( + 2 + )} + addQuantity={() => { + addQuantity(foodItem.key); + }} + removeQuantity={() => { + removeQuantity(foodItem.key); + }} + /> + ))} + </Container> + <PricingView + restaurantData={restaurantData} + deliveryCharges={restaurantData.deliveryCharges} + /> + </> + ); +} +export default React.memo(CartView); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/EmptyView.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/EmptyView.js new file mode 100644 index 0000000..05222ec --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/EmptyView.js @@ -0,0 +1,119 @@ +import { Box, Button, Container, Typography, useTheme } from "@mui/material"; +import clsx from "clsx"; +import React, { useContext } from "react"; +import ConfigurationContext from "../../../context/Configuration"; +import useStyles from "./styles"; +import RiderImage from "../../../assets/images/rider.png"; +import { useTranslation } from "react-i18next"; + +function EmptyView() { + const { t } = useTranslation(); + const configuration = useContext(ConfigurationContext); + const classes = useStyles(); + const theme = useTheme(); + return ( + <> + <Box + style={{ + background: + "linear-gradient(260.99deg, theme.palette.primary.main 2.79%, theme.palette.success.light 96.54%)", + borderRadius: "20px", + padding: "30px 20px", + }} + display="flex" + alignItems={"center"} + > + <Box display="flex" alignItems="center" justifyContent="center"> + {/* <DeliveryIcon /> */} + <img src={RiderImage} alt="rider" /> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "center", + flexDirection: "column", + marginLeft: "5px", + }} + > + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.common.black, + fontSize: "1.275rem", + fontWeight: 600, + }} + align="left" + > + {t("yourCart")} + </Typography> + + <Typography + variant="h6" + color="textSecondary" + style={{ fontSize: "0.875rem", marginTop: 10 }} + className={classes.textBold} + align="center" + > + {t("startAdding")} + </Typography> + </Box> + </Box> + + <Container> + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(6), + }} + > + <Typography variant="body1" className={classes.smallFont}> + {t("subTotal")} + </Typography> + <Typography variant="body1" className={classes.smallFont}> + {`${configuration.currencySymbol}`} 0.00 + </Typography> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(2), + }} + > + <Typography + variant="body1" + color="textSecondary" + className={clsx(classes.textBold, classes.smallFont)} + > + {t("total")} (Incl. TAX) + </Typography> + <Typography + variant="body1" + color="textSecondary" + className={clsx(classes.textBold, classes.smallFont)} + > + {`${configuration.currencySymbol}`} 0.00 + </Typography> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "center", + marginTop: theme.spacing(2), + }} + > + <Button fullWidth disabled className={classes.checkoutContainer}> + <Typography + className={clsx(classes.checkoutText, classes.whiteText)} + > + {t("goToCheckout")} + </Typography> + </Button> + </Box> + </Container> + </> + ); +} + +export default React.memo(EmptyView); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/MRestaurantCart.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/MRestaurantCart.js new file mode 100644 index 0000000..bbf64fd --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/MRestaurantCart.js @@ -0,0 +1,264 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useQuery } from "@apollo/client"; +import { + Button, + CircularProgress, + Container, + Hidden, + Typography, + Box, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { useContext, useEffect, useMemo, useState } from "react"; +import { Link as RouterLink } from "react-router-dom"; +import { getTaxation } from "../../../apollo/server"; +import ConfigurationContext from "../../../context/Configuration"; +import UserContext from "../../../context/User"; +import { useRestaurant } from "../../../hooks"; +import useStyles from "./styles"; + +const TAXATION = gql` + ${getTaxation} +`; + +function MRestaurantCart(props) { + const theme = useTheme(); + const classes = useStyles(); + const [loadingData, setLoadingData] = useState(true); + const { + cart, + cartCount, + clearCart, + updateCart, + restaurant: cartRestaurant, + } = useContext(UserContext); + const configuration = useContext(ConfigurationContext); + const { loading: loadingTax } = useQuery(TAXATION, { + fetchPolicy: "network-only", + }); + const { loading, data } = useRestaurant(cartRestaurant); + const restaurantData = data?.restaurant ?? null; + + useEffect(() => { + if (restaurantData) didFocus(); + }, [restaurantData, cartCount]); + + const didFocus = async () => { + const foods = restaurantData.categories.map((c) => c.foods.flat()).flat(); + const { addons, options } = restaurantData; + try { + if (cart && cartCount) { + const transformCart = cart.map((cartItem) => { + const foodItem = foods.find((food) => food._id === cartItem._id); + if (!foodItem) return null; + const variationItem = foodItem.variations.find( + (variation) => variation._id === cartItem.variation._id + ); + if (!variationItem) return null; + const foodItemTitle = `${foodItem.title}(${variationItem.title})`; + let foodItemPrice = variationItem.price; + let optionTitles = []; + if (cartItem.addons) { + cartItem.addons.forEach((addon) => { + const cartAddon = addons.find((add) => add._id === addon._id); + if (!cartAddon) return null; + addon.options.forEach((option) => { + const cartOption = options.find( + (opt) => opt._id === option._id + ); + if (!cartOption) return null; + foodItemPrice += cartOption.price; + optionTitles.push(cartOption.title); + }); + }); + } + return { + ...cartItem, + title: foodItemTitle, + foodTitle: foodItem.title, + variationTitle: variationItem.title, + optionTitles, + price: foodItemPrice.toFixed(2), + }; + }); + const updatedItems = transformCart.filter((item) => item); + if (updatedItems.length === 0) await clearCart(); + await updateCart(updatedItems); + setLoadingData((prev) => { + if (prev) return false; + else return prev; + }); + if (transformCart.length !== updatedItems.length) { + props.showMessage({ + type: "warning", + message: "One or more item is not available", + }); + } + } + } catch (e) { + props.showMessage({ + type: "error", + message: e.message, + }); + } finally { + setLoadingData((prev) => { + if (prev) return false; + else return prev; + }); + } + }; + + const calculatePrice = useMemo( + () => () => { + let itemTotal = 0; + cart.forEach((cartItem) => { + itemTotal += cartItem.price * cartItem.quantity; + }); + return itemTotal.toFixed(2); + }, + [cart] + ); + + const taxCalculation = useMemo( + () => () => { + const tax = restaurantData ? +restaurantData.tax : 0; + if (tax === 0) { + return tax.toFixed(2); + } + const amount = +calculatePrice(); + const taxAmount = ((amount / 100) * tax).toFixed(2); + return taxAmount; + }, + [calculatePrice, restaurantData] + ); + + const calculateTotal = useMemo( + () => () => { + let total = 0; + total += +calculatePrice(); + total += +taxCalculation(); + return parseFloat(total).toFixed(2); + }, + [calculatePrice, taxCalculation] + ); + + return ( + <Hidden lgUp> + <RouterLink + to={loadingTax ? "#" : "/checkout"} + style={{ textDecoration: "none" }} + > + <Box + style={{ + background: theme.palette.common.white, + position: "fixed", + bottom: 0, + width: "100%", + // padding: `${theme.spacing(2)} 0px`, + borderRadius: "inherit", + }} + > + {loadingTax || loadingData || loading ? ( + <CircularProgress color="secondary" size={25} /> + ) : ( + <> + {/* <Container + maxWidth="xl" + style={{ + display: "flex", + justifyContent: "space-between", + }} + > + <Typography + variant="caption" + align="left" + className={clsx(classes.mobileCartText, classes.whiteText)} + > + {cartCount} + </Typography> + <Typography + style={{ + ...theme.typography.body2, + color: theme.palette.common.white, + fontWeight: 700, + }} + > + VIEW CART + </Typography> + <Typography + variant="body2" + align="right" + className={clsx(classes.mobileCartText, classes.whiteText)} + > + {`${configuration.currencySymbol} ${calculateTotal()}`} + </Typography> + </Container> */} + + <Container + maxWidth="xl" + style={{ + display: "flex", + justifyContent: "space-between", + }} + > + <Box display="flex" alignItems="center" style={{ flexGrow: 1 }}> + <Box display="flex" alignItems={"center"}> + <Typography + style={{ + fontWeight: 700, + color: theme.palette.text.secondary, + fontSize: "0.975rem", + }} + > + {`${configuration.currencySymbol} ${calculateTotal()}`} + </Typography> + <Typography + style={{ + ...theme.typography.caption, + fontWeight: 700, + color: theme.palette.common.black, + padding: "5px 10px", + borderRadius: 5, + border: "1px solid theme.palette.common.black", + margin: "0 8px", + }} + align="left" + > + {cartCount} + </Typography> + </Box> + <Box flexGrow={1} ml={2}> + <RouterLink + style={{ textDecoration: "none" }} + to={loadingTax ? "#" : "/checkout"} + > + <Button + disabled={loadingTax} + style={{ + background: theme.palette.primary.main, + margin: theme.spacing(2, 0), + borderRadius: 10, + }} + className={classes.checkoutContainer} + > + <Typography + style={{ color: theme.palette.common.black }} + className={classes.checkoutText} + > + GO TO CHECKOUT + </Typography> + </Button> + </RouterLink> + </Box> + </Box> + </Container> + </> + )} + </Box> + </RouterLink> + </Hidden> + ); +} + +export default React.memo(MRestaurantCart); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/PricingView.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/PricingView.js new file mode 100644 index 0000000..8884cc5 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/PricingView.js @@ -0,0 +1,230 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Button, Container, Typography, useTheme } from "@mui/material"; +import React, { useContext, useMemo, useEffect, useState } from "react"; +import { Link as RouterLink } from "react-router-dom"; +import ConfigurationContext from "../../../context/Configuration"; +import UserContext from "../../../context/User"; +import useStyles from "./styles"; +import { useTranslation } from "react-i18next"; +import { calculateDistance } from "../../../utils/customFunction"; + +function PricingView(props) { + const { t } = useTranslation(); + const classes = useStyles(); + const theme = useTheme(); + const configuration = useContext(ConfigurationContext); + const { cart } = useContext(UserContext); + const { restaurantData } = props; + + const [deliveryCharges, setDeliveryCharges] = useState(0); + + useEffect(() => { + (async () => { + const destinationObj = JSON.parse(localStorage.getItem("location")); + const latOrigin = Number(restaurantData.location.coordinates[1]); + const lonOrigin = Number(restaurantData.location.coordinates[0]); + const latDest = Number(destinationObj.latitude); + const longDest = Number(destinationObj.longitude); + const distance = await calculateDistance( + latOrigin, + lonOrigin, + latDest, + longDest + ); + const amount = Math.ceil(distance) * configuration.deliveryRate; + setDeliveryCharges(amount > 0 ? amount : configuration.deliveryRate); + })(); + }, [restaurantData]); + const calculatePrice = useMemo( + () => + (amount = 0) => { + let itemTotal = 0; + cart.forEach((cartItem) => { + itemTotal += cartItem.price * cartItem.quantity; + }); + // if (withDiscount && coupon && coupon.discount) { + // itemTotal = itemTotal - (coupon.discount / 100) * itemTotal; + // } + const deliveryAmount = amount > 0 ? deliveryCharges : 0; + return (itemTotal + deliveryAmount).toFixed(2); + }, + [deliveryCharges, cart] + ); + const taxCalculation = useMemo( + () => () => { + const tax = restaurantData ? +restaurantData.tax : 0; + if (tax === 0) { + return tax.toFixed(2); + } + const amount = +calculatePrice(deliveryCharges, true); + const taxAmount = ((amount / 100) * tax).toFixed(2); + return taxAmount; + }, + [restaurantData, cart, deliveryCharges] + ); + + const calculateTotal = useMemo( + () => () => { + let total = 0; + total += +calculatePrice(deliveryCharges); + total += +taxCalculation(); + return parseFloat(total).toFixed(2); + }, + [deliveryCharges, cart] + ); + + // function calculateDistance(){ + // const service = new window.google.maps.DistanceMatrixService(); + // // build request + // const destinationObj = JSON.parse(localStorage.getItem('location')) + // console.log('destinationObj', destinationObj) + // const origin1 = { lat: Number(restaurantData.location.coordinates[1]), lng: Number(restaurantData.location.coordinates[0]) }; + // const origin2 = restaurantData.address; + // const destinationA = destinationObj.deliveryAddress; + // const destinationB = { lat: Number(destinationObj.latitude), lng: Number(destinationObj.longitude) }; + + // const request = { + // origins: [origin1, origin2], + // destinations: [destinationA, destinationB], + // travelMode: window.google.maps.TravelMode.DRIVING, + // unitSystem: window.google.maps.UnitSystem.METRIC, + // avoidHighways: false, + // avoidTolls: false, + // }; + // return service.getDistanceMatrix(request).then((response) => { + + // let distance = 0; + // const originList = response.originAddresses; + // distance = response.rows[0].elements[0].distance.value; + // for (var i = 0; i < originList.length; i++) { + // var results = response.rows[i].elements; + // for (var j = 0; j < results.length; j++) { + // if(response.rows[i].elements[j].distance.value < distance){ + // distance = response.rows[i].elements[j].distance.value + // } + // } + // } + // return distance + // }); + // } + + return ( + <Container + style={{ + paddingTop: theme.spacing(2), + background: theme.palette.common.white, + }} + > + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(1), + }} + className={classes.border} + > + <Typography className={classes.subtotalText}> + {t("subTotal")} + </Typography> + <Typography className={classes.subtotalText}> + {`${configuration.currencySymbol} ${calculatePrice(0)}`} + </Typography> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(1), + }} + className={classes.border} + > + <Typography className={classes.subtotalText}> + {t("deliveryFee")} + </Typography> + <Typography className={classes.subtotalText}> + {`${configuration.currencySymbol} ${deliveryCharges.toFixed(2)}`} + </Typography> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(1), + }} + className={classes.border} + > + <Typography className={classes.subtotalText}>{t("taxFee")}</Typography> + <Typography className={classes.subtotalText}> + {`${configuration.currencySymbol} ${taxCalculation()}`} + </Typography> + </Box> + <Box + style={{ + display: "flex", + justifyContent: "space-between", + marginTop: theme.spacing(2), + }} + > + <Typography + style={{ fontWeight: 700, color: theme.palette.text.secondary }} + className={classes.subtotalText} + > + {t("total")} (Inc. TAX) + </Typography> + <Typography + style={{ fontWeight: 700, color: theme.palette.text.secondary }} + className={classes.subtotalText} + > + {`${configuration.currencySymbol} ${calculateTotal()}`} + </Typography> + </Box> + <Box display="flex" alignItems="center"> + <Box display="flex" alignItems={"center"}> + <Typography + style={{ + fontWeight: 700, + color: theme.palette.text.secondary, + fontSize: "0.975rem", + }} + > + {`${configuration.currencySymbol} ${calculateTotal()}`} + </Typography> + <Typography + style={{ + ...theme.typography.caption, + fontWeight: 700, + color: theme.palette.common.black, + padding: "5px 10px", + borderRadius: 5, + border: "1px solid theme.palette.common.black", + margin: "0 8px", + }} + > + {cart && cart.length} + </Typography> + </Box> + <Box flexGrow={1} ml={2}> + <RouterLink to="/checkout" style={{ textDecoration: "none" }}> + <Button + style={{ + background: theme.palette.primary.main, + margin: theme.spacing(2, 0), + borderRadius: 10, + }} + className={classes.checkoutContainer} + > + <Typography + style={{ color: theme.palette.common.black }} + className={classes.checkoutText} + > + {t("goToCheckout")} + </Typography> + </Button> + </RouterLink> + </Box> + </Box> + </Container> + ); +} + +export default React.memo(PricingView); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/RestaurantCart.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/RestaurantCart.js new file mode 100644 index 0000000..b093cb9 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/RestaurantCart.js @@ -0,0 +1,31 @@ +import { Box, Grid, Hidden } from "@mui/material"; +import React, { useContext } from "react"; +import UserContext from "../../../context/User"; +import CartView from "./CartView"; +import EmptyView from "./EmptyView"; + +function RestaurantCart(props) { + const { cart } = useContext(UserContext); + return ( + <Hidden lgDown> + <Grid + item + lg={3} + xs={false} + style={{ + background: "#fafafa", + }} + > + <Box style={{ position: "sticky", top: "100px", padding: "0px 5px" }}> + {!cart.length ? ( + <EmptyView showMessage={props.showMessage} /> + ) : ( + <CartView showMessage={props.showMessage} /> + )} + </Box> + </Grid> + </Hidden> + ); +} + +export default React.memo(RestaurantCart); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/styles.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/styles.js new file mode 100644 index 0000000..62d2bd0 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantCart/styles.js @@ -0,0 +1,65 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + infoText: { + ...theme.typography.body1, + color: theme.palette.text.disabled, + }, + subtotalText: { + ...theme.typography.body1, + fontSize: "0.875rem", + }, + checkoutContainer: { + background: theme.palette.grey[400], + borderRadius: 0, + width: "100%", + padding: "10px 0px", + "&:hover": { + background: theme.palette.grey[400], + }, + }, + mobileCartText: { + width: "130px", + fontWeight: 100, + }, + whiteText: { + color: theme.palette.common.white, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + mediumFont: { + fontSize: "1rem", + }, + smallFont: { + fontSize: "0.875rem", + }, + checkoutText: { + ...theme.typography.h6, + fontWeight: 700, + fontSize: "0.875rem", + }, + totalText: { + ...theme.typography.body1, + fontSize: "0.875rem", + fontWeight: 700, + color: theme.palette.text.secondary, + }, + itemTextStyle: { + ...theme.typography.body1, + color: theme.palette.primary.main, + fontWeight: 700, + }, + optionTextStyle: { + ...theme.typography.body1, + color: theme.palette.primary.main, + }, + border: { + borderBottom: `1px solid ${theme.palette.grey[500]}`, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/RestaurantHeader.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/RestaurantHeader.js new file mode 100644 index 0000000..55c718a --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/RestaurantHeader.js @@ -0,0 +1,129 @@ +import { Box, Container, Typography, useTheme } from "@mui/material"; +import StarSharpIcon from "@mui/icons-material/StarSharp"; +import clsx from "clsx"; +import React, { useCallback } from "react"; +import { DAYS } from "../../../utils/constantValues"; +import useStyles from "./styles"; +import { useTranslation } from "react-i18next"; + +function RestaurantHeader({ headerData, loading = false }) { + const theme = useTheme(); + const classes = useStyles(); + const { t } = useTranslation(); + const isOpen = useCallback(() => { + if (headerData.openingTimes) { + if (headerData?.openingTimes?.length < 1) return false; + const date = new Date(); + const day = date.getDay(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const todaysTimings = headerData.openingTimes.find( + (o) => o.day === DAYS[day] + ); + if (todaysTimings === undefined) return false; + const times = todaysTimings.times.filter( + (t) => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ); + + return times.length > 0; + } + return true; + }, [headerData]); + + const isClosed = !isOpen() || !headerData.isAvailable; + + return ( + <Box> + <Container style={{ marginLeft: "0px" }}> + <Box + style={{ + display: "flex", + justifyContent: "center", + paddingTop: "15px", + }} + > + <Typography className={classes.restaurantTitle} align="center"> + {headerData?.name ?? "..."} + </Typography> + </Box> + </Container> + {!loading && ( + <> + <Container + style={{ + marginLeft: "0px", + display: "flex", + marginTop: 15, + justifyContent: "center", + }} + > + <Box + className={clsx({ + [classes.tagContainer]: !isClosed, + [classes.closeContainer]: isClosed, + })} + > + <Typography + className={clsx({ + [classes.tagStyles]: !isClosed, + [classes.closeTag]: isClosed, + })} + > + {true ? t("new") : t("closed")} + </Typography> + </Box> + <Box + style={{ + display: "flex", + alignItems: "center", + marginLeft: "15px", + }} + > + <StarSharpIcon + style={{ + fontSize: "16px", + color: theme.palette.common.white, + marginRight: 5, + }} + /> + <Typography className={classes.currentRatingText} align="center"> + {headerData.averageReview} + </Typography> + <Typography className={classes.totalRatingText}>/5</Typography> + <Typography + style={{ fontSize: "0.875rem", marginLeft: "3px" }} + className={classes.totalRatingText} + > + {headerData.averageTotal} + </Typography> + </Box> + </Container> + <Container style={{ marginLeft: "0px" }}> + <Box + style={{ + display: "flex", + padding: "15px 0px", + alignItems: "center", + justifyContent: "center", + }} + > + <Typography + className={classes.categoriesStyle} + style={{ paddingRight: "5px" }} + align="center" + > + {t("deliver")} {headerData?.deliveryTime} {t("minute")} + </Typography> + </Box> + </Container> + </> + )} + </Box> + ); +} + +export default React.memo(RestaurantHeader); diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/styles.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/styles.js new file mode 100644 index 0000000..3c87fb5 --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/RestaurantHeader/styles.js @@ -0,0 +1,45 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyle = makeStyles((theme) => ({ + restaurantTitle: { + ...theme.typography.h6, + color: theme.palette.common.white, + fontWeight: 700, + }, + tagStyles: { + ...theme.typography.caption, + color: theme.palette.common.white, + fontWeight: 700, + }, + tagContainer: { + backgroundColor: theme.palette.primary.main, + display: "inline-block", + padding: "2px 8px", + }, + closeContainer: { + backgroundColor: theme.palette.warning.light, + display: "inline-block", + padding: "2px 8px", + borderRadius: "8px", + }, + closeTag: { + color: theme.palette.common.black, + fontWeight: 700, + }, + currentRatingText: { + ...theme.typography.caption, + fontWeight: 700, + color: theme.palette.common.white, + fontSize: "0.875rem", + }, + totalRatingText: { + ...theme.typography.caption, + color: theme.palette.common.white, + fontSize: "0.875rem", + }, + categoriesStyle: { + color: theme.palette.common.white, + }, +})); + +export default useStyle; diff --git a/enatega-multivendor-web/src/components/RestaurantDetailComponent/index.js b/enatega-multivendor-web/src/components/RestaurantDetailComponent/index.js new file mode 100644 index 0000000..f87c90d --- /dev/null +++ b/enatega-multivendor-web/src/components/RestaurantDetailComponent/index.js @@ -0,0 +1,6 @@ +import RestaurantCart from "./RestaurantCart/RestaurantCart"; +import MRestaurantCart from "./RestaurantCart/MRestaurantCart"; +import RestaurantHeader from "./RestaurantHeader/RestaurantHeader"; +import ItemCard from "./ItemCard/ItemCard"; + +export { RestaurantCart, MRestaurantCart, RestaurantHeader, ItemCard }; diff --git a/enatega-multivendor-web/src/components/Tabs/Tabs.js b/enatega-multivendor-web/src/components/Tabs/Tabs.js new file mode 100644 index 0000000..143e363 --- /dev/null +++ b/enatega-multivendor-web/src/components/Tabs/Tabs.js @@ -0,0 +1,57 @@ +import React from "react"; +import { Grid } from "@mui/material"; +import Box from "@mui/material/Box"; +import CardMedia from "@mui/material/CardMedia"; +import Typography from "@mui/material/Typography"; +import deliveryImg from "../../assets/images/restaurants.jpeg"; +import pickupImg from "../../assets/images/pickup.png"; + +import useStyles from "./styles"; + +const DeliveryTabs = ({ active, activeTabChange, inactiveTabChange }) => { + const styles = useStyles(); + + return ( + <Grid container className={styles.center}> + <Grid + item + className={ + `${styles.box} ${active === "delivery" ? styles.activeTab : ""}` + } + mb={2} + onClick={activeTabChange} + > + <Box className={styles.innerBox}> + <Typography className={styles.text} component="div" variant="h6"> + Delivery + </Typography> + </Box> + <CardMedia + component="img" + sx={{ width: 120, height: 75 }} + image={deliveryImg} + alt="Delivery" + /> + </Grid> + <Grid + item + className={`${styles.box} ${active === "pickup" ? styles.activeTab : ""}`} + mb={2} + onClick={inactiveTabChange} + > + <Box className={styles.innerBox}> + <Typography className={styles.text} component="div" variant="h6"> + Pickup + </Typography> + </Box> + <CardMedia + component="img" + className={styles.image} + image={pickupImg} + alt="Pickup" + /> + </Grid> + </Grid> + ); +}; +export default DeliveryTabs; diff --git a/enatega-multivendor-web/src/components/Tabs/styles.js b/enatega-multivendor-web/src/components/Tabs/styles.js new file mode 100644 index 0000000..38ced44 --- /dev/null +++ b/enatega-multivendor-web/src/components/Tabs/styles.js @@ -0,0 +1,42 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + marginHeader: { + marginTop: "200px", + }, + center: { + flexDirection: "row", + display: "flex", + flex: 1, + marginLeft: "9%", + }, + box: { + display: "flex", + justifyContent: "space-between", + width: 230, + background: theme.palette.common.white, + marginRight: 20, + cursor: "pointer", + }, + innerBox: { + display: "flex", + flexDirection: "column", + background: theme.palette.common.white, + }, + text: { + marginTop: "35px", + paddingLeft: "15px", + color: theme.palette.primary.main, + fontWeight: "bold", + }, + image: { + width: 120, + height: 75, + }, + activeTab: { + borderBottom: `4px solid ${theme.palette.primary.main}`, + boxShadow: `0 0 5px ${theme.palette.grey[300]}`, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/components/ThreeDots/ThreeDots.js b/enatega-multivendor-web/src/components/ThreeDots/ThreeDots.js new file mode 100644 index 0000000..34c2f5f --- /dev/null +++ b/enatega-multivendor-web/src/components/ThreeDots/ThreeDots.js @@ -0,0 +1,18 @@ +import StopIcon from "@mui/icons-material/Stop"; +import React from "react"; +import useStyles from "./styles"; + +function ThreeDots() { + const classes = useStyles(); + return ( + <> + {Array(3) + .fill(null) + .map((item, index) => ( + <StopIcon color="primary" key={index} className={classes.dot} /> + ))} + </> + ); +} + +export default React.memo(ThreeDots); diff --git a/enatega-multivendor-web/src/components/ThreeDots/styles.js b/enatega-multivendor-web/src/components/ThreeDots/styles.js new file mode 100644 index 0000000..dd33bf6 --- /dev/null +++ b/enatega-multivendor-web/src/components/ThreeDots/styles.js @@ -0,0 +1,11 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + dot: { + fontSize: 10, + margin: theme.spacing(2, 0), + marginRight: theme.spacing(0.5), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/config/constants.js b/enatega-multivendor-web/src/config/constants.js new file mode 100644 index 0000000..06f256d --- /dev/null +++ b/enatega-multivendor-web/src/config/constants.js @@ -0,0 +1,41 @@ +/* eslint-disable no-unused-vars */ +import React, { useContext } from "react"; +import ConfigurationContext from "../../src/context/Configuration"; + +const ConfigurableValues = () => { + const configuration = useContext(ConfigurationContext); + console.log("configuration", configuration); + const SERVER_URL = "https://enatega-multivendor.up.railway.app/"; + const WS_SERVER_URL = "wss://enatega-multivendor.up.railway.app/"; + const GOOGLE_CLIENT_ID = configuration.webClientID; + const STRIPE_PUBLIC_KEY = configuration.publishableKey; + const PAYPAL_KEY = configuration.clientId; + const GOOGLE_MAPS_KEY = configuration.googleApiKey; + const AMPLITUDE_API_KEY = configuration.webAmplitudeApiKey; + const LIBRARIES = "places,drawing,geometry,localContext,visualization".split( + "," + ); + const COLORS = { + GOOGLE: configuration.googleColor, + }; + const SENTRY_DSN = configuration.webSentryUrl; + const SKIP_EMAIL_VERIFICATION = configuration.skipEmailVerification; + const SKIP_MOBILE_VERIFICATION = configuration.skipMobileVerification; + + return { + SERVER_URL, + WS_SERVER_URL, + GOOGLE_CLIENT_ID, + COLORS, + PAYPAL_KEY, + STRIPE_PUBLIC_KEY, + GOOGLE_MAPS_KEY, + AMPLITUDE_API_KEY, + LIBRARIES, + SENTRY_DSN, + SKIP_EMAIL_VERIFICATION, + SKIP_MOBILE_VERIFICATION + }; +}; + +export default ConfigurableValues; diff --git a/enatega-multivendor-web/src/context/Configuration.js b/enatega-multivendor-web/src/context/Configuration.js new file mode 100644 index 0000000..d3a06c0 --- /dev/null +++ b/enatega-multivendor-web/src/context/Configuration.js @@ -0,0 +1,25 @@ +import { gql, useQuery } from '@apollo/client' +import React from 'react' +import { getConfiguration } from '../apollo/server' + +const GETCONFIGURATION = gql` + ${getConfiguration} +` + +const ConfigurationContext = React.createContext({}) + +export const ConfigurationProvider = props => { + const { loading, data, error } = useQuery(GETCONFIGURATION) + const configuration = + loading || error || !data.configuration + ? { currency: '', currencySymbol: '', deliveryRate: 0 } + : data.configuration + + return ( + <ConfigurationContext.Provider value={configuration}> + {props.children} + </ConfigurationContext.Provider> + ) +} +export const ConfigurationConsumer = ConfigurationContext.Consumer +export default ConfigurationContext diff --git a/enatega-multivendor-web/src/context/Location.js b/enatega-multivendor-web/src/context/Location.js new file mode 100644 index 0000000..50af269 --- /dev/null +++ b/enatega-multivendor-web/src/context/Location.js @@ -0,0 +1,30 @@ +import React, { useContext, useEffect, useRef, useState } from 'react' + +export const LocationContext = React.createContext() + +export const LocationProvider = ({ children }) => { + const [location, setLocation] = useState(null) + const isInitialRender = useRef(true) + useEffect(() => { + const locationStr = localStorage.getItem('location') + + if (locationStr && locationStr !== "undefined") { + setLocation(JSON.parse(locationStr)) + } + }, []) + useEffect(() => { + if (isInitialRender.current) { + isInitialRender.current = false + return + } + if (location) + localStorage.setItem('location', JSON.stringify(location)) + }, [location]) + + + return <LocationContext.Provider value={{ location, setLocation }}> + {children} + </LocationContext.Provider> +} + +export const useLocationContext = () => useContext(LocationContext) diff --git a/enatega-multivendor-web/src/context/User.js b/enatega-multivendor-web/src/context/User.js new file mode 100644 index 0000000..3a0f3e2 --- /dev/null +++ b/enatega-multivendor-web/src/context/User.js @@ -0,0 +1,330 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + gql, + useApolloClient, + useLazyQuery, + useMutation, +} from "@apollo/client"; +import React, { useEffect, useState } from "react"; +import { v4 } from "uuid"; +import { + myOrders, + orderStatusChanged, + profile, + saveNotificationTokenWeb, +} from "../apollo/server"; + +const PROFILE = gql` + ${profile} +`; + +const ORDERS = gql` + ${myOrders} +`; +const SUBSCRIPTION_ORDERS = gql` + ${orderStatusChanged} +`; // rename this 'subscriptionOrders' when user context is complete + +const SAVE_NOTIFICATION_TOKEN_WEB = gql` + ${saveNotificationTokenWeb} +`; + +const UserContext = React.createContext({}); + +export const UserProvider = (props) => { + const [isLoading, setIsLoading] = useState(true); + const client = useApolloClient(); + const [token, setToken] = useState(localStorage.getItem("token")); + const [cart, setCart] = useState([]); // use initial state of cart here + const [restaurant, setRestaurant] = useState(null); + const [saveNotificationToken] = useMutation(SAVE_NOTIFICATION_TOKEN_WEB, { + onCompleted, + onError, + }); + const [ + fetchProfile, + { + called: calledProfile, + loading: loadingProfile, + error: errorProfile, + data: dataProfile, + }, + ] = useLazyQuery(PROFILE, { + fetchPolicy: "network-only", + onCompleted, + onError, + }); + + const [ + fetchOrders, + { + called: calledOrders, + loading: loadingOrders, + error: errorOrders, + data: dataOrders, + networkStatus: networkStatusOrders, + fetchMore: fetchMoreOrders, + subscribeToMore: subscribeToMoreOrders, + }, + ] = useLazyQuery(ORDERS, { + fetchPolicy: "network-only", + onCompleted, + onError, + }); + + useEffect(() => { + if (!token) { + setIsLoading(false); + return; + } + let isSubscribed = true; + (async () => { + isSubscribed && setIsLoading(true); + isSubscribed && (await fetchProfile()); + isSubscribed && (await fetchOrders()); + isSubscribed && setIsLoading(false); + })(); + return () => { + isSubscribed = false; + }; + }, [token]); + + useEffect(() => { + if (!dataProfile) return; + subscribeOrders(); + }, [dataProfile]); + + useEffect(() => { + let isSubscribed = true; + (async () => { + const restaurant = localStorage.getItem("restaurant"); + const cart = localStorage.getItem("cartItems"); + isSubscribed && setRestaurant(restaurant || null); + isSubscribed && setCart(cart ? JSON.parse(cart) : []); + })(); + return () => { + isSubscribed = false; + }; + }, []); + + function onCompleted({ profile, orders, saveNotificationTokenWeb }) { + + if (profile) { + updateNotificationToken(); + } + } + + function onError(error) { + console.log("error", error.message); + } + + const setTokenAsync = async (tokenReq, cb = () => {}) => { + setToken(tokenReq); + localStorage.setItem("token", tokenReq); + cb(); + }; + + const logout = async () => { + try { + localStorage.removeItem("token"); + setToken(null); + await client.resetStore(); + } catch (error) { + console.log("error on logout", error); + } + }; + + const subscribeOrders = () => { + + try { + const unsubscribeOrders = subscribeToMoreOrders({ + document: SUBSCRIPTION_ORDERS, + variables: { userId: dataProfile.profile._id }, + updateQuery: (prev, { subscriptionData }) => { + + if (!subscriptionData.data) return prev; + const { _id } = subscriptionData.data.orderStatusChanged.order; + if (subscriptionData.data.orderStatusChanged.origin === "new") { + if (prev?.orders?.findIndex((o) => o._id === _id) > -1) return prev; + return { + orders: [ + subscriptionData.data.orderStatusChanged.order, + ...prev.orders, + ], + }; + } else { + const { orders } = prev; + let newList = [...orders]; + const orderIndex = newList.findIndex((o) => o._id === _id); + if (orderIndex > -1) { + newList[orderIndex] = + subscriptionData.data.orderStatusChanged.order; + } + return { + orders: [...newList], + }; + } + }, + }); + client.onResetStore(unsubscribeOrders); + } catch (error) { + console.log("error subscribing order", error.message); + } + }; + + const fetchMoreOrdersFunc = () => { + if (networkStatusOrders === 7) { + fetchMoreOrders({ + variables: { offset: dataOrders.orders.length + 1 }, + updateQuery: (previousResult, { fetchMoreResult }) => { + // Don't do anything if there weren't any new items + if (!fetchMoreResult || fetchMoreResult.orders.length === 0) { + return previousResult; + } + return { + // Append the new feed results to the old one + orders: previousResult.orders.concat(fetchMoreResult.orders), + }; + }, + }); + } + }; + + const clearCart = () => { + setCart([]); + setRestaurant(null); + localStorage.removeItem("cartItems"); + localStorage.removeItem("restaurant"); + }; + + const addQuantity = async (key, quantity = 1) => { + const cartIndex = cart.findIndex((c) => c.key === key); + cart[cartIndex].quantity += quantity; + setCart([...cart]); + localStorage.setItem("cartItems", JSON.stringify([...cart])); + }; + + const deleteItem = async (key) => { + const cartIndex = cart.findIndex((c) => c.key === key); + if (cartIndex > -1) { + cart.splice(cartIndex, 1); + const items = [...cart.filter((c) => c.quantity > 0)]; + setCart(items); + if (items.length === 0) setRestaurant(null); + localStorage.setItem("cartItems", JSON.stringify(items)); + } + }; + + const removeQuantity = async (key) => { + const cartIndex = cart.findIndex((c) => c.key === key); + cart[cartIndex].quantity -= 1; + const items = [...cart.filter((c) => c.quantity > 0)]; + setCart(items); + if (items.length === 0) setRestaurant(null); + localStorage.setItem("cartItems", JSON.stringify(items)); + }; + + const checkItemCart = (itemId) => { + const cartIndex = cart.findIndex((c) => c._id === itemId); + if (cartIndex < 0) { + return { + exist: false, + quantity: 0, + }; + } else { + return { + exist: true, + quantity: cart[cartIndex].quantity, + key: cart[cartIndex].key, + }; + } + }; + + const numberOfCartItems = () => { + return cart + .map((c) => c.quantity) + .reduce(function (a, b) { + return a + b; + }, 0); + }; + + const addCartItem = async ( + _id, + variation, + quantity = 1, + addons = [], + clearFlag, + specialInstructions = "" + ) => { + const cartItems = clearFlag ? [] : cart; + cartItems.push({ + key: v4(), + _id, + quantity: quantity, + variation: { + _id: variation, + }, + addons, + specialInstructions, + }); + + localStorage.setItem("cartItems", JSON.stringify([...cartItems])); + setCart([...cartItems]); + }; + + const updateCart = async (cart) => { + setCart(cart); + localStorage.setItem("cartItems", JSON.stringify(cart)); + }; + + const setCartRestaurant = async (id) => { + setRestaurant(id); + localStorage.setItem("restaurant", id); + }; + + const updateNotificationToken = () => { + + const token = localStorage.getItem("messaging-token"); + if (token) { + + saveNotificationToken({ variables: { token } }); + } + }; + + return ( + <UserContext.Provider + value={{ + isLoggedIn: !!token, + loadingProfile: loadingProfile && calledProfile, + errorProfile, + profile: + dataProfile && dataProfile.profile ? dataProfile.profile : null, + setTokenAsync, + logout, + loadingOrders: loadingOrders && calledOrders, + errorOrders, + orders: dataOrders && dataOrders.orders ? dataOrders.orders : [], + fetchOrders, + fetchMoreOrdersFunc, + networkStatusOrders, + cart, + cartCount: numberOfCartItems(), + clearCart, + updateCart, + addQuantity, + removeQuantity, + addCartItem, + checkItemCart, + deleteItem, + restaurant, + setCartRestaurant, + isLoading, + }} + > + {props.children} + </UserContext.Provider> + ); +}; + +export const UserConsumer = UserContext.Consumer; +export default UserContext; diff --git a/enatega-multivendor-web/src/hooks/index.js b/enatega-multivendor-web/src/hooks/index.js new file mode 100644 index 0000000..5b43021 --- /dev/null +++ b/enatega-multivendor-web/src/hooks/index.js @@ -0,0 +1,4 @@ +import useLocation from './useLocation' +import useRestaurant from './useRestaurant' + +export { useLocation, useRestaurant } diff --git a/enatega-multivendor-web/src/hooks/useChat.js b/enatega-multivendor-web/src/hooks/useChat.js new file mode 100644 index 0000000..8c0fb58 --- /dev/null +++ b/enatega-multivendor-web/src/hooks/useChat.js @@ -0,0 +1,96 @@ +import { useState, useEffect, useContext, useCallback, useRef } from "react"; +import gql from "graphql-tag"; +import { + subscriptionNewMessage, + sendChatMessage, + chat, +} from "../apollo/server"; +import { useMutation, useQuery } from "@apollo/client"; +import UserContext from "../context/User"; + +export const useChatScreen = (id) => { + const messageContainerRef = useRef() + const { profile } = useContext(UserContext); + const { subscribeToMore: subscribeToMessages, data: chatData } = useQuery( + gql` + ${chat} + `, + { + variables: { order: id }, + fetchPolicy: "network-only", + onError, + } + ); + const messageSetter = useCallback(() => { + if (chatData) { + setMessages( + chatData.chat.map((message) => ({ + _id: message.id, + text: message.message, + createdAt: message.createdAt, + user: { + _id: message.user.id, + name: message.user.name, + }, + })) + ); + } + }, [chatData]); + + useEffect(() => { + messageSetter(); + }, [chatData, messageSetter]); + + const [send] = useMutation( + gql` + ${sendChatMessage} + `, + { + onError, + } + ); + function onError(error) { + alert("Error onError", error.message); + } + const [messages, setMessages] = useState([]); + + useEffect(() => { + const unsubscribe = subscribeToMessages({ + document: gql` + ${subscriptionNewMessage} + `, + variables: { order: id }, + updateQuery: (prev, { subscriptionData }) => { + if (!subscriptionData.data) return prev; + return { + chat: [...prev.chat, subscriptionData.data.subscriptionNewMessage], + }; + }, + }); + return unsubscribe; + }); + + const onSend = (input) => { + send({ + variables: { + orderId: id, + messageInput: { + message: input, + user: { + id: profile._id, + name: profile.name, + }, + }, + }, + }); + }; + + return { + messages, + onSend, + profile, + setMessages, + messageSetter, + messageContainerRef + }; +}; diff --git a/enatega-multivendor-web/src/hooks/useLocation.js b/enatega-multivendor-web/src/hooks/useLocation.js new file mode 100644 index 0000000..0a09592 --- /dev/null +++ b/enatega-multivendor-web/src/hooks/useLocation.js @@ -0,0 +1,41 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import Geocode from "react-geocode"; +import ConfigurableValues from "../config/constants"; + +export default function useLocation() { + const { GOOGLE_MAPS_KEY } = ConfigurableValues(); + + Geocode.setApiKey(GOOGLE_MAPS_KEY); + Geocode.setLanguage("en"); + Geocode.enableDebug(false); + const latLngToGeoString = async ({ latitude, longitude }) => { + const location = await Geocode.fromLatLng(latitude, longitude); + return location.results[0].formatted_address; + }; + const getCurrentLocation = (callback) => { + navigator.geolocation.getCurrentPosition( + async (position) => { + const { latitude, longitude } = position.coords; + try { + const location = await Geocode.fromLatLng(latitude, longitude); + callback(null, { + label: "Home", + latitude, + longitude, + deliveryAddress: location.results[0].formatted_address, + }); + } catch (error) { + callback(error); + } + }, + (error) => { + callback(error.message); + console.log(error.message); + } + ); + }; + return { + getCurrentLocation, + latLngToGeoString, + }; +} diff --git a/enatega-multivendor-web/src/hooks/useRegistration.js b/enatega-multivendor-web/src/hooks/useRegistration.js new file mode 100644 index 0000000..5257d20 --- /dev/null +++ b/enatega-multivendor-web/src/hooks/useRegistration.js @@ -0,0 +1,118 @@ +import { gql, useMutation } from "@apollo/client"; +import { useCallback, useContext, useState } from "react"; +import { login } from "../apollo/server"; +import UserContext from "../context/User"; +import Analytics from "../utils/analytics"; + +const LOGIN = gql` + ${login} +`; + +function useRegistration() { + const { setTokenAsync } = useContext(UserContext); + const [loading, setLoading] = useState(false); + const [loginError, setLoginError] = useState(false); + const [login, setLogin] = useState(false); + const [loginButton, loginButtonSetter] = useState(null); + const [Login] = useMutation(LOGIN, { onCompleted, onError }); + + const toggleSnackbar = useCallback(() => { + setLoginError(""); + setLogin(false); + }, []); + + async function onCompleted({ login }) { + try { + if (login.inNewUser) { + await Analytics.identify( + { + userId: login.userId, + name: login.name, + email: login.email, + }, + login.userId + ); + await Analytics.track(Analytics.events.USER_CREATED_ACCOUNT, { + userId: login.userId, + name: login.name, + email: login.email, + }); + } else { + await Analytics.identify( + { + userId: login.userId, + name: login.name, + email: login.email, + }, + login.userId + ); + await Analytics.track(Analytics.events.USER_LOGGED_IN, { + userId: login.userId, + name: login.name, + email: login.email, + }); + } + setLogin(true); + await setTokenAsync(login.token); + } catch (e) { + setLoginError("Something went wrong"); + console.log("Error While saving token:", e); + } finally { + setLoading(false); + } + } + + function onError(errors) { + setLoading(false); + setLoginError(errors.message || "Invalid credentials!"); + } + + const authenticationFailure = useCallback((response) => { + console.log("Authentication Failed: ", response); + setLoading(false); + loginButtonSetter(null); + setLoginError("Something went wrong"); + }, []); + + const mutateLogin = useCallback( + async (user) => { + Login({ + variables: { + ...user, + }, + }); + }, + [Login] + ); + + const goolgeSuccess = useCallback( + (response) => { + const user = { + phone: "", + email: response.profileObj.email, + password: "", + name: response.profileObj.name, + picture: response.profileObj.imageUrl, + type: "google", + }; + mutateLogin(user); + }, + [mutateLogin] + ); + + return { + loading, + setLoading, + loginButton, + loginButtonSetter, + mutateLogin, + goolgeSuccess, + authenticationFailure, + setLoginError, + loginError, + login, + toggleSnackbar, + }; +} + +export default useRegistration; diff --git a/enatega-multivendor-web/src/hooks/useRestaurant.js b/enatega-multivendor-web/src/hooks/useRestaurant.js new file mode 100644 index 0000000..8601176 --- /dev/null +++ b/enatega-multivendor-web/src/hooks/useRestaurant.js @@ -0,0 +1,14 @@ +import { gql, useQuery } from "@apollo/client"; +import { restaurant } from "../apollo/server"; + +const RESTAURANT = gql` + ${restaurant} +`; + +export default function useRestaurant(id, slug) { + const { data, refetch, networkStatus, loading, error } = useQuery(RESTAURANT, { + variables: { id, slug }, + fetchPolicy: "network-only", + }); + return { data, refetch, networkStatus, loading, error }; +} diff --git a/enatega-multivendor-web/src/i18n.js b/enatega-multivendor-web/src/i18n.js new file mode 100644 index 0000000..ebc855f --- /dev/null +++ b/enatega-multivendor-web/src/i18n.js @@ -0,0 +1,27 @@ +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import ar from "./translations/ar"; +import en from "./translations/en"; +import zh from "./translations/zh"; +import de from "./translations/de"; +import km from "./translations/km"; +import fr from "./translations/fr"; + +i18n.use(initReactI18next).init({ + resources: { + ar: ar, + en: en, + de: de, + zh: zh, + fr: fr, + km: km, + }, + lng: localStorage.getItem("enatega-language") || "en", + fallbackLng: "en", + debug: true, + interpolation: { + escapeValue: false, // not needed for react!! + }, +}); + +export default i18n; diff --git a/enatega-multivendor-web/src/index.css b/enatega-multivendor-web/src/index.css new file mode 100644 index 0000000..7fe5c7f --- /dev/null +++ b/enatega-multivendor-web/src/index.css @@ -0,0 +1,13 @@ +body { + margin: 0; + font-family: "Poppins Open Sans", -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", + "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +code { + font-family: "Poppins Open Sans", source-code-pro, Menlo, Monaco, Consolas, + "Courier New", monospace; +} diff --git a/enatega-multivendor-web/src/index.js b/enatega-multivendor-web/src/index.js new file mode 100644 index 0000000..833e9a8 --- /dev/null +++ b/enatega-multivendor-web/src/index.js @@ -0,0 +1,53 @@ +import { ApolloProvider } from "@apollo/client"; +import { ThemeProvider, StyledEngineProvider } from "@mui/material"; +import React, { useEffect } from "react"; +import ReactDOM from "react-dom"; +import setupAplloClient from "./apollo/index"; +import App from "./App"; +import { ConfigurationProvider } from "./context/Configuration"; +import { LocationProvider } from "./context/Location"; +import { UserProvider } from "./context/User"; +import "./index.css"; +import reportWebVitals from "./reportWebVitals"; +import theme from "./utils/theme"; +import * as Sentry from "@sentry/react"; +import { Integrations } from "@sentry/tracing"; +import ConfigurableValues from "./config/constants"; + +function Main() { + const { SENTRY_DSN } = ConfigurableValues(); + + useEffect(() => { + if (SENTRY_DSN) { + Sentry.init({ + dsn: SENTRY_DSN, + integrations: [new Integrations.BrowserTracing()], + debug: true, + tracesSampleRate: 0.1, + }); + } + }, [SENTRY_DSN]); + + const client = setupAplloClient(); + return ( + <ApolloProvider client={client}> + <ConfigurationProvider> + <StyledEngineProvider injectFirst> + <ThemeProvider theme={theme}> + <UserProvider> + <LocationProvider> + <App /> + </LocationProvider> + </UserProvider> + </ThemeProvider> + </StyledEngineProvider> + </ConfigurationProvider> + </ApolloProvider> + ); +} +ReactDOM.render(<Main />, document.getElementById("root")); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/enatega-multivendor-web/src/reportWebVitals.js b/enatega-multivendor-web/src/reportWebVitals.js new file mode 100644 index 0000000..5253d3a --- /dev/null +++ b/enatega-multivendor-web/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = onPerfEntry => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/enatega-multivendor-web/src/routes/AuthRoute.js b/enatega-multivendor-web/src/routes/AuthRoute.js new file mode 100644 index 0000000..8585138 --- /dev/null +++ b/enatega-multivendor-web/src/routes/AuthRoute.js @@ -0,0 +1,21 @@ +import React, { useContext } from "react"; +import { Navigate, useLocation } from "react-router-dom"; +import UserContext from "../context/User"; + +function AuthRoute({ children }) { + const { isLoggedIn } = useContext(UserContext); + const location = useLocation(); + + if (isLoggedIn) + return ( + <Navigate + replace + to={{ + pathname: location.state?.from ? location.state.from : "/", + }} + /> + ); + return children; +} + +export default AuthRoute; diff --git a/enatega-multivendor-web/src/routes/PrivateRoute.js b/enatega-multivendor-web/src/routes/PrivateRoute.js new file mode 100644 index 0000000..cd46cc3 --- /dev/null +++ b/enatega-multivendor-web/src/routes/PrivateRoute.js @@ -0,0 +1,21 @@ +import React, { useContext } from "react"; +import { Navigate, useLocation } from "react-router-dom"; +import UserContext from "../context/User"; + +function PrivateRoute({ children }) { + const { isLoggedIn } = useContext(UserContext); + const location = useLocation(); + + if (!isLoggedIn) + return ( + <Navigate + to={{ + pathname: `/login/?redirect=${location.pathname}`, + }} + state={{ from: location.pathname }} + /> + ); + return children; +} + +export default PrivateRoute; diff --git a/enatega-multivendor-web/src/screens/Checkout/Checkout.js b/enatega-multivendor-web/src/screens/Checkout/Checkout.js new file mode 100644 index 0000000..0c95ebb --- /dev/null +++ b/enatega-multivendor-web/src/screens/Checkout/Checkout.js @@ -0,0 +1,806 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import { gql, useMutation } from "@apollo/client"; +import { + Box, + CircularProgress, + Container, + Dialog, + Grid, + Typography, + useTheme, + useMediaQuery, + Paper, + Divider, + IconButton, + Button, +} from "@mui/material"; +import React, { + useCallback, + useContext, + useEffect, + useState, + useRef, +} from "react"; +import { useNavigate } from "react-router-dom"; +import { myOrders, placeOrder } from "../../apollo/server"; +import CodIcon from "../../assets/icons/CodIcon"; +import RiderImage from "../../assets/images/rider.png"; +import MarkerImage from "../../assets/images/marker.png"; +import { + CartItemCard, + DeliveryCard, + PaymentCard, + PersonalCard, + OrderOption, +} from "../../components/Checkout"; +import CloseIcon from "@mui/icons-material/Close"; + +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { RestaurantClose } from "../../components/Modals"; +import ConfigurationContext from "../../context/Configuration"; +import { useLocationContext } from "../../context/Location"; +import UserContext from "../../context/User"; +import { useRestaurant } from "../../hooks"; +import { DAYS } from "../../utils/constantValues"; +import { paypalCurrencies, stripeCurrencies } from "../../utils/currencies"; +import { calculateDistance } from "../../utils/customFunction"; +import useStyle from "./styles"; + +import Analytics from "../../utils/analytics"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import { mapStyles } from "../OrderDetail/mapStyles"; +import RestMarker from "../../assets/images/rest-map-2.png"; +import NearMeIcon from "@mui/icons-material/NearMe"; +import clsx from "clsx"; + +import { useLocation } from "../../hooks"; +import { useTranslation } from "react-i18next"; + +import moment from "moment"; + +const PLACEORDER = gql` + ${placeOrder} +`; +const ORDERS = gql` + ${myOrders} +`; + +const PAYMENT = { + id: 2, + payment: "COD", + label: "Cash", + icon: <CodIcon />, +}; + +function Checkout() { + const { t } = useTranslation(); + const classes = useStyle(); + const navigate = useNavigate(); + const [isClose, setIsClose] = useState(false); + const [mainError, setMainError] = useState({}); + const [loadingData, setLoadingData] = useState(false); + const configuration = useContext(ConfigurationContext); + const [addressModal, setAddressModal] = useState(false); + const [orderOptionModal, setOrderOptionModal] = useState(false); + const fetchRef = useRef(false); + + const [loadingLocation, setLoadingLocation] = useState(false); + const [selectedAddress, setSelectedAddress] = useState(null); + const { + profile, + clearCart, + restaurant: cartRestaurant, + cart, + cartCount, + addQuantity, + removeQuantity, + } = useContext(UserContext); + + const { location, setLocation } = useLocationContext(); + // const { getCurrentLocation } = useLocation(); + const theme = useTheme(); + const [minimumOrder, setMinimumOrder] = useState(""); + const [selectedTip, setSelectedTip] = useState(); + const [paymentMethod, setPaymentMethod] = useState(PAYMENT); + const [taxValue, setTaxValue] = useState(); + + const [coupon, setCoupon] = useState({}); + const [selectedDate, handleDateChange] = useState(new Date()); + const [isPickUp, setIsPickUp] = useState(false); + const [deliveryCharges, setDeliveryCharges] = useState(0); + + let restCoordinates = {}; + const { loading, data, error } = useRestaurant(cartRestaurant); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const [mutateOrder, { loading: loadingOrderMutation }] = useMutation( + PLACEORDER, + { + onCompleted, + onError, + update, + } + ); + useEffect(() => { + if (!location) { + let localStorageLocation = localStorage.getItem("location"); + localStorageLocation = JSON.parse(localStorageLocation); + if (localStorageLocation) { + setLocation(localStorageLocation); + } + } + }, []); + + useEffect(() => { + (async () => { + if (data && !!data.restaurant) { + const latOrigin = Number(data.restaurant.location.coordinates[1]); + const lonOrigin = Number(data.restaurant.location.coordinates[0]); + const latDest = Number(location.latitude); + const longDest = Number(location.longitude); + const distance = await calculateDistance( + latOrigin, + lonOrigin, + latDest, + longDest + ); + const amount = Math.ceil(distance) * configuration.deliveryRate; + setDeliveryCharges(amount > 0 ? amount : configuration.deliveryRate); + } + })(); + }, [data, location]); + + const onLoad = useCallback( + (map) => { + const bounds = new window.google.maps.LatLngBounds(); + map.panToBounds(bounds); + }, + [restCoordinates] + ); + + const isOpen = () => { + const date = new Date(); + const day = date.getDay(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const todaysTimings = data.restaurant.openingTimes.find( + (o) => o.day === DAYS[day] + ); + const times = todaysTimings.times.filter( + (t) => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ); + + return times.length > 0; + }; + const toggleAdressModal = useCallback(() => { + setAddressModal((prev) => !prev); + }, []); + + useEffect(() => { + if (cart && cartCount > 0) { + if ( + data && + data.restaurant && + (!data.restaurant.isAvailable || !isOpen()) + ) { + setIsClose((prev) => { + if (!prev) return true; + else return prev; + }); + } + } + }, [data]); + + const setDeliveryAddress = (item) => { + setSelectedAddress(item); + setLocation({ + _id: item?._id, + label: item?.label, + latitude: Number(item?.location.coordinates[1]), + longitude: Number(item?.location.coordinates[0]), + deliveryAddress: item?.deliveryAddress, + details: item?.details, + }); + }; + + const toggleCloseModal = useCallback(() => { + setIsClose((prev) => !prev); + }, []); + + const restaurantData = data?.restaurant ?? null; + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + if (loading || loadingData) { + return ( + <Grid container> + <Header /> + <Box className={classes.spinnerContainer}> + <CircularProgress color="primary" size={48} /> + </Box> + </Grid> + ); + } + + if (error) { + return ( + <Grid container> + <Header /> + <Box className={classes.spinnerContainer}> + <Typography>Unable to fetch data</Typography> + </Box> + </Grid> + ); + } + restCoordinates = { + lat: parseFloat(data.restaurant.location.coordinates[1]), + lng: parseFloat(data.restaurant.location.coordinates[0]), + }; + + function update(cache, { data: { placeOrder } }) { + console.log("update"); + if (placeOrder && placeOrder.paymentMethod === "COD") { + const data = cache.readQuery({ query: ORDERS }); + if (data) { + cache.writeQuery({ + query: ORDERS, + data: { orders: [placeOrder, ...data.orders] }, + }); + } + } + } + + function onError(error) { + console.log("Check-out Error", error); + showMessage({ + type: "error", + message: error.message, + }); + } + + function calculateTip() { + if (selectedTip) { + let total = 0; + const delivery = isPickUp ? 0 : deliveryCharges; + total += +calculatePrice(delivery, true); + total += +taxCalculation(); + const tipPercentage = ( + (total / 100) * + parseFloat(selectedTip).toFixed(2) + ).toFixed(2); + return tipPercentage; + } else { + return 0; + } + } + + function taxCalculation() { + const tax = taxValue ?? 0; + if (tax === 0) { + return tax.toFixed(2); + } + const delivery = isPickUp ? 0 : deliveryCharges; + const amount = +calculatePrice(delivery, true); + const taxAmount = ((amount / 100) * tax).toFixed(2); + return taxAmount; + } + async function onCompleted(data) { + await Analytics.track(Analytics.events.ORDER_PLACED, { + userId: data.placeOrder.user._id, + name: data.placeOrder.user.name, + email: data.placeOrder.user.email, + phoneNumber: data.placeOrder.user.phone, + orderId: data.placeOrder.orderId, + restaurantName: data.placeOrder.restaurant.name, + restaurantAddress: data.placeOrder.restaurant.address, + orderItems: data.placeOrder.items, + orderPaymentMethod: data.placeOrder.paymentMethod, + orderAmount: data.placeOrder.orderAmount, + orderPaidAmount: data.placeOrder.paidAmount, + tipping: data.placeOrder.tipping, + orderStatus: data.placeOrder.orderStatus, + orderDate: data.placeOrder.orderDate, + }); + if (paymentMethod.payment === "COD") { + await clearCart(); + navigate(`/order-detail/${data.placeOrder._id}`, { replace: true }); + } else if (paymentMethod.payment === "PAYPAL") { + navigate(`/paypal?id=${data.placeOrder._id}`, { replace: true }); + } else if (paymentMethod.payment === "STRIPE") { + navigate(`/stripe?id=${data.placeOrder._id}`, { replace: true }); + } + } + + function calculatePrice(delivery = 0, withDiscount) { + let itemTotal = 0; + cart.forEach((cartItem) => { + itemTotal += cartItem.price * cartItem.quantity; + }); + if (withDiscount && coupon && coupon.discount) { + itemTotal = itemTotal - (coupon.discount / 100) * itemTotal; + } + const deliveryAmount = delivery > 0 ? deliveryCharges : 0; + return (itemTotal + deliveryAmount).toFixed(2); + } + + function calculateTotal() { + let total = 0; + const delivery = isPickUp ? 0 : deliveryCharges; + total += +calculatePrice(delivery, true); + total += +taxCalculation(); + total += +calculateTip(); + return parseFloat(total).toFixed(2); + } + + function transformOrder(cartData) { + return cartData.map((food) => { + return { + food: food._id, + quantity: food.quantity, + variation: food.variation._id, + addons: food.addons + ? food.addons.map(({ _id, options }) => ({ + _id, + options: options.map(({ _id }) => _id), + })) + : [], + specialInstructions: food.specialInstructions, + }; + }); + } + + function checkPaymentMethod(currency) { + if (paymentMethod.payment === "STRIPE") { + return stripeCurrencies.find((val) => val.currency === currency); + } + if (paymentMethod.payment === "PAYPAL") { + return paypalCurrencies.find((val) => val.currency === currency); + } + return true; + } + + async function onPayment() { + if (checkPaymentMethod(configuration.currency)) { + const items = transformOrder(cart); + mutateOrder({ + variables: { + restaurant: cartRestaurant, + orderInput: items, + paymentMethod: paymentMethod.payment, + couponCode: coupon ? coupon.title : null, + tipping: +calculateTip(), + taxationAmount: +taxCalculation(), + address: { + label: location.label, + deliveryAddress: location.deliveryAddress, + details: location.details, + longitude: "" + location.longitude, + latitude: "" + location.latitude, + }, + orderDate: selectedDate, + isPickedUp: isPickUp, + deliveryCharges: isPickUp ? 0 : deliveryCharges, + }, + }); + } else { + showMessage({ + type: "warning", + message: "Payment not supported", + }); + } + } + + const locationCallback = (error, data) => { + setLoadingLocation(false); // Stop loading + if (error) { + console.error(error); + return; + } + + // Create an object for the selected address using the current location data + const selectedAddress = { + label: "Your Location", + deliveryAddress: data.label, + details: data.details, + latitude: data.coords.latitude, + longitude: data.coords.longitude, + }; + + // Update the selected address in state + setSelectedAddress(selectedAddress); + setAddressModal((prev) => !prev); + }; + + const getCurrentLocation = () => { + setLoadingLocation(true); // Start loading (optional) + + if ("geolocation" in navigator) { + navigator.geolocation.getCurrentPosition( + (position) => { + locationCallback(null, position); + }, + (error) => { + locationCallback(error, null); + } + ); + } else { + // Geolocation is not supported by the browser + locationCallback(new Error("Geolocation is not supported."), null); + } + }; + + function validateOrder() { + if (!data.restaurant.isAvailable || !isOpen()) { + toggleCloseModal(); + return; + } + if (!cart.length) { + showMessage({ + type: "error", + message: "Cart is Empty.", + }); + return false; + } + const delivery = isPickUp ? 0 : deliveryCharges; + if (calculatePrice(delivery, true) < minimumOrder) { + showMessage({ + type: "warning", + message: `The minimum amount of (${configuration.currencySymbol} ${minimumOrder}) for your order has not been reached.`, + }); + return false; + } + if (!location) { + showMessage({ + alive: true, + type: "Warning", + message: "Select your address.", + }); + return false; + } + if (!paymentMethod) { + showMessage({ + type: "warning", + message: "Set payment method before checkout", + }); + return false; + } + if (profile.phone.length < 1) { + showMessage({ + alive: true, + type: "Error", + message: t("phoneNumMissing"), + }); + + setTimeout(() => { + navigate("/phone-number"); + }, 1000); + + return false; + } + if (!profile.phoneIsVerified) { + showMessage({ + alive: true, + type: "Error", + message: "Phone Number is not verified", + }); + + setTimeout(() => { + navigate("/phone-number"); + }, 1000); + + return false; + } + return true; + } + // console.log("isPickUp", isPickUp, selectedDate); + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + alive={mainError.alive || false} + /> + + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + <Grid container item> + <Grid item xs={12} className={classes.topContainer}> + <GoogleMap + mapContainerStyle={{ + height: "450px", + width: "100%", + }} + zoom={14} + center={restCoordinates} + onLoad={restCoordinates && onLoad} + options={{ + styles: mapStyles, + zoomControl: true, + zoomControlOptions: { + position: window.google.maps.ControlPosition.RIGHT_CENTER, + }, + }} + > + {location && ( + <Marker + position={{ + lat: location?.latitude, + lng: location?.longitude, + }} + icon={MarkerImage} + /> + )} + <Marker position={restCoordinates} icon={RestMarker} /> + </GoogleMap> + </Grid> + </Grid> + <Container maxWidth="md" className={classes.containerCard}> + <Box + className={classes.headerBar} + display="flex" + alignItems={"center"} + > + <Box display="flex" alignItems="center" justifyContent="center"> + <img src={RiderImage} alt="rider" /> + </Box> + <Box + display="flex" + justifyContent="center" + flexDirection="column" + style={{ + marginLeft: "20px", + }} + > + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.common.black, + fontSize: "1.275rem", + fontWeight: 600, + }} + > + {t("deliveryTime")} + </Typography> + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.grey[600], + fontSize: "0.775rem", + fontWeight: 600, + }} + > + {moment().format("DD-MM-YYYY")} | {moment().format("LT")} + </Typography> + <Box display="flex" mt={2} alignItems="center"> + <Typography + style={{ + ...theme.typography.body1, + color: theme.palette.common.white, + fontSize: "0.875rem", + fontWeight: 600, + }} + > + {isPickUp ? t("pickUp") : t("delivery")} + </Typography> + <Button + variant="contained" + style={{ + marginLeft: theme.spacing(1), + backgroundColor: "black", + borderRadius: theme.spacing(1.5), + }} + onClick={() => setOrderOptionModal((prev) => !prev)} + > + <Typography + style={{ + color: theme.palette.common.white, + fontSize: "0.775rem", + fontWeight: 600, + textTransform: "capitalize", + }} + > + {t("change")} + </Typography> + </Button> + <OrderOption + selectedDate={selectedDate} + handleDateChange={handleDateChange} + setIsPickUp={setIsPickUp} + orderOptionModal={orderOptionModal} + setOrderOptionModal={setOrderOptionModal} + isPickUp={isPickUp} + /> + </Box> + </Box> + </Box> + <Grid container spacing={2} sx={{ mt: 2, mb: 25 }}> + <Grid item xs={12} sm={6}> + <CartItemCard + setSelectedTip={setSelectedTip} + selectedTip={selectedTip} + setTaxValue={setTaxValue} + setCoupon={setCoupon} + restaurantData={restaurantData} + setFlashMessage={showMessage} + calculateTotal={calculateTotal} + calculatePrice={calculatePrice} + taxCalculation={taxCalculation} + calculateTip={calculateTip} + isPickUp={isPickUp} + deliveryCharges={deliveryCharges} + addQuantity={addQuantity} + removeQuantity={removeQuantity} + /> + </Grid> + <Grid item xs={12} sm={6}> + {!isPickUp && ( + <Dialog + fullScreen={extraSmall} + onClose={toggleAdressModal} + open={addressModal} + maxWidth="md" + PaperProps={{ + style: { + borderRadius: 30, + overflowY: "scroll", + height: extraSmall ? 500 : null, + }, + }} + > + <> + <Box display="flex" justifyContent="flex-end"> + <IconButton + size={extraSmall ? "medium" : "small"} + onClick={toggleAdressModal} + className={classes.closeContainer} + > + <CloseIcon color="primary" /> + </IconButton> + </Box> + <Box style={{ width: "90%", margin: `16px auto` }}> + <Box display="flex"> + <Typography + style={{ color: theme.palette.primary.main }} + variant="caption" + fontWeight={800} + > + {t("deliverTo")}: + </Typography> + <Typography + style={{ + color: theme.palette.common.black, + marginLeft: 10, + }} + variant="caption" + fontWeight={800} + > + {location?.label} + </Typography> + </Box> + <Typography + style={{ color: theme.palette.grey[600] }} + variant="caption" + fontWeight={600} + > + {location?.deliveryAddress} + </Typography> + </Box> + + <Grid + //container + item + xs={12} + justifyContent="center" + style={{ + background: theme.palette.common.white, + padding: theme.spacing(2, 0), + marginLeft: "20px", + }} + > + <Paper + className={classes.deliveryPaperProfile} + style={{ width: "90%" }} + > + <Box + className={clsx( + classes.PH1, + classes.PB2, + classes.PT2 + )} + display="flex" + justifyContent="space-between" + alignItems="center" + onClick={(e) => { + e.preventDefault(); + console.log("clicked"); + getCurrentLocation(); + }} + > + <Box display="flex" alignItems="center"> + <NearMeIcon + width={100} + height={100} + style={{ color: theme.palette.common.black }} + /> + <Typography + variant="subtitle2" + color="textSecondary" + align="left" + className={clsx(classes.smallText, classes.PH1)} + fontWeight={600} + > + {t("currentLocation")} + </Typography> + </Box> + {loadingLocation && ( + <CircularProgress color={"warning"} /> + )} + </Box> + </Paper> + </Grid> + <Divider + orientation="horizontal" + className={classes.divider} + /> + <DeliveryCard + selectedAddress={selectedAddress} + setSelectedAddress={setDeliveryAddress} + isProfile={true} + isCheckout={true} + close={toggleAdressModal} + /> + </> + </Dialog> + )} + + <PersonalCard + toggleModal={toggleAdressModal} + location={location} + /> + <PaymentCard + paymentMethod={paymentMethod} + setPaymentMethod={setPaymentMethod} + validateOrder={validateOrder} + onPayment={onPayment} + loading={loadingOrderMutation} + calculateTotal={calculateTotal} + /> + </Grid> + </Grid> + </Container> + </Grid> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + <RestaurantClose + closeMenu={false} + isVisible={isClose} + toggleModal={toggleCloseModal} + restaurant={restaurantData.name} + /> + </Grid> + ); +} + +export default Checkout; diff --git a/enatega-multivendor-web/src/screens/Checkout/styles.js b/enatega-multivendor-web/src/screens/Checkout/styles.js new file mode 100644 index 0000000..476efeb --- /dev/null +++ b/enatega-multivendor-web/src/screens/Checkout/styles.js @@ -0,0 +1,140 @@ +import makeStyles from "@mui/styles/makeStyles"; +import { useTheme } from "@mui/material"; +import Bg from "../../assets/images/bg-invert.png"; + +const useStyles = makeStyles((theme) => { + const currentTheme = useTheme(); + + return { + root: { + background: theme.palette.grey[100], + }, + mt2: { + marginTop: theme.spacing(2), + }, + PV3: { + padding: theme.spacing(3, 0), + }, + contentContainer: { + padding: theme.spacing(0, 3), + }, + mainContainer: { + marginTop: "-10px", + background: theme.palette.grey[100], + backgroundImage: `url(${Bg})`, + backgroundPositionX: "left", + backgroundPositionY: "bottom", + backgroundSize: "400px", + backgroundRepeat: "no-repeat", + }, + center: { + justifyContent: "center", + }, + spinnerContainer: { + flexDirection: "row", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + height: "100vh", + }, + title: { + fontWeight: theme.typography.fontWeightLight, + fontSize: "3rem", + color: theme.palette.secondary.light, + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + disableText: { + color: theme.palette.text.disabled, + }, + smallText: { + fontSize: "0.875rem", + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + heartBG: { + display: "flex", + backgroundColor: currentTheme.palette.common.white, + alignItems: "center", + justifyContent: "center", + width: 30, + height: 30, + borderRadius: 15, + boxShadow: theme.shadows[5], + }, + link: { + textDecoration: "none", + }, + paymentInfoBtn: { + width: "100%", + height: "100%", + justifyContent: "space-between", + padding: theme.spacing(1), + marginTop: theme.spacing(4), + border: `1px solid ${theme.palette.grey[300]}`, + }, + containerCard: { + marginTop: "-90px", + zIndex: 99, + }, + headerBar: { + background: "linear-gradient(260.99deg, #90EA93 2.79%, #6FCF97 96.54%)", + borderRadius: "20px", + padding: "30px 20px", + }, + PH1: { + padding: theme.spacing(0, 1), + }, + PB2: { + paddingBottom: theme.spacing(2), + }, + PT2: { + paddingTop: theme.spacing(2), + }, + MV1: { + margin: theme.spacing(1, 0), + }, + MV2: { + margin: theme.spacing(2, 0), + }, + + divider: { + width: "75%", + background: "black", + margin: `${theme.spacing(2)} auto`, + }, + deliveryPaperProfile: { + background: theme.palette.primary.main, + borderRadius: 10, + cursor: "pointer", + border: "none", + }, + closeContainer: { + position: "absolute", + background: "black", + top: theme.spacing(1), + right: theme.spacing(1), + "&:hover": { + backgroundColor: "black", + }, + }, + footerContainer: { + width: "100%", + background: theme.palette.grey[100], + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, + }; +}); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Checkout/temp.js b/enatega-multivendor-web/src/screens/Checkout/temp.js new file mode 100644 index 0000000..af36069 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Checkout/temp.js @@ -0,0 +1,472 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable no-unused-vars */ +import { gql, useMutation } from "@apollo/client"; +import { + Box, + CircularProgress, + Container, + Grid, + Typography, +} from "@mui/material"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { myOrders, placeOrder } from "../../apollo/server"; +import CodIcon from "../../assets/icons/CodIcon"; +import { + CartItemCard, + DeliveryCard, + PaymentCard, + PersonalCard, + OrderOption, +} from "../../components/Checkout"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { RestaurantClose } from "../../components/Modals"; +import ConfigurationContext from "../../context/Configuration"; +import { LocationContext, useLocationContext } from "../../context/Location"; +import UserContext from "../../context/User"; +import { useRestaurant } from "../../hooks"; +import { DAYS } from "../../utils/constantValues"; +import { paypalCurrencies, stripeCurrencies } from "../../utils/currencies"; +import { calculateDistance } from "../../utils/customFunction"; +import useStyle from "./styles"; +import Analytics from "../../utils/analytics"; + +const PLACEORDER = gql` + ${placeOrder} +`; +const ORDERS = gql` + ${myOrders} +`; + +const PAYMENT = { + id: 2, + payment: "COD", + label: "Cash", + icon: <CodIcon />, +}; + +function Checkout() { + const classes = useStyle(); + const navigate = useNavigate(); + const [isClose, setIsClose] = useState(false); + const [mainError, setMainError] = useState({}); + const [loadingData, setLoadingData] = useState(false); + const configuration = useContext(ConfigurationContext); + const { + profile, + clearCart, + restaurant: cartRestaurant, + cart, + cartCount, + } = useContext(UserContext); + const { location, setLocation } = useLocationContext(); + + const [minimumOrder, setMinimumOrder] = useState(""); + const [selectedTip, setSelectedTip] = useState(); + const [paymentMethod, setPaymentMethod] = useState(PAYMENT); + const [taxValue, setTaxValue] = useState(); + const [selectedAddress, setSelectedAddress] = useState(); + const [coupon, setCoupon] = useState({}); + const [selectedDate, handleDateChange] = useState(new Date()); + const [isPickUp, setIsPickUp] = useState(false); + const [deliveryCharges, setDeliveryCharges] = useState(0); + + const { loading, data, error } = useRestaurant(cartRestaurant); + + const [mutateOrder, { loading: loadingOrderMutation }] = useMutation( + PLACEORDER, + { + onCompleted, + onError, + update, + } + ); + useEffect(() => { + if (!location) { + let localStorageLocation = localStorage.getItem("location"); + localStorageLocation = JSON.parse(localStorageLocation); + if (localStorageLocation) { + setLocation(localStorageLocation); + } + } + }, []); + + useEffect(() => { + (async () => { + if (data && !!data.restaurant) { + const latOrigin = Number(data.restaurant.location.coordinates[1]); + const lonOrigin = Number(data.restaurant.location.coordinates[0]); + const latDest = Number(location.latitude); + const longDest = Number(location.longitude); + const distance = await calculateDistance( + latOrigin, + lonOrigin, + latDest, + longDest + ); + const amount = Math.ceil(distance) * configuration.deliveryRate; + setDeliveryCharges(amount > 0 ? amount : configuration.deliveryRate); + } + })(); + }, [data, location]); + + const isOpen = () => { + const date = new Date(); + const day = date.getDay(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const todaysTimings = data.restaurant.openingTimes.find( + (o) => o.day === DAYS[day] + ); + const times = todaysTimings.times.filter( + (t) => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ); + + return times.length > 0; + }; + + useEffect(() => { + if (cart && cartCount > 0) { + if ( + data && + data.restaurant && + (!data.restaurant.isAvailable || !isOpen()) + ) { + setIsClose((prev) => { + if (!prev) return true; + else return prev; + }); + } + } + }, [data]); + + const setDeliveryAddress = (item) => { + setSelectedAddress(item); + setLocation({ + _id: item?._id, + label: item?.label, + latitude: Number(item?.location.coordinates[1]), + longitude: Number(item?.location.coordinates[0]), + deliveryAddress: item?.deliveryAddress, + details: item?.details, + }); + }; + + const toggleCloseModal = useCallback(() => { + setIsClose((prev) => !prev); + }, []); + + const restaurantData = data?.restaurant ?? null; + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + if (loading || loadingData) { + return ( + <Grid container> + <Header /> + <Box className={classes.spinnerContainer}> + <CircularProgress color="primary" size={48} /> + </Box> + </Grid> + ); + } + + if (error) { + return ( + <Grid container> + <Header /> + <Box className={classes.spinnerContainer}> + <Typography>Unable to fetch data</Typography> + </Box> + </Grid> + ); + } + + function update(cache, { data: { placeOrder } }) { + if (placeOrder && placeOrder.paymentMethod === "COD") { + const data = cache.readQuery({ query: ORDERS }); + if (data) { + cache.writeQuery({ + query: ORDERS, + data: { orders: [placeOrder, ...data.orders] }, + }); + } + } + } + + function onError(error) { + showMessage({ + type: "error", + message: error.message, + }); + } + + function calculateTip() { + if (selectedTip) { + let total = 0; + const delivery = isPickUp ? 0 : deliveryCharges; + total += +calculatePrice(delivery, true); + total += +taxCalculation(); + const tipPercentage = ( + (total / 100) * + parseFloat(selectedTip).toFixed(2) + ).toFixed(2); + return tipPercentage; + } else { + return 0; + } + } + + function taxCalculation() { + const tax = taxValue ?? 0; + if (tax === 0) { + return tax.toFixed(2); + } + const delivery = isPickUp ? 0 : deliveryCharges; + const amount = +calculatePrice(delivery, true); + const taxAmount = ((amount / 100) * tax).toFixed(2); + return taxAmount; + } + async function onCompleted(data) { + await Analytics.track(Analytics.events.ORDER_PLACED, { + userId: data.placeOrder.user._id, + name: data.placeOrder.user.name, + email: data.placeOrder.user.email, + phoneNumber: data.placeOrder.user.phone, + orderId: data.placeOrder.orderId, + restaurantName: data.placeOrder.restaurant.name, + restaurantAddress: data.placeOrder.restaurant.address, + orderItems: data.placeOrder.items, + orderPaymentMethod: data.placeOrder.paymentMethod, + orderAmount: data.placeOrder.orderAmount, + orderPaidAmount: data.placeOrder.paidAmount, + tipping: data.placeOrder.tipping, + orderStatus: data.placeOrder.orderStatus, + orderDate: data.placeOrder.orderDate, + }); + if (paymentMethod.payment === "COD") { + await clearCart(); + navigate(`/order-detail/${data.placeOrder._id}`, { replace: true }); + } else if (paymentMethod.payment === "PAYPAL") { + navigate(`/paypal?id=${data.placeOrder._id}`, { replace: true }); + } else if (paymentMethod.payment === "STRIPE") { + navigate(`/stripe?id=${data.placeOrder._id}`, { replace: true }); + //window.location = `${SERVER_URL}stripe/create-checkout-session?id=${data.placeOrder.orderId}&platform=web`; + } + } + + function calculatePrice(delivery = 0, withDiscount) { + let itemTotal = 0; + cart.forEach((cartItem) => { + itemTotal += cartItem.price * cartItem.quantity; + }); + if (withDiscount && coupon && coupon.discount) { + itemTotal = itemTotal - (coupon.discount / 100) * itemTotal; + } + const deliveryAmount = delivery > 0 ? deliveryCharges : 0; + return (itemTotal + deliveryAmount).toFixed(2); + } + + function calculateTotal() { + let total = 0; + const delivery = isPickUp ? 0 : deliveryCharges; + total += +calculatePrice(delivery, true); + total += +taxCalculation(); + total += +calculateTip(); + return parseFloat(total).toFixed(2); + } + + function transformOrder(cartData) { + return cartData.map((food) => { + return { + food: food._id, + quantity: food.quantity, + variation: food.variation._id, + addons: food.addons + ? food.addons.map(({ _id, options }) => ({ + _id, + options: options.map(({ _id }) => _id), + })) + : [], + specialInstructions: food.specialInstructions, + }; + }); + } + + function checkPaymentMethod(currency) { + if (paymentMethod.payment === "STRIPE") { + return stripeCurrencies.find((val) => val.currency === currency); + } + if (paymentMethod.payment === "PAYPAL") { + return paypalCurrencies.find((val) => val.currency === currency); + } + return true; + } + + async function onPayment() { + if (checkPaymentMethod(configuration.currency)) { + const items = transformOrder(cart); + mutateOrder({ + variables: { + restaurant: cartRestaurant, + orderInput: items, + paymentMethod: paymentMethod.payment, + couponCode: coupon ? coupon.title : null, + tipping: +calculateTip(), + taxationAmount: +taxCalculation(), + address: { + label: location.label, + deliveryAddress: location.deliveryAddress, + details: location.details, + longitude: "" + location.longitude, + latitude: "" + location.latitude, + }, + orderDate: selectedDate, + isPickedUp: isPickUp, + deliveryCharges: isPickUp ? 0 : deliveryCharges, + }, + }); + } else { + showMessage({ + type: "warning", + message: "Payment not supported", + }); + } + } + + function validateOrder() { + if (!data.restaurant.isAvailable || !isOpen()) { + toggleCloseModal(); + return; + } + if (!cart.length) { + showMessage({ + type: "error", + message: "Cart is Empty.", + }); + return false; + } + const delivery = isPickUp ? 0 : deliveryCharges; + if (calculatePrice(delivery, true) < minimumOrder) { + showMessage({ + type: "warning", + message: `The minimum amount of (${configuration.currencySymbol} ${minimumOrder}) for your order has not been reached.`, + }); + return false; + } + if (!location._id) { + showMessage({ + alive: true, + type: "Warning", + message: "Select your address.", + }); + return false; + } + if (!paymentMethod) { + showMessage({ + type: "warning", + message: "Set payment method before checkout", + }); + return false; + } + if (profile.phone.length < 1) { + showMessage({ + alive: true, + type: "Error", + message: "Phone Number is missing", + }); + return false; + } + if (!profile.phoneIsVerified) { + showMessage({ + alive: true, + type: "Error", + message: "Phone Number is not verified", + }); + return false; + } + return true; + } + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + alive={mainError.alive || false} + /> + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + <Container maxWidth="md"> + <Grid container spacing={2}> + <Grid item xs={12} sm={8}> + <OrderOption + selectedDate={selectedDate} + handleDateChange={handleDateChange} + setIsPickUp={setIsPickUp} + /> + {!isPickUp && ( + <DeliveryCard + selectedAddress={selectedAddress} + setSelectedAddress={setDeliveryAddress} + /> + )} + <PersonalCard /> + <PaymentCard + paymentMethod={paymentMethod} + setPaymentMethod={setPaymentMethod} + validateOrder={validateOrder} + onPayment={onPayment} + loading={loadingOrderMutation} + /> + </Grid> + <Grid item xs={12} sm={4}> + <CartItemCard + setSelectedTip={setSelectedTip} + selectedTip={selectedTip} + setTaxValue={setTaxValue} + setCoupon={setCoupon} + restaurantData={restaurantData} + setFlashMessage={showMessage} + calculateTotal={calculateTotal} + calculatePrice={calculatePrice} + taxCalculation={taxCalculation} + calculateTip={calculateTip} + isPickUp={isPickUp} + deliveryCharges={deliveryCharges} + /> + </Grid> + </Grid> + </Container> + </Grid> + <Footer /> + <RestaurantClose + closeMenu={false} + isVisible={isClose} + toggleModal={toggleCloseModal} + restaurant={restaurantData.name} + /> + </Grid> + ); +} + +export default Checkout; diff --git a/enatega-multivendor-web/src/screens/EmailSent/EmailSent.js b/enatega-multivendor-web/src/screens/EmailSent/EmailSent.js new file mode 100644 index 0000000..3d399cb --- /dev/null +++ b/enatega-multivendor-web/src/screens/EmailSent/EmailSent.js @@ -0,0 +1,35 @@ +import { Box, Button, Typography, useTheme } from "@mui/material"; +import React from "react"; +import { Link as RouterLink } from "react-router-dom"; +import EmailIcon from "../../assets/icons/EmailIcon"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; + +function EmailSent() { + const theme = useTheme(); + const classes = useStyles(); + + return ( + <LoginWrapper> + <EmailIcon /> + <Box mt={theme.spacing(1)} /> + <Typography variant="h5" className={classes.font700}> + Check your email + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography variant="caption" className={`${classes.caption} ${classes.fontGrey}`}> + We sent you an email with instructions to reset your password. Don't forget to look in your spam folder. + </Typography> + <Box mt={theme.spacing(4)} /> + <RouterLink to="/login-email" style={{ textDecoration: "none" }}> + <Button variant="contained" color="primary" fullWidth type="email" disableElevation className={classes.btnBase}> + <Typography variant="caption" className={`${classes.caption} ${classes.font700}`}> + back to login + </Typography> + </Button> + </RouterLink> + </LoginWrapper> + ); +} + +export default EmailSent; diff --git a/enatega-multivendor-web/src/screens/EmailSent/styles.js b/enatega-multivendor-web/src/screens/EmailSent/styles.js new file mode 100644 index 0000000..e7aad14 --- /dev/null +++ b/enatega-multivendor-web/src/screens/EmailSent/styles.js @@ -0,0 +1,26 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.text.disabled, + }, + btnBase: { + borderRadius: "0px", + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.main, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main, + }, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Favourites/Favourites.js b/enatega-multivendor-web/src/screens/Favourites/Favourites.js new file mode 100644 index 0000000..66308d5 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Favourites/Favourites.js @@ -0,0 +1,227 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useQuery } from "@apollo/client"; +import { Box, Button, CircularProgress, Grid, Typography } from "@mui/material"; +import clsx from "clsx"; +import gql from "graphql-tag"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { FavouriteRestaurant } from "../../apollo/server"; +import FavouriteIcon from "../../assets/icons/FavouriteIcon"; +import HeartFilled from "../../assets/icons/HeartFilledIcon"; +import Favourite from "../../assets/images/favs.png"; +import FavouritesBg from "../../assets/images/fav-bg.png"; +import FlashMessage from "../../components/FlashMessage"; +import { Header } from "../../components/Header"; +import { ClearCart } from "../../components/Modals"; +import { ProductCard, Subheader } from "../../components/RestaurantComponent"; +import { LocationContext } from "../../context/Location"; +import UserContext from "../../context/User"; +import analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import Footer from "../../components/Footer/Footer"; +import { useTranslation } from 'react-i18next'; + +const RESTAURANTS = gql` + ${FavouriteRestaurant} +`; + +function EmptyView() { + const { t } = useTranslation() + const classes = useStyles(); + return ( + <Grid item xs={12} className={classes.mt2}> + <Box className={classes.mt2} display="flex" justifyContent="center"> + <FavouriteIcon /> + </Box> + <Box className={classes.mt2} display="flex" justifyContent="center"> + <Typography variant="h6" className={classes.textBold}> + {t('titleEmptyFav')} + </Typography> + </Box> + <Box className={classes.mt2} display="flex" justifyContent="center"> + <Typography + variant="caption" + className={clsx(classes.disableText, classes.smallText)} + > + {t('emptyFavDesc')} + </Typography> + </Box> + <Box className={classes.mt2} display="flex" justifyContent="center"> + <Box className={classes.heartBG}> + <HeartFilled /> + </Box> + </Box> + <Box className={classes.mt2} display="flex" justifyContent="center"> + <RouterLink to="/" style={{ textDecoration: "none" }}> + <Button + variant="outlined" + color="primary" + size="large" + disableElevation + disableRipple + disableFocusRipple + disableTouchRipple + className={classes.btnBase} + > + <Typography + variant="caption" + color="primary" + className={clsx(classes.textBold, classes.smallText)} + > + {t('emptyFavBtn')} + </Typography> + </Button> + </RouterLink> + </Box> + </Grid> + ); +} +function Favourites() { + const { t } = useTranslation() + const navigate = useNavigate(); + const firstTime = useRef(true); + const classes = useStyles(); + const [mainError, setMainError] = useState({}); + const [clearModal, setClearModal] = useState(false); + const { location } = useContext(LocationContext); + const [navigateData, setNavigateData] = useState({}); + const { clearCart, restaurant: cartRestaurant } = useContext(UserContext); + const { data, loading, error } = useQuery(RESTAURANTS, { + variables: { + longitude: location?.longitude ?? null, + latitude: location?.latitude ?? null, + }, + fetchPolicy: "network-only", + }); + + const navigateClearCart = useCallback(async () => { + await clearCart(); + navigate(`/restaurant/${navigateData.slug}`, { state: navigateData }); + }, [navigateData]); + const toggleClearCart = useCallback(() => { + setClearModal((prev) => !prev); + }, []); + useEffect(async () => { + await analytics.track(analytics.events.NAVIGATE_TO_FAVOURITES); + }, []); + useEffect(() => { + if (!firstTime.current && error) { + setMainError({ + type: "error", + message: error, + }); + } + if (!firstTime.current) { + firstTime.current = true; + } + }, [error]); + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + const checkCart = useCallback( + (id, name, image, slug) => { + if (cartRestaurant && id !== cartRestaurant) { + setNavigateData({ id, name, image, slug }); + toggleClearCart(); + return false; + } + return true; + }, + [cartRestaurant] + ); + + if (loading) { + return ( + <Grid container> + <Header /> + <Subheader /> + <Box className={classes.spinnerContainer}> + <CircularProgress color="primary" size={48} /> + </Box> + </Grid> + ); + } + if (error) { + return ( + <Grid container> + <Header /> + <Subheader /> + <Box className={classes.spinnerContainer}> + <Typography>Unable to fetch data</Typography> + </Box> + </Grid> + ); + } + + const favouriteData = data?.userFavourite ?? []; + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + /> + <Header /> + <Subheader /> + <Box className={classes.topContainer}> + <Box style={{ zIndex: 100 }}> + <Typography variant="h5" align="center"> + {t('titleFavourite')} + </Typography> + <img src={Favourite} alt="fav" /> + </Box> + <img src={FavouritesBg} alt="fav-bg" className={classes.bg} /> + </Box> + <Grid container item className={classes.mainContainer}> + <Grid item sm={1} /> + <Grid item xs={12} sm={10} className={classes.contentContainer}> + <Grid container spacing={2} className={classes.PV3}> + {favouriteData.length < 1 ? ( + <EmptyView /> + ) : ( + favouriteData.map((item) => ( + <Grid key={item._id} item xs={12} sm={6} md={4}> + <ProductCard + data={item} + grid={true} + showMessage={showMessage} + checkCart={checkCart} + cardImageHeight="144px" + isSmall={false} + /> + </Grid> + )) + )} + </Grid> + </Grid> + <Grid item sm={1} /> + </Grid> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + <ClearCart + isVisible={clearModal} + toggleModal={toggleClearCart} + action={navigateClearCart} + /> + </Grid> + ); +} + +export default Favourites; diff --git a/enatega-multivendor-web/src/screens/Favourites/styles.js b/enatega-multivendor-web/src/screens/Favourites/styles.js new file mode 100644 index 0000000..a7c927c --- /dev/null +++ b/enatega-multivendor-web/src/screens/Favourites/styles.js @@ -0,0 +1,89 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + backgroundColor: theme.palette.primary.dark, + }, + mt2: { + marginTop: theme.spacing(2), + }, + PV3: { + padding: theme.spacing(3, 0), + }, + contentContainer: { + padding: theme.spacing(0, 3), + }, + topContainer: { + marginTop: "165px", + width: "100%", + display: "flex", + justifyContent: "center", + alignItems: "center", + position: "relative", + }, + bg: { + position: "absolute", + left: "-100px", + [theme.breakpoints.down("md")]: { + left: "-50px", + }, + maxWidth: "100%", + }, + mainContainer: { + marginTop: "50px", + minHeight: "100vh", + }, + center: { + justifyContent: "center", + }, + spinnerContainer: { + flexDirection: "row", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + height: "100vh", + }, + title: { + fontWeight: theme.typography.fontWeightLight, + fontSize: "3rem", + color: theme.palette.secondary.light, + }, + textBold: { + fontWeight: theme.typography.fontWeightBold, + }, + disableText: { + color: theme.palette.text.disabled, + }, + smallText: { + fontSize: "0.875rem", + }, + btnBase: { + borderRadius: "0px", + height: "50px", + }, + heartBG: { + display: "flex", + backgroundColor: theme.palette.common.white, + alignItems: "center", + justifyContent: "center", + width: 30, + height: 30, + borderRadius: 15, + boxShadow: theme.shadows[5], + }, + footerContainer: { + background: theme.palette.success.dark, + width: "100%", + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/ForgotPassword/ForgotPassword.js b/enatega-multivendor-web/src/screens/ForgotPassword/ForgotPassword.js new file mode 100644 index 0000000..a05e479 --- /dev/null +++ b/enatega-multivendor-web/src/screens/ForgotPassword/ForgotPassword.js @@ -0,0 +1,154 @@ +import { + Avatar, + Box, + Button, + TextField, + Typography, + useTheme, +} from "@mui/material"; +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { + Link as RouterLink, + useLocation, + useNavigate, +} from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import Analytics from "../../utils/analytics"; +import { isValidEmailAddress } from "../../utils/customFunction"; +import useStyles from "./styles"; +import ForgotPassIcon from "../../assets/images/emailLock.png"; +import { LoginWrapper } from "../Wrapper"; + +function ForgotPassword(props) { + const formRef = useRef(); + const theme = useTheme(); + const classes = useStyles(); + const { state } = useLocation(); + const navigate = useNavigate(); + const [error, setError] = useState(""); + const [emailError, setEmailError] = useState(""); + + const clearErrors = () => { + setEmailError(""); + setError(""); + }; + const handleAction = () => { + clearErrors(); + let validate = true; + const emailValue = formRef.current["userEmail"].value; + if (!isValidEmailAddress(emailValue)) { + setEmailError("Invalid Email"); + validate = false; + return; + } + if (validate) { + navigate("/verify-forgot-otp", { + replace: true, + state: { email: emailValue }, + }); + } else { + setError("Something is missing"); + } + }; + useEffect(() => { + const fetchTrack = async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_FORGOT_PASSWORD); + }; + fetchTrack(); + }, []); + const toggleSnackbar = useCallback(() => { + setError(""); + }, []); + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + handleClose={toggleSnackbar} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={ForgotPassIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <form ref={formRef}> + <Box mt={theme.spacing(2)} /> + <Typography variant="h5" className={classes.font700}> + Forgot your password? + </Typography> + <Box mt={theme.spacing(2)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + Enter your email and we'll send you a link to reset your password + </Typography> + <Box mt={theme.spacing(2)} /> + <TextField + name={"userEmail"} + defaultValue={state?.email ?? ""} + error={Boolean(emailError)} + helperText={emailError} + fullWidth + variant="outlined" + label="Email" + disabled + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + color="primary" + fullWidth + type="email" + disableElevation + className={classes.btnBase} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + Reset password + </Typography> + </Button> + <Box mt={theme.spacing(2)} /> + <RouterLink to="/login-email" style={{ textDecoration: "none" }}> + <Button> + <Typography + variant="caption" + color="primary" + style={{ + textTransform: "none", + }} + className={classes.font700} + > + Back to login + </Typography> + </Button> + </RouterLink> + </form> + </LoginWrapper> + ) +} + +export default ForgotPassword; diff --git a/enatega-multivendor-web/src/screens/ForgotPassword/styles.js b/enatega-multivendor-web/src/screens/ForgotPassword/styles.js new file mode 100644 index 0000000..952a314 --- /dev/null +++ b/enatega-multivendor-web/src/screens/ForgotPassword/styles.js @@ -0,0 +1,70 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey[200], + }, + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + }, + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.text.disabled, + }, + mainContainer: { + display: "flex", + justifyContent: "center", + alignItems: "center", + width: "100%", + height: "100vh", + backgroundColor: theme.palette.grey[50], + }, + loginBox: { + background: theme.palette.common.white, + paddingTop: "40px", + paddingBottom: "40px", + boxShadow: theme.shadows[1], + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.main, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main + }, + width: "70%", + borderRadius: 10, + }, + customBtn: { + background: theme.palette.common.main, + width: "70%", + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.main, + opacity: 0.8, + }, + }, + btnText: { + width: "inherit", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Home/Home.js b/enatega-multivendor-web/src/screens/Home/Home.js new file mode 100644 index 0000000..b005e1f --- /dev/null +++ b/enatega-multivendor-web/src/screens/Home/Home.js @@ -0,0 +1,240 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Grid, + Container, + Box, + useTheme, + useMediaQuery, + Typography, +} from "@mui/material"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import FlashMessage from "../../components/FlashMessage"; +import { LoginHeader } from "../../components/Header"; +import Header from "../../components/Header/Header"; +import { SearchContainer } from "../../components/HomeScreen"; +import UserContext from "../../context/User"; +import { useLocation } from "../../hooks"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import * as Sentry from "@sentry/react"; +import CategoryCards from "../../components/HomeScreen/CategoryCards"; +import WebApp from "../../assets/images/webapp.png"; +import CustApp from "../../assets/images/cust-app.png"; +import RiderApp from "../../assets/images/rider-app.png"; +import RestaurantApp from "../../assets/images/restaurant-app.png"; +import Dashboard from "../../assets/images/dashboard.png"; +import Footer from "../../components/Footer/Footer"; +import Fruits2 from "../../assets/images/fruits-2.png"; +import AppComponent from "../../components/HomeScreen/AppComponent"; +import Banner2 from "../../assets/images/banner-2.png"; +import Banner1 from "../../assets/images/banner-1.png"; +import TawkMessengerReact from "@tawk.to/tawk-messenger-react"; +import { useTranslation } from 'react-i18next'; + +function Home() { + const { t } = useTranslation() + const classes = useStyles(); + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("md")); + const medium = useMediaQuery(theme.breakpoints.down("lg")); + + const { error, loading } = useLocation(); + const [open, setOpen] = useState(!!error); + const { isLoggedIn } = useContext(UserContext); + let check = false; + + const handleClose = useCallback(() => { + setOpen(false); + }, []); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_HOME); + }, []); + useEffect(() => { + if (check) { + setOpen(!!error); + } else { + check = true; + } + }, [error]); + + return ( + <Sentry.ErrorBoundary fallback={<p>An error has occurred</p>}> + <TawkMessengerReact + propertyId="5d0f4f6b36eab9721118c84e" + widgetId="1ftnb355n" + customStyle={{ + color: "red", + }} + /> + <Box className={classes.root}> + <FlashMessage + severity={loading ? "info" : "error"} + alertMessage={error} + open={open} + handleClose={handleClose} + /> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + {/* serch container (1st) */} + <Box> + <Grid container item> + <SearchContainer loading={loading} isHome={true} /> + </Grid> + </Box> + {/* app container (2nd) */} + <Box className={classes.appContainer}> + <Box + className={classes.appWrapper} + style={{ + paddingTop: medium ? "8rem" : 0, + zIndex: 10, + }} + > + <img src={Fruits2} alt="fruits2" className={classes.upperFruits} /> + {!medium && ( + <Box + className={classes.bannerContainer} + display={"flex"} + alignItems={"flex-start"} + > + <img + src={Banner2} + alt="banner2" + className={classes.bannerOne} + /> + <img + src={Banner1} + alt="banner1" + className={classes.bannerTwo} + /> + </Box> + )} + + <AppComponent /> + </Box> + </Box> + {/* card container (3rd) */} + <Box className={classes.cardContainer}> + <Box className={classes.cardWrapper}> + <Typography + className={small ? classes.bgTextSmall : classes.bgText} + style={{ top: "3%", right: "8%" }} + > + FEATURES + </Typography> + <Container className={classes.topBottomMargin}> + <Grid container justify="flex-end" spacing={2}> + <Grid item xs={12} md={6}> + <Box + display="flex" + justifyContent={small ? "flex-end" : "flex-start"} + > + <CategoryCards + title={"Rider App"} + image={RiderApp} + description={[ + "• "+t('findingAddress'), + "• "+t('zonesFunctionality'), + ]} + android={ + "https://play.google.com/store/apps/details?id=com.enatega.multirider" + } + ios={ + "https://apps.apple.com/pk/app/enatega-mulitvendor-rider/id1526674511" + } + isMobile={true} + /> + </Box> + </Grid> + <Grid item xs={12} md={6}> + <Box mt={small ? 15 : 0} /> + <Box + display="flex" + justifyContent={small ? "flex-start" : "flex-end"} + > + <CategoryCards + title={"Restaurant App"} + image={RestaurantApp} + description={[ + "• "+t('multipleRestaurants'), + "• "+t('realTimeOrder'), + ]} + android={ + "https://play.google.com/store/apps/details?id=multivendor.enatega.restaurant" + } + ios={ + "https://apps.apple.com/pk/app/enatega-multivendor-restaurant/id1526672537" + } + isMobile={true} + /> + </Box> + </Grid> + <Box mt={5} /> + <Grid item xs={12}> + <Box mt={small ? 15 : 0} /> + <Box + display="flex" + justifyContent={small ? "flex-end" : "center"} + > + <CategoryCards + title={"Customer App"} + image={CustApp} + description={[ + "• "+t('differentSections'), + "• "+t('previousOrder'), + ]} + android={ + "https://play.google.com/store/apps/details?id=com.enatega.multivendor" + } + ios={ + "https://apps.apple.com/pk/app/enatega-multivendor/id1526488093" + } + isMobile={true} + /> + </Box> + </Grid> + <Grid item xs={12} md={6}> + <Box mt={small ? 15 : 0} /> + + <CategoryCards + title={"Admin Dashboard"} + image={Dashboard} + description={[ + "• "+t('findingAddress'), + "• "+t('zonesFunctionality'), + ]} + web={true} + link={"https://multivendor-admin.enatega.com/"} + isMobile={false} + /> + </Grid> + <Grid item xs={12} md={6}> + <Box mt={small ? 15 : 0} /> + <Box display="flex" justifyContent="flex-end"> + <CategoryCards + title={"Product Page"} + image={WebApp} + description={[ + "• "+t('ourDelivery'), + "• "+t('builtOnCommunity'), + ]} + web={true} + link={"https://enatega.com/"} + isMobile={false} + /> + </Box> + </Grid> + </Grid> + </Container> + </Box> + </Box> + + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </Box> + </Sentry.ErrorBoundary> + ); +} +export default Home; diff --git a/enatega-multivendor-web/src/screens/Home/styles.js b/enatega-multivendor-web/src/screens/Home/styles.js new file mode 100644 index 0000000..6c7a170 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Home/styles.js @@ -0,0 +1,250 @@ +import makeStyles from "@mui/styles/makeStyles"; +import Web from "../../assets/images/web.png"; +import Blog from "../../assets/images/blog-bg.png"; +import Contact from "../../assets/images/contact-pg.png"; +import Categories from "../../assets/images/categories-bg.png"; +import Price from "../../assets/images/price-bg.png"; + +const useStyles = makeStyles((theme) => ({ + root: { + "& .MuiInputBase-root": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "&:hover fieldset": { + borderColor: theme.palette.common.black, + }, + }, + overflowX: "hidden", + }, + cardContainer: { + background: + "linear-gradient(180deg, theme.palette.common.whiteShade 0%, theme.palette.common.white 100%)", + borderRadius: "0px", + // padding: "40px", + }, + RightWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + minHeight: "90vh", + display: "flex", + marginLeft: "auto", + // padding: "10rem 0rem 10rem 0rem", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, + cardWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + minHeight: "90vh", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + backgroundImage: `url(${Categories})`, + backgroundSize: "cover", + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + position: "relative", + }, + blogWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + minHeight: "90vh", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + backgroundImage: `url(${Blog})`, + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + backgroundSize: "cover", + position: "relative", + + [theme.breakpoints.down("md")]: { + backgroundImage: "none", + }, + }, + appContainer: { + backgroundColor: theme.palette.common.white, + borderRadius: "0px", + width: "100%", + height: "auto", + }, + contactContainer: { + background: + "linear-gradient(180deg, theme.palette.secondary.lightest 0%, theme.palette.primary.main 100%)", + borderRadius: "0px", + width: "100%", + [theme.breakpoints.down("md")]: { + background: theme.palette.primary.main, + }, + }, + leftWrapper: { + background: + "linear-gradient(180deg, theme.palette.common.whiteShade 0%, theme.palette.common.white 100%)", + width: "80%", + minHeight: "80vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + position: "relative", + }, + appWrapper: { + background: + "linear-gradient(180deg, theme.palette.common.white 0%, theme.palette.common.whiteShade 100%)", + width: "80%", + minHeight: "110vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + position: "relative", + display: "flex", + alignItems: "flex-end", + justifyContent: "center", + [theme.breakpoints.down("md")]: { + width: "90%", + }, + }, + priceContainer: { + backgroundColor: theme.palette.primary.main, + borderRadius: "0px", + width: "100%", + clear: "both", + }, + priceWrapper: { + background: "white", + width: "90%", + minHeight: "90vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + display: "flex", + alignItems: "center", + position: "relative", + backgroundImage: `url(${Price})`, + backgroundSize: "cover", + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + }, + bgText: { + position: "absolute", + bottom: 100, + right: 200, + fontSize: 80, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, + bgTextSmall: { + position: "absolute", + bottom: 10, + right: 10, + fontSize: 50, + fontWeight: 500, + color: theme.palette.common.black, + mixBlendMode: "normal", + opacity: 0.24, + }, + caseContainer: { + backgroundColor: theme.palette.primary.main, + borderRadius: "0px", + width: "100%", + clear: "both", + }, + caseWrapper: { + background: + "linear-gradient(180.27deg, theme.palette.info.lightest 0.09%, theme.palette.info.light 36.76%, theme.palette.success.darkest 72.67%, theme.palette.success.lightest 99.63%)", + width: "90%", + minHeight: "95vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + display: "flex", + position: "relative", + justifyContent: "center", + alignItems: "center", + }, + techContainer: { + background: + "linear-gradient(180.62deg, theme.palette.info.darkest 0.54%, theme.palette.info.dark 100.36%)", + }, + techWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + minHeight: "90vh", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + backgroundImage: `url(${Web})`, + backgroundSize: "cover", + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + }, + blogContainer: { + background: + "linear-gradient(180deg, theme.palette.shades.main 0%, theme.palette.error.light 100%)", + }, + contactWrapper: { + background: + "linear-gradient(180deg, theme.palette.shades.light 0%, theme.palette.common.white 100%)", + width: "95%", + minHeight: "80vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + display: "flex", + backgroundImage: `url(${Contact})`, + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + backgroundSize: "cover", + }, + footerContainer: { + background: "white", + width: "100%", + marginTop: "60px", + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, + searchWrapper: { + width: "100%", + marginTop: -28, + }, + upperFruits: { + position: "absolute", + left: 0, + top: 0, + height: "100%", + }, + bannerContainer: { + position: "absolute", + left: "52%", + top: "5%", + zIndex: 1000, + [theme.breakpoints.down("md")]: { + position: "relative", + }, + }, + bannerTwo: { + maxWidth: "40vw", + width: "40%", + height: "40%", + marginTop: "15%", + }, + bannerOne: { + width: "40%", + height: "40%", + maxWidth: "60vw", + marginTop: "30%", + }, + topBottomMargin: { + marginTop: "10rem", + marginBottom: "10rem", + }, + lowerFruits: { position: "absolute", left: 0, top: 0, height: "100%" }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Login/Login.js b/enatega-multivendor-web/src/screens/Login/Login.js new file mode 100644 index 0000000..4ca08aa --- /dev/null +++ b/enatega-multivendor-web/src/screens/Login/Login.js @@ -0,0 +1,211 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useTheme } from "@mui/material/styles"; +import Typography from "@mui/material/Typography"; +import React, { useCallback, useEffect, useState } from "react"; +import GoogleLogin from "react-google-login"; +import ConfigurableValues from "../../config/constants"; +import { Link as RouterLink } from "react-router-dom"; +import { useLocation } from "react-router"; +import GoogleIcon from "../../assets/icons/GoogleIcon"; +import FlashMessage from "../../components/FlashMessage"; +import useRegistration from "../../hooks/useRegistration"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +function Login() { + + const { GOOGLE_CLIENT_ID } = ConfigurableValues(); + + const { t } = useTranslation(); + + const theme = useTheme(); + const [mainError, setMainError] = useState({}); + const classes = useStyles(); + const { + goolgeSuccess, + authenticationFailure, + loading, + setLoading, + loginButton, + loginButtonSetter, + loginError, + } = useRegistration(); + + const location = useLocation(); + + useEffect(() => { + if (loginError) { + showMessage({ + type: "error", + message: loginError, + }); + } + }, [loginError]); + + const callGoogle = useCallback( + (clickAction) => { + if (!loading) { + loginButtonSetter("GOOGLE"); + setLoading(true); + clickAction(); + } + }, + [loading] + ); + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + /> + <Typography variant="h5" className={classes.font700}> + {t('welcome')} + </Typography> + + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontSubHead} ${classes.font700} `} + > + {t('signUpOrLogin')} + </Typography> + <GoogleLogin + clientId={GOOGLE_CLIENT_ID} + render={(renderProps) => ( + <Button + variant="contained" + fullWidth + disableElevation + className={`${classes.gButton} ${classes.btnBase}`} + onClick={() => callGoogle(renderProps.onClick)} + disabled={renderProps.disabled || loading} + startIcon={ + renderProps.disabled || loading ? ( + <CircularProgress color="secondary" size={24} /> + ) : ( + <GoogleIcon /> + ) + } + > + {loading && loginButton === "GOOGLE" ? null : ( + <Typography + variant="caption" + color="textPrimary" + align="center" + className={`${classes.font700} ${classes.caption} ${classes.btnText}`} + > + {t('signInWithGoogle')} + </Typography> + )} + </Button> + )} + onSuccess={goolgeSuccess} + onFailure={authenticationFailure} + cookiePolicy={"single_host_origin"} + /> + + <Box + sx={{ + display: "flex", + justifyContent: "center", + alignItems: "center", + }} + > + <div + style={{ + width: "80%", + display: "flex", + alignSelf: "center", + justifyContent: "space-around", + alignItems: "center", + margin: theme.spacing(2, 0), + }} + > + <div className={classes.line}></div> + <Typography + variant="caption" + className={`${classes.fontGrey} ${classes.caption} ${classes.font700} `} + > + {t('or')} + </Typography> + <div className={classes.line}></div> + </div> + </Box> + <RouterLink + to="/new-login" + state={{ from: location.state?.from }} + style={{ textDecoration: "none" }} + > + <Button + variant="contained" + color="primary" + fullWidth + disableElevation + disableRipple + disableFocusRipple + disableTouchRipple + className={`${classes.btnBase} ${classes.customBtn}`} + > + <Typography + variant="caption" + color="secondary" + className={`${classes.font700} ${classes.caption}`} + > + {t('continueWithEmail')} + </Typography> + </Button> + </RouterLink> + <Box + display="flex" + sx={{ justifyContent: "center", alignItems: "center" }} + flexWrap="wrap" + mt={theme.spacing(3)} + > + <Typography + style={{ + width: "80%", + }} + variant="caption" + className={`${classes.fontGrey} ${classes.caption} `} + > + {t('bySigningUp')} + <RouterLink to="/terms" style={{ textDecoration: "none" }}> + <Typography + variant="caption" + color="primary" + className={`${classes.font700} ${classes.caption}`} + > + {t('terms')} + </Typography> + </RouterLink> + {t('and')} + <RouterLink to="/privacy" style={{ textDecoration: "none" }}> + <Typography + variant="caption" + color="primary" + className={`${classes.font700} ${classes.caption}`} + > + {t('privacyPolicy')} + </Typography> + </RouterLink> + </Typography> + </Box> + </LoginWrapper> + ); +} + +export default Login; diff --git a/enatega-multivendor-web/src/screens/Login/styles.js b/enatega-multivendor-web/src/screens/Login/styles.js new file mode 100644 index 0000000..a8c371d --- /dev/null +++ b/enatega-multivendor-web/src/screens/Login/styles.js @@ -0,0 +1,62 @@ +import makeStyles from "@mui/styles/makeStyles"; +//import ConfigurableValues from "../../config/constants"; + +// const { COLORS } = ConfigurableValues(); +const COLORS = "#dd4b39"; +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.common.black, + }, + fontSubHead: { + color: theme.palette.primary.main, + }, + btnBase: { + height: "50px", + width: "80%", + borderRadius: 5, + boxShadow: theme.shadows[2], + }, + appleBtn: { + background: "#2C2C2C", + marginTop: "20px", + }, + customBtn: { + background: theme.palette.common.black, + width: "70%", + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.black, + opacity: 0.8, + }, + }, + gButton: { + marginTop: theme.spacing(3), + background: COLORS.GOOGLE, + transition: "opacity 0.3s", + "&:disabled": { + backgroundColor: COLORS.GOOGLE, + }, + "&:hover": { + opacity: 0.8, + backgroundColor: COLORS.GOOGLE, + }, + }, + btnText: { + width: "inherit", + }, + line: { + width: "100%", + height: 1, + backgroundColor: theme.palette.common.black, + margin: 10, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/LoginEmail/LoginEmail.js b/enatega-multivendor-web/src/screens/LoginEmail/LoginEmail.js new file mode 100644 index 0000000..36da713 --- /dev/null +++ b/enatega-multivendor-web/src/screens/LoginEmail/LoginEmail.js @@ -0,0 +1,217 @@ +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import IconButton from "@mui/material/IconButton"; +import InputAdornment from "@mui/material/InputAdornment"; +import { useTheme } from "@mui/material/styles"; +import TextField from "@mui/material/TextField"; +import Typography from "@mui/material/Typography"; +import { Visibility, VisibilityOff } from "@mui/icons-material"; +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { Link as RouterLink, useLocation } from "react-router-dom"; +import LoginEmailIcon from "../../assets/images/emailLock.png"; +import FlashMessage from "../../components/FlashMessage"; +import useRegistration from "../../hooks/useRegistration"; +import { isValidEmailAddress } from "../../utils/customFunction"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import { Avatar } from "@mui/material"; + +function LoginEmail() { + const formRef = useRef(); + const theme = useTheme(); + const classes = useStyles(); + const { state } = useLocation(); + const [mainError, setMainError] = useState({}); + const [passError, setPassError] = useState(""); + const [emailError, setEmailError] = useState(""); + const [showPassword, setShowPassword] = useState(false); + const { loading, loginError, setLoading, setLoginError, mutateLogin } = + useRegistration(); + + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; + const handleMouseDownPassword = (event) => { + event.preventDefault(); + }; + + useEffect(() => { + if (loginError) { + setMainError({ + type: "error", + message: loginError, + }); + } + }, [loginError]); + + const clearErrors = () => { + setEmailError(""); + setPassError(""); + setLoginError(""); + }; + const handleAction = () => { + clearErrors(); + let validate = true; + const emailValue = formRef.current["userEmail"].value; + const passValue = formRef.current["userPass"].value; + if (!isValidEmailAddress(emailValue)) { + setEmailError("Invalid Email"); + validate = false; + return; + } + if (!passValue) { + setPassError("Password required"); + validate = false; + return; + } + if (validate) { + setLoading(true); + const user = { + email: emailValue, + password: passValue, + type: "default", + }; + mutateLogin(user); + } else { + setLoginError("Something is missing"); + } + }; + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + /> + <form ref={formRef}> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={LoginEmailIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Box mt={theme.spacing(2)} /> + <Typography variant="h5" className={classes.font700}> + Sign in with your email + </Typography> + <Typography + variant="caption" + className={`${classes.grayText} ${classes.caption}`} + > + Type your password + </Typography> + <Box mt={theme.spacing(2)} /> + <TextField + name={"userEmail"} + defaultValue={state?.email ?? "demo-customer@enatega.com"} + error={Boolean(emailError)} + helperText={emailError} + fullWidth + variant="outlined" + label="Email" + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + <Box mt={theme.spacing(2)} /> + <TextField + name={"userPass"} + defaultValue={"DemoCustomer55!"} + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + InputProps={{ + endAdornment: ( + <InputAdornment position="end"> + <IconButton + aria-label="toggle password visibility" + onClick={handleClickShowPassword} + onMouseDown={handleMouseDownPassword} + edge="end" + size="large" + > + {showPassword ? ( + <Visibility color="primary" /> + ) : ( + <VisibilityOff color="primary" /> + )} + </IconButton> + </InputAdornment> + ), + }} + error={Boolean(passError)} + helperText={passError} + fullWidth + variant="outlined" + label="Password" + type={showPassword ? "text" : "password"} + /> + <RouterLink to="/forgot-password" state={{email: state?.email}} + style={{ textDecoration: "none", display: "flex" }} + > + <Button> + <Typography + variant="caption" + style={{ + textTransform: "none", + display: "flex", + marginBottom: theme.spacing(3), + }} + className={classes.font700} + > + Forgot your password? + </Typography> + </Button> + </RouterLink> + <Box mt={theme.spacing(2)} /> + <Button + variant="contained" + color="primary" + fullWidth + type="email" + disableElevation + disabled={loading} + className={`${classes.btnBase} ${classes.customBtn}`} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + CONTINUE + </Typography> + )} + </Button> + <Box mt={theme.spacing(2)} /> + </form> + </LoginWrapper> + ); +} + +export default LoginEmail; diff --git a/enatega-multivendor-web/src/screens/LoginEmail/styles.js b/enatega-multivendor-web/src/screens/LoginEmail/styles.js new file mode 100644 index 0000000..f683b4b --- /dev/null +++ b/enatega-multivendor-web/src/screens/LoginEmail/styles.js @@ -0,0 +1,40 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.text.disabled, + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.main, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main + }, + width: "70%", + borderRadius: 10, + }, + customBtn: { + background: theme.palette.common.main, + width: "70%", + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.main, + opacity: 0.8, + }, + }, + grayText: { + color: theme.palette.grey[600], + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/MyOrders/MyOrders.js b/enatega-multivendor-web/src/screens/MyOrders/MyOrders.js new file mode 100644 index 0000000..d761ede --- /dev/null +++ b/enatega-multivendor-web/src/screens/MyOrders/MyOrders.js @@ -0,0 +1,144 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Container, + Grid, + LinearProgress, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import clsx from "clsx"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { ActiveOrderCard, PastOrderCard } from "../../components/Orders"; +import OrderTabs from "../../components/Orders/Tabs/Tabs"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import { ACTIVE_STATUS, INACTIVE_STATUS } from "../../utils/constantValues"; +import useStyles from "./styles"; +import FavouritesBg from "../../assets/images/fav-bg.png"; + +function MyOrders() { + const firstTime = useRef(true); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(); + const [error, setError] = useState({}); + const [tab, setTab] = useState(0); + + const { orders, loadingOrders, errorOrders, fetchOrders } = + useContext(UserContext); + const activeOrders = orders.filter((o) => + ACTIVE_STATUS.includes(o.orderStatus) + ); + const pastOrders = orders.filter((o) => + INACTIVE_STATUS.includes(o.orderStatus) + ); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_ORDER); + }, []); + useEffect(() => { + if (!firstTime.current && (errorOrders || fetchOrders) && !loadingOrders) { + setError({ + type: "error", + message: errorOrders || fetchOrders, + }); + } + if (!firstTime.current) { + firstTime.current = true; + } + }, [errorOrders, fetchOrders, loadingOrders]); + + const toggleSnackbar = useCallback(() => { + setError({}); + }, []); + + if (loadingOrders) { + return ( + <Grid container className={classes.root}> + <Header /> + <div + style={{ width: "100%" }} + className={clsx(classes.loadingContainer, classes.center)} + > + <LinearProgress size={extraSmall ? 48 : undefined} color="primary" /> + </div> + </Grid> + ); + } + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(error.type)} + severity={error.type} + alertMessage={error.message} + handleClose={toggleSnackbar} + /> + <Header /> + <Box className={classes.topContainer}> + <img src={FavouritesBg} alt="fav-bg" className={classes.bg} /> + </Box> + <Container className={classes.mainContainer} maxWidth="md"> + <OrderTabs tab={tab} setTab={setTab} /> + {tab === 0 ? ( + <Grid container className={classes.center}> + <Grid container item justifyContent="center"> + <Grid item xs={12} sm={10} className={classes.contentContainer}> + {activeOrders.length > 0 ? ( + activeOrders.map((item) => ( + <ActiveOrderCard key={item._id} {...item} /> + )) + ) : ( + <Typography + variant="body1" + color="textSecondary" + align="center" + > + You have no active orders. + </Typography> + )} + </Grid> + </Grid> + </Grid> + ) : ( + <Grid container className={classes.center}> + <Grid container item justifyContent="center"> + <Grid item xs={12} sm={10} className={classes.contentContainer}> + {pastOrders.length > 0 ? ( + pastOrders.map((item) => ( + <PastOrderCard key={item._id} item={item} /> + )) + ) : ( + <Typography + variant="body1" + color="textSecondary" + align="center" + > + You have no past orders. + </Typography> + )} + </Grid> + </Grid> + </Grid> + )} + </Container> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </Grid> + ); +} + +export default MyOrders; diff --git a/enatega-multivendor-web/src/screens/MyOrders/styles.js b/enatega-multivendor-web/src/screens/MyOrders/styles.js new file mode 100644 index 0000000..6732904 --- /dev/null +++ b/enatega-multivendor-web/src/screens/MyOrders/styles.js @@ -0,0 +1,74 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + backgroundColor: theme.palette.primary.dark, + }, + contentContainer: { + padding: theme.spacing(0, 3), + }, + loadingContainer: { + marginTop: "64px", + }, + mainContainer: { + marginTop: "200px", + marginBottom: "200px", + position: "relative", + backgroundColor: theme.palette.common.white, + boxShadow: "0px 0px 22px rgba(0, 0, 0, 0.1)", + borderRadius: "20px", + }, + center: { + justifyContent: "center", + marginTop: 100, + marginBottom: 100, + }, + topContainer: { + position: "relative", + width: "100%", + }, + bg: { + position: "absolute", + left: "-100px", + [theme.breakpoints.down("md")]: { + left: "-50px", + }, + maxWidth: "100%", + marginTop: "60px", + }, + textBold: { + fontWeight: 700, + }, + line: { + margin: theme.spacing(2, 0), + }, + titleStyle: { + ...theme.typography.h5, + fontWeight: 700, + color: theme.palette.text.secondary, + }, + restuarantTitle: { + ...theme.typography.body2, + fontWeight: 700, + color: theme.palette.text.secondary, + }, + smallText: { + ...theme.typography.caption, + color: theme.palette.text.disabled, + fontSize: "0.875rem", + }, + footerContainer: { + background: theme.palette.primary.dark, + width: "100%", + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/MyOrders/temp.js b/enatega-multivendor-web/src/screens/MyOrders/temp.js new file mode 100644 index 0000000..32d2863 --- /dev/null +++ b/enatega-multivendor-web/src/screens/MyOrders/temp.js @@ -0,0 +1,168 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Divider, + Grid, + LinearProgress, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import clsx from "clsx"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { ActiveOrderCard, PastOrderCard } from "../../components/Orders"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import { ACTIVE_STATUS, INACTIVE_STATUS } from "../../utils/constantValues"; +import useStyles from "./styles"; + +function MyOrders() { + const firstTime = useRef(true); + const theme = useTheme(); + const extraSmall = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(); + const [error, setError] = useState({}); + const { orders, loadingOrders, errorOrders, fetchOrders } = + useContext(UserContext); + const activeOrders = orders.filter((o) => + ACTIVE_STATUS.includes(o.orderStatus) + ); + const pastOrders = orders.filter((o) => + INACTIVE_STATUS.includes(o.orderStatus) + ); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_ORDER); + }, []); + useEffect(() => { + if (!firstTime.current && (errorOrders || fetchOrders) && !loadingOrders) { + setError({ + type: "error", + message: errorOrders || fetchOrders, + }); + } + if (!firstTime.current) { + firstTime.current = true; + } + }, [errorOrders, fetchOrders, loadingOrders]); + + const toggleSnackbar = useCallback(() => { + setError({}); + }, []); + + if (loadingOrders) { + return ( + <Grid container className={classes.root}> + <Header /> + <div + style={{ width: "100%" }} + className={clsx(classes.loadingContainer, classes.center)} + > + <LinearProgress size={extraSmall ? 48 : undefined} color="primary" /> + </div> + </Grid> + ); + } + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(error.type)} + severity={error.type} + alertMessage={error.message} + handleClose={toggleSnackbar} + /> + <Header /> + <Grid container item className={classes.mainContainer}> + <Grid container className={classes.center}> + <Grid container item className={classes.center}> + <Grid item xs={12}> + <Typography + variant="h5" + align="center" + color="textSecondary" + className={classes.textBold} + > + Active orders + </Typography> + </Grid> + <Grid + item + xs={12} + sm={10} + md={8} + lg={6} + className={classes.contentContainer} + > + <Divider + light + orientation="horizontal" + className={classes.line} + /> + {activeOrders.length > 0 ? ( + activeOrders.map((item) => ( + <ActiveOrderCard key={item._id} {...item} /> + )) + ) : ( + <Typography variant="body1" color="textSecondary"> + You have no active orders. + </Typography> + )} + <Divider + light + orientation="horizontal" + className={classes.line} + /> + </Grid> + </Grid> + </Grid> + <Grid container item className={classes.center}> + <Grid item xs={12}> + <Typography + variant="h5" + align="center" + color="textSecondary" + className={classes.textBold} + > + Past orders + </Typography> + </Grid> + <Grid + item + xs={12} + sm={10} + md={8} + lg={6} + className={classes.contentContainer} + > + <Divider light orientation="horizontal" className={classes.line} /> + {pastOrders.length > 0 ? ( + pastOrders.map((item) => ( + <PastOrderCard key={item._id} item={item} /> + )) + ) : ( + <Typography variant="body1" color="textSecondary"> + You have no past orders. + </Typography> + )} + </Grid> + </Grid> + </Grid> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </Grid> + ); +} + +export default MyOrders; diff --git a/enatega-multivendor-web/src/screens/NewLogin/NewLogin.js b/enatega-multivendor-web/src/screens/NewLogin/NewLogin.js new file mode 100644 index 0000000..f6b4591 --- /dev/null +++ b/enatega-multivendor-web/src/screens/NewLogin/NewLogin.js @@ -0,0 +1,156 @@ +import { gql, useMutation } from "@apollo/client"; +import { Avatar } from "@mui/material"; +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useTheme } from "@mui/material/styles"; +import TextField from "@mui/material/TextField"; +import Typography from "@mui/material/Typography"; +import React, { useCallback, useRef, useState } from "react"; +import { useNavigate, useLocation } from "react-router-dom"; +import { emailExist } from "../../apollo/server"; +import EmailImage from "../../assets/images/email.png"; +import FlashMessage from "../../components/FlashMessage"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import { useTranslation } from 'react-i18next'; + +function isValidEmailAddress(address) { + return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(address); +} + +const EMAIL = gql` + ${emailExist} +`; + +function NewLogin() { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const [error, setError] = useState(""); + const formRef = useRef(null); + const navigate = useNavigate(); + const location = useLocation(); + const [EmailEixst, { loading }] = useMutation(EMAIL, { + onCompleted, + onError, + }); + + function onCompleted({ emailExist }) { + if (emailExist?._id !== null) { + navigate("/login-email", { + replace: true, + state: { + email: formRef.current["email"].value, + from: location.state?.from, + }, + }); + } else { + navigate("/registration", { + replace: true, + state: { + email: formRef.current["email"].value, + from: location.state?.from, + }, + }); + } + } + function onError({ error }) { + setError("Something went wrong"); + } + + const handleAction = () => { + const emailValue = formRef.current["email"].value; + if (isValidEmailAddress(emailValue)) { + setError(""); + EmailEixst({ variables: { email: emailValue } }); + } else { + setError("Invalid Email"); + } + }; + + const toggleSnackbar = useCallback(() => { + setError(""); + }, []); + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + handleClose={toggleSnackbar} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={EmailImage} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Box mt={theme.spacing(1)} /> + <Typography variant="h5" className={classes.font700}> + {t('whatsYourEmail')} + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + {t('checkAccount')} + </Typography> + <Box mt={theme.spacing(4)} /> + <form ref={formRef}> + <TextField + name={"email"} + error={Boolean(error)} + helperText={error} + variant="outlined" + defaultValue={"demo-customer@enatega.com"} + label="Email" + type={"email"} + fullWidth + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + fullWidth + type="email" + disableElevation + disabled={loading} + className={`${classes.btnBase} ${classes.customBtn}`} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + {t('continue')} + </Typography> + )} + </Button> + </form> + </LoginWrapper> + ); +} + +export default NewLogin; diff --git a/enatega-multivendor-web/src/screens/NewLogin/styles.js b/enatega-multivendor-web/src/screens/NewLogin/styles.js new file mode 100644 index 0000000..791e766 --- /dev/null +++ b/enatega-multivendor-web/src/screens/NewLogin/styles.js @@ -0,0 +1,40 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.text.disabled, + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.main, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main + }, + width: "70%", + borderRadius: 10, + }, + customBtn: { + background: theme.palette.common.main, + width: "70%", + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.main, + opacity: 0.8, + }, + }, + textField: { + boxShadow: theme.shadows[5], + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/OrderDetail/Background.js b/enatega-multivendor-web/src/screens/OrderDetail/Background.js new file mode 100644 index 0000000..00fa7aa --- /dev/null +++ b/enatega-multivendor-web/src/screens/OrderDetail/Background.js @@ -0,0 +1,20 @@ +import { Paper } from "@mui/material"; +import React from "react"; +import makeStyles from "@mui/styles/makeStyles"; +import Image from "../../assets/images/food-plate.png"; + +const useStyles = makeStyles((theme) => ({ + paperContainer: { + background: `url(${Image})`, + width: "100%", + backgroundSize: "cover", + backgroundPosition: "center", + backgroundRepeat: "no-repeat", + backgroundAttachment: "fixed", + }, +})); +export default function Background({ children }) { + const classes = useStyles(); + + return <Paper className={classes.paperContainer}>{children}</Paper>; +} diff --git a/enatega-multivendor-web/src/screens/OrderDetail/OrderDetail.js b/enatega-multivendor-web/src/screens/OrderDetail/OrderDetail.js new file mode 100644 index 0000000..df8e79a --- /dev/null +++ b/enatega-multivendor-web/src/screens/OrderDetail/OrderDetail.js @@ -0,0 +1,339 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + CircularProgress, + Container, + Grid, + Typography, + useTheme, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useNavigate, useParams, useLocation } from "react-router-dom"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { + DetailCard, + StatusCard, + AmountCard, + ModalView, +} from "../../components/Orders"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import { ORDER_STATUS } from "../../utils/constantValues"; +import Background from "./Background"; +import useStyles from "./styles"; +import { mapStyles } from "./mapStyles"; +import { useLocationContext } from "../../context/Location"; +import Promotion from "../../components/Promotion/Promotion"; +import { Chat } from "../../components/Chat"; +import RestMarker from "../../assets/images/rest-map-2.png"; +import DestMarker from "../../assets/images/dest-map-2.png"; +import MarkerImage from "../../assets/images/marker.png"; +import TrackingRider from "../../components/Orders/OrderDetail/TrackingRider"; +import { useSubscription } from "@apollo/client"; +import { subscriptionOrder } from "../../apollo/server"; +import gql from "graphql-tag"; +import Modal from "react-modal"; +import { reviewOrder } from "../../apollo/server"; +import { useMutation } from "@apollo/client"; +import FlashMessage from "../../components/FlashMessage"; +import ThreeDots from "../../components/ThreeDots/ThreeDots"; +import StarRatings from "react-star-ratings"; + +const REVIEWORDER = gql` + ${reviewOrder} +`; + +function useQuery() { + return new URLSearchParams(useLocation().search); +} + +function OrderDetail() { + const theme = useTheme(); + const small = useMediaQuery(theme.breakpoints.down("sm")); + const classes = useStyles(); + let { id } = useParams(); + const navigate = useNavigate(); + let destCoordinates = null; + let restCoordinates = {}; + const queryParams = useQuery(); + const [toggleChat, setToggleChat] = useState(false); + const { location } = useLocationContext(); + const [isOpen, setIsOpen] = useState(false); + const [rating, setRating] = useState(0); + const [description, setDescription] = useState(""); + const mobile = useMediaQuery(theme.breakpoints.down("md")); + const [mutate, { loading: loadingMutation }] = useMutation(REVIEWORDER, { + onError, + onCompleted, + }); + + useEffect(() => { + async function Track() { + await Analytics.track(Analytics.events.NAVIGATE_TO_RATEANDREVIEW); + } + Track(); + }, []); + + function onFinishRating(rating) { + setRating(rating); + } + + function onChangeText(description) { + setDescription(description); + } + + function onSubmit() { + mutate({ + variables: { + order: id, + rating: rating, + description: description, + }, + }); + } + + function onCompleted(data) { + closeModal(); + } + + function onError(error) { + FlashMessage({ + message: error.networkError.result.errors[0].message, + }); + } + + const openModal = () => { + setIsOpen(true); + }; + + const closeModal = () => { + setIsOpen(false); + }; + + useSubscription( + gql` + ${subscriptionOrder} + `, + { variables: { id } } + ); + + const onLoad = useCallback( + (map) => { + const bounds = new window.google.maps.LatLngBounds(); + bounds.extend(restCoordinates); + bounds.extend(destCoordinates); + map.fitBounds(bounds); + map.panToBounds(bounds); + }, + [restCoordinates, destCoordinates] + ); + + const { loadingOrders, errorOrders, orders, clearCart } = + useContext(UserContext); + + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_ORDER_DETAIL, { + orderId: id, + }); + }, []); + useEffect(() => { + if (!id) { + navigate("/orders"); + } + if (queryParams.get("clearCart")) { + clearCart(); + } + }, [id]); + + if (errorOrders) { + return ( + <Grid container className={classes.spinnerContainer}> + <Header /> + <Typography>{errorOrders.message}</Typography> + </Grid> + ); + } + const order = orders.find((o) => o._id === id); + if (loadingOrders || !order) { + return ( + <Grid container className={classes.spinnerContainer}> + <Header /> + <CircularProgress color="primary" size={48} /> + </Grid> + ); + } + restCoordinates = { + lat: parseFloat(order.restaurant.location.coordinates[1]), + lng: parseFloat(order.restaurant.location.coordinates[0]), + }; + if (!ORDER_STATUS.includes(order.orderStatus)) { + restCoordinates = { + lat: parseFloat(order.restaurant.location.coordinates[1]), + lng: parseFloat(order.restaurant.location.coordinates[0]), + }; + destCoordinates = { + lat: parseFloat(order.deliveryAddress.location.coordinates[1]), + lng: parseFloat(order.deliveryAddress.location.coordinates[0]), + }; + } + return ( + <> + <Background> + <Grid container> + <Header /> + {loadingOrders || !order ? ( + <CircularProgress color="primary" size={48} /> + ) : errorOrders ? ( + <Typography>Unable to load data </Typography> + ) : order?.orderStatus !== "CANCELLED" ? ( + <Grid container item> + {!["CANCELLED"].includes(order.orderStatus) && ( + <Grid item xs={12} className={classes.topContainer}> + <GoogleMap + mapContainerStyle={{ + height: small ? "450px" : "500px", + width: "100%", + }} + zoom={14} + center={restCoordinates} + onLoad={destCoordinates && onLoad} + options={{ + styles: mapStyles, + zoomControl: true, + zoomControlOptions: { + position: window.google.maps.ControlPosition.RIGHT_TOP, + }, + }} + > + {location && ( + <Marker + position={{ + lat: location?.latitude, + lng: location?.longitude, + }} + icon={MarkerImage} + /> + )} + <Marker position={restCoordinates} icon={RestMarker} /> + <Marker position={destCoordinates} icon={DestMarker} /> + {order.rider && <TrackingRider id={order.rider._id} />} + </GoogleMap> + + <Container + disableGutters + maxWidth={small ? "100%" : "md"} + className={classes.orderStatus} + > + <StatusCard {...order} /> + </Container> + </Grid> + )} + {order?.rider && ( + <Box + className={classes.chat} + onClick={() => { + setToggleChat(true); + }} + > + <Typography + variant="body2" + color="common" + className={(classes.textBold, classes.smallText)} + > + Chat with rider + </Typography> + </Box> + )} + {order.orderStatus === "DELIVERED" && !order.review && ( + <Box + className={classes.review} + onClick={() => { + openModal(); + }} + > + <Typography + variant="body2" + color="common" + className={(classes.textBold, classes.smallText)} + > + Review your order + </Typography> + </Box> + )} + {toggleChat && ( + <Chat setToggleChat={setToggleChat} id={order?._id} /> + )} + + <Grid container style={{ marginTop: theme.spacing(20) }}> + <DetailCard {...order} /> + </Grid> + <Grid + container + style={{ + marginTop: theme.spacing(8), + marginBottom: theme.spacing(8), + }} + > + <AmountCard {...order} /> + </Grid> + </Grid> + ) : ( + <ModalView /> + )} + </Grid> + </Background> + <Promotion /> + <Footer /> + + <Modal isOpen={isOpen} onRequestClose={closeModal}> + <CloseIcon className={classes.closeButton} onClick={closeModal} /> + <div className={classes.modalContainer}> + <div className={classes.title}> + <h2>Write a Review</h2> + </div> + <div className={classes.starContainer}> + <div className={classes.starWrapper}> + <StarRatings + maxStars={5} + rating={rating} + changeRating={onFinishRating} + starDimension={mobile ? "20px" : "50px"} + starRatedColor={theme.palette.primary.main} + /> + </div> + </div> + <div className={classes.inputContainer}> + <input + className={classes.input} + placeholderTextColor={theme.palette.secondary.dark} + onChange={(e) => onChangeText(e.target.value)} + placeholder="More detailed reviews get more visibility..." + /> + </div> + <div className={classes.submitContainer}> + <div className={classes.submit}> + {loadingMutation && <ThreeDots />} + {!loadingMutation && ( + <button + onClick={onSubmit} + className={classes.submitButton} + disabled={rating < 2 || description.length < 1} + > + Submit + </button> + )} + </div> + </div> + </div> + <div className={classes.backdrop} /> + </Modal> + </> + ); +} + +export default OrderDetail; diff --git a/enatega-multivendor-web/src/screens/OrderDetail/mapStyles.js b/enatega-multivendor-web/src/screens/OrderDetail/mapStyles.js new file mode 100644 index 0000000..88f4a79 --- /dev/null +++ b/enatega-multivendor-web/src/screens/OrderDetail/mapStyles.js @@ -0,0 +1,347 @@ +export const mapStyles = [ + { + featureType: "all", + elementType: "geometry", + stylers: [ + { + color: "#ffffff", + }, + ], + }, + { + featureType: "all", + elementType: "labels.text.fill", + stylers: [ + { + gamma: 0.01, + }, + { + lightness: 20, + }, + ], + }, + { + featureType: "all", + elementType: "labels.text.stroke", + stylers: [ + { + saturation: -31, + }, + { + lightness: -33, + }, + { + weight: 2, + }, + { + gamma: 0.8, + }, + ], + }, + { + featureType: "all", + elementType: "labels.icon", + stylers: [ + { + visibility: "off", + }, + ], + }, + { + featureType: "administrative.locality", + elementType: "labels.text.fill", + stylers: [ + { + color: "#050505", + }, + ], + }, + { + featureType: "administrative.locality", + elementType: "labels.text.stroke", + stylers: [ + { + color: "#fef3f3", + }, + { + weight: "3.01", + }, + ], + }, + { + featureType: "administrative.neighborhood", + elementType: "labels.text.fill", + stylers: [ + { + color: "#0a0a0a", + }, + { + visibility: "off", + }, + ], + }, + { + featureType: "administrative.neighborhood", + elementType: "labels.text.stroke", + stylers: [ + { + color: "#fffbfb", + }, + { + weight: "3.01", + }, + { + visibility: "off", + }, + ], + }, + { + featureType: "landscape", + elementType: "geometry", + stylers: [ + { + lightness: 30, + }, + { + saturation: 30, + }, + ], + }, + { + featureType: "poi", + elementType: "geometry", + stylers: [ + { + saturation: 20, + }, + ], + }, + { + featureType: "poi.attraction", + elementType: "labels.icon", + stylers: [ + { + visibility: "off", + }, + ], + }, + { + featureType: "poi.park", + elementType: "geometry", + stylers: [ + { + lightness: 20, + }, + { + saturation: -20, + }, + ], + }, + { + featureType: "road", + elementType: "geometry", + stylers: [ + { + lightness: 10, + }, + { + saturation: -30, + }, + ], + }, + { + featureType: "road", + elementType: "geometry.stroke", + stylers: [ + { + saturation: 25, + }, + { + lightness: 25, + }, + ], + }, + { + featureType: "road.highway", + elementType: "geometry.fill", + stylers: [ + { + visibility: "on", + }, + { + color: "#a1a1a1", + }, + ], + }, + { + featureType: "road.highway", + elementType: "geometry.stroke", + stylers: [ + { + color: "#292929", + }, + ], + }, + { + featureType: "road.highway", + elementType: "labels.text.fill", + stylers: [ + { + visibility: "on", + }, + { + color: "#202020", + }, + ], + }, + { + featureType: "road.highway", + elementType: "labels.text.stroke", + stylers: [ + { + visibility: "on", + }, + { + color: "#ffffff", + }, + ], + }, + { + featureType: "road.highway", + elementType: "labels.icon", + stylers: [ + { + visibility: "simplified", + }, + { + hue: "#0006ff", + }, + { + saturation: "-100", + }, + { + lightness: "13", + }, + { + gamma: "0.00", + }, + ], + }, + { + featureType: "road.arterial", + elementType: "geometry.fill", + stylers: [ + { + visibility: "on", + }, + { + color: "#686868", + }, + ], + }, + { + featureType: "road.arterial", + elementType: "geometry.stroke", + stylers: [ + { + visibility: "off", + }, + { + color: "#8d8d8d", + }, + ], + }, + { + featureType: "road.arterial", + elementType: "labels.text.fill", + stylers: [ + { + visibility: "on", + }, + { + color: "#353535", + }, + { + lightness: "6", + }, + ], + }, + { + featureType: "road.arterial", + elementType: "labels.text.stroke", + stylers: [ + { + visibility: "on", + }, + { + color: "#ffffff", + }, + { + weight: "3.45", + }, + ], + }, + { + featureType: "road.local", + elementType: "geometry.fill", + stylers: [ + { + color: "#d0d0d0", + }, + ], + }, + { + featureType: "road.local", + elementType: "geometry.stroke", + stylers: [ + { + lightness: "2", + }, + { + visibility: "on", + }, + { + color: "#999898", + }, + ], + }, + { + featureType: "road.local", + elementType: "labels.text.fill", + stylers: [ + { + color: "#383838", + }, + ], + }, + { + featureType: "road.local", + elementType: "labels.text.stroke", + stylers: [ + { + color: "#faf8f8", + }, + ], + }, + { + featureType: "transit.line", + elementType: "geometry.fill", + stylers: [ + { + visibility: "on", + }, + { + color: "#000000", + }, + ], + }, + { + featureType: "water", + elementType: "all", + stylers: [ + { + lightness: -20, + }, + ], + }, +]; diff --git a/enatega-multivendor-web/src/screens/OrderDetail/styles.js b/enatega-multivendor-web/src/screens/OrderDetail/styles.js new file mode 100644 index 0000000..6be807e --- /dev/null +++ b/enatega-multivendor-web/src/screens/OrderDetail/styles.js @@ -0,0 +1,203 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme, mobile) => ({ + contentContainer: { + padding: theme.spacing(0, 3), + }, + center: { + justifyContent: "center", + }, + textBold: { + fontWeight: 700, + }, + heading: { + fontSize: "2.175rem", + }, + topContainer: { + position: "relative", + marginTop: "40px", + }, + orderStatus: { + position: "absolute", + bottom: -80, + height: 180, + marginLeft: theme.spacing(8), + backgroundColor: theme.palette.common.black, + borderRadius: 10, + display: "flex", + justifyContent: "center", + flexDirection: "column", + [theme.breakpoints.down("md")]: { + marginLeft: theme.spacing(0), + }, + [theme.breakpoints.down("sm")]: { + marginLeft: theme.spacing(0), + height: "fit-content", + borderRadius: 20, + backgroundColor: theme.palette.grey[200], + }, + }, + greyText: { + color: theme.palette.grey[700], + }, + lightGrey: { + color: theme.palette.primary.main, + }, + bottomContainer: { + marginTop: theme.spacing(10), + backgroundColor: theme.palette.grey[100], + }, + spinnerContainer: { + height: "100vh", + justifyContent: "center", + alignItems: "center", + }, + chat: { + position: "fixed", + right: "20px", + bottom: "130px", + background: theme.palette.common.black, + padding: theme.spacing(2, 3), + borderRadius: 10, + borderBottomRightRadius: 0, + cursor: "pointer", + [theme.breakpoints.down("sm")]: { + right: "10px", + bottom: "10px", + }, + }, + review: { + position: "fixed", + right: "20px", + bottom: "200px", + background: theme.palette.common.black, + padding: theme.spacing(2, 3), + borderRadius: 10, + borderBottomRightRadius: 0, + cursor: "pointer", + [theme.breakpoints.down("sm")]: { + right: "10px", + bottom: "10px", + }, + }, + w70: { + width: "70%", + }, + mv2: { + margin: theme.spacing(2, 0), + }, + mt3: { + marginTop: theme.spacing(3), + }, + ph1: { + padding: theme.spacing(0, 1), + }, + + cardContainer: { + background: theme.palette.common.white, + borderRadius: 0, + }, + disabledText: { + color: theme.palette.text.disabled, + }, + smallText: { + fontSize: "0.875rem", + }, + mediumText: { + fontSize: "1.0rem", + }, + mediumBoldText: { + fontSize: "1.2rem", + color: theme.palette.common.black, + fontWeight: "600", + }, + cardRow: { + display: "flex", + justifyContent: "space-between", + padding: theme.spacing(0.1, 0), + }, + btnBase: { + borderRadius: "0px", + }, + paperContainer: { + width: "fit-content", + }, + modal: { + content: { + top: "50%", + left: "50%", + right: "auto", + bottom: "auto", + transform: "translate(-50%, -50%)", + width: mobile ? "80%" : "50%", // Add the desired width here + height: mobile ? "40%" : "35%", // Add the desired height here + }, + overlay: { + backgroundColor: theme.palette.secondary.dark, + }, + }, + modalContainer: { + flex: 1, + textAlign: "-webkit-center", + padding: mobile ? 0 : "30px", + }, + title: { + width: "100%", + height: "100%", + }, + starContainer: { + width: "100%", + justifyContent: "center", + alignItems: "center", + }, + starWrapper: { + width: "70%", + height: "60%", + }, + inputContainer: { + width: "100%", + justifyContent: "center", + alignItems: "center", + }, + input: { + marginTop: "30px", + height: "100%", + color: theme.palette.common.black, + width: mobile ? "100%" : "40%", + // border: "none", + // borderBottom: "1px solid theme.palette.secondary.light", + borderColor: theme.palette.grey[300], + borderWidth: "1px", + borderStyle: "groove", + outline: "none", + padding: "0.6%", + }, + submitContainer: { + width: "100%", + justifyContent: "center", + alignItems: "center", + }, + submit: { + width: "80%", + height: "10%", + }, + submitButton: { + width: "40%", + color: "white", + backgroundColor: theme.palette.primary.main, + marginTop: "20px", + border: "none", + padding: "10px", + }, + backdrop: { + backgroundColor: theme.palette.common.black, + }, + closeButton: { + position: 'absolute', + top: 30, // Adjust the top value as needed + right: 10, // Adjust the right value as needed + cursor: 'pointer', + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Paypal/Paypal.js b/enatega-multivendor-web/src/screens/Paypal/Paypal.js new file mode 100644 index 0000000..d81ebe5 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Paypal/Paypal.js @@ -0,0 +1,177 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useApolloClient, useQuery } from "@apollo/client"; +import { Box, CircularProgress, Grid, Typography } from "@mui/material"; +import gql from "graphql-tag"; +import React, { useCallback, useContext, useState, useEffect } from "react"; +import { PayPalButton } from "react-paypal-button-v2"; +import { useLocation, useNavigate } from "react-router"; +import { myOrders, orderPaypal } from "../../apollo/server"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { PaymentOrderCard } from "../../components/Orders"; +import ConfigurableValues from "../../config/constants"; +import UserContext from "../../context/User"; +import useStyles from "./styles"; +import Analytics from "../../utils/analytics"; +const ORDER_PAYPAL = gql` + ${orderPaypal} +`; + +const ORDERS = gql` + ${myOrders} +`; + +function Paypal() { + const { SERVER_URL, PAYPAL_KEY } = ConfigurableValues(); + const classes = useStyles(); + const navigate = useNavigate(); + const client = useApolloClient(); + let query = new URLSearchParams(useLocation().search); + const id = query.get("id") ?? null; + const [loader, setLoader] = useState(false); + const [mainError, setMainError] = useState({}); + const { clearCart } = useContext(UserContext); + const { data, loading, error } = useQuery(ORDER_PAYPAL, { + variables: { + id: id, + }, + }); + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_PAYPAL); + }, []); + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + async function handleResponse() { + await clearCart(); + const result = await client.query({ + query: ORDERS, + fetchPolicy: "network-only", + }); + const order = result.data.orders.find( + (item) => item.orderId === data.orderPaypal.orderId + ); + setLoader(false); + navigate(`/order-detail/${order._id}`, { replace: true }); + } + + if (error) { + return ( + <Grid container className={classes.root}> + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + <Box + display="flex" + justifyContent="center" + alignItems="center" + flex={1} + style={{ maxWidth: "auto", width: "100%", minHeight: "55vh" }} + > + <Typography variant="h5">{error.message}</Typography> + </Box> + </Grid> + </Grid> + ); + } + + const order = data?.orderPaypal ?? undefined; + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + alive={mainError.alive || false} + /> + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + {loading || loader ? ( + <Box + display="flex" + alignItems="center" + justifyContent="center" + className={classes.spinnerContainer} + > + <CircularProgress size={48} /> + </Box> + ) : ( + <> + {order && <PaymentOrderCard {...order} />} + <Box + display="flex" + justifyContent="center" + alignItems="center" + flex={1} + style={{ + maxWidth: "auto", + width: "100%", + marginTop: "50px", + }} + > + <Box + style={{ + width: "50%", + height: "auto", + textAlign: "center", + alignSelf: "center", + }} + > + <PayPalButton + style={{ width: "100%", color: "blue" }} + amount={order?.orderAmount} + options={{ + clientId: PAYPAL_KEY, + disableFunding: "credit,card", + }} + onSuccess={async (details, data) => { + setLoader(true); + return await fetch( + `${SERVER_URL}paypal/paypal-transaction-complete?id=${ + order?.orderId + }&paymentDetails=${JSON.stringify(details)}`, + { + method: "GET", + } + ) + .then((response) => response.json()) + .then((result) => { + if (!result.error) { + handleResponse(); + } else { + setLoader(false); + showMessage({ + type: "error", + message: result.message, + alive: true, + }); + } + }); + }} + /> + </Box> + </Box> + </> + )} + </Grid> + <Footer /> + </Grid> + ); +} + +export default React.memo(Paypal); diff --git a/enatega-multivendor-web/src/screens/Paypal/styles.js b/enatega-multivendor-web/src/screens/Paypal/styles.js new file mode 100644 index 0000000..45b6207 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Paypal/styles.js @@ -0,0 +1,19 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + root: { + background: theme.palette.grey[100], + minHeight: "100vh", + }, + mainContainer: { + marginTop: "70px", + padding: theme.spacing(6, 0), + justifyContent: "center", + background: theme.palette.grey[100], + }, + link: { + textDecoration: "none", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/PhoneNumber/PhoneNumber.js b/enatega-multivendor-web/src/screens/PhoneNumber/PhoneNumber.js new file mode 100644 index 0000000..d7d7787 --- /dev/null +++ b/enatega-multivendor-web/src/screens/PhoneNumber/PhoneNumber.js @@ -0,0 +1,194 @@ +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useTheme } from "@mui/material/styles"; +import Typography from "@mui/material/Typography"; +import React, { useRef, useState, useContext } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import RegistrationIcon from "../../assets/images/emailLock.png"; +import { Avatar } from "@mui/material"; +import PhoneInput from "react-phone-input-2"; +import "react-phone-input-2/lib/style.css"; +import { phoneExist, updateUser } from "../../apollo/server"; +import { gql, useMutation } from "@apollo/client"; + +import UserContext from "../../context/User"; +import ConfigurationContext from "../../context/Configuration"; + +import { useTranslation } from "react-i18next"; + +const PHONE = gql` + ${phoneExist} +`; + +const UPDATEUSER = gql` + ${updateUser} +`; + +function PhoneNumber() { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const [error, setError] = useState(""); + const navigate = useNavigate(); + const formRef = useRef(null); + const { state } = useLocation(); + const [loading, setLoading] = useState(false); // State to manage loading animation + const [phone, setPhone] = useState(""); + const [phoneError, setPhoneError] = useState(""); // State to manage phone input error + + const [mutate] = useMutation(UPDATEUSER); + const { profile } = useContext(UserContext); + const configuration = useContext(ConfigurationContext); + + const [PhoneExist] = useMutation(PHONE, { + onCompleted, + onError, + }); + + async function onCompleted({ phoneExist }) { + if (phoneExist?._id !== null) { + setError("Phone number already associated with some other user"); + setLoading(false); // Turn off loading animation if an error occurs + } else { + try { + if (configuration?.twilioEnabled) { + // Fetch twilioEnabled from state + navigate("/verify-phone", { + replace: true, + state: { + phone: `+${phone}`, + }, + }); + } else { + // If twilioEnabled is not true, mutate and navigate to "/" + await mutate({ + variables: { + name: profile.name, + phone: `+${phone}`, + phoneIsVerified: true, + }, + }); + + navigate("/", { + replace: true, + }); + } + } catch (error) { + console.error("Error:", error); + } + } + } + + function onError({ error }) { + setError("Something went wrong"); + setLoading(false); // Turn off loading animation if an error occurs + } + + const handleAction = async () => { + setError(""); + setPhoneError(""); // Reset phone error state to clear any previous errors + let validate = true; + if (!phone) { + setPhoneError("Phone number required"); + validate = false; + } + if (validate) { + if (`+${phone}` !== state?.prevPhone) { + setLoading(true); // Turn on loading animation before making the mutation call + await PhoneExist({ variables: { phone: `+${phone}` } }); + } else { + setPhoneError("New phone number must be different from previous one"); + } + } + }; + + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={RegistrationIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Typography variant="h5" className={classes.font700}> + {t("updatePhone")} <br /> {t("number")} + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + {t("secureAcc")} + </Typography> + <Box mt={theme.spacing(4)} /> + <form ref={formRef}> + <Box className={classes.form}> + <PhoneInput + placeholder="Enter phone number" + country={"pk"} + value={phone} + onChange={(phone) => setPhone(phone)} + containerStyle={{ + textAlign: "center", + marginRight: theme.spacing(2), + margin: "auto", + width: "90%", + }} + inputStyle={{ + paddingLeft: 10, + float: "right", + }} + /> + </Box> + <Typography variant="caption" style={{ color: "red" }}> + {phoneError} + </Typography> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + fullWidth + type="email" + disableElevation + disabled={loading} + className={classes.btnBase} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + {t("continue")} + </Typography> + )} + </Button> + </form> + </LoginWrapper> + ); +} + +export default PhoneNumber; diff --git a/enatega-multivendor-web/src/screens/PhoneNumber/styles.js b/enatega-multivendor-web/src/screens/PhoneNumber/styles.js new file mode 100644 index 0000000..9f2edd6 --- /dev/null +++ b/enatega-multivendor-web/src/screens/PhoneNumber/styles.js @@ -0,0 +1,36 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.grey[500], + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(2, 0), + }, + btnBase: { + height: "50px", + backgroundColor: theme.palette.common.black, + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.black, + opacity: 0.8, + }, + width: "70%", + borderRadius: 10, + }, + form: { + display: "flex", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Pickup/Pickup.js b/enatega-multivendor-web/src/screens/Pickup/Pickup.js new file mode 100644 index 0000000..873719b --- /dev/null +++ b/enatega-multivendor-web/src/screens/Pickup/Pickup.js @@ -0,0 +1,241 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { gql, useLazyQuery } from "@apollo/client"; +import { Box, CircularProgress, Grid, Typography, Button } from "@mui/material"; +import React, { + useCallback, + useContext, + useEffect, + useState, + useRef, +} from "react"; +import { useNavigate } from "react-router"; +import { restaurantList } from "../../apollo/server"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import { ClearCart } from "../../components/Modals"; +import RestaurantGridForPickup from "../../components/RestaurantComponent/RestaurantGridForPickup/RestaurantGridForPickup"; +import Subheader from "../../components/RestaurantComponent/Subheader/Subheader"; +import { LocationContext } from "../../context/Location"; +import UserContext from "../../context/User"; +import useStyles from "./styles"; +import { GoogleMap, Marker } from "@react-google-maps/api"; +import MarkerImage from "../../assets/images/marker.png"; + +const RESTAURANTS = gql` + ${restaurantList} +`; + +function Pickup() { + const navigate = useNavigate(); + const { location } = useContext(LocationContext); + const [center, setCenter] = useState({ + lat: 0, + lng: 0, + }); + const [message, setMessage] = useState({}); + const { isLoggedIn } = useContext(UserContext); + const [clearModal, setClearModal] = useState(false); + const [navigateData, setNavigateData] = useState({}); + const classes = useStyles(); + const { clearCart, restaurant: cartRestaurant } = useContext(UserContext); + const mapRef = useRef(null); + const fetchRef = useRef(false); + const [loader, setLoader] = useState(true); + + const [fetchRestaurants, { data, loading, error, refetch }] = useLazyQuery( + RESTAURANTS, + { + fetchPolicy: "network-only", + onCompleted, + } + ); + function onCompleted(data) { + setLoader(false); + } + const navigateClearCart = useCallback(async () => { + await clearCart(); + navigate(`/restaurant/${navigateData.slug}`, { state: navigateData }); + }, [navigateData]); + + const checkCart = useCallback( + (id, name, image, slug) => { + if (cartRestaurant && id !== cartRestaurant) { + setNavigateData({ id, name, image, slug }); + toggleClearCart(); + return false; + } + return true; + }, + [cartRestaurant] + ); + + const toggleClearCart = useCallback(() => { + setClearModal((prev) => !prev); + }, []); + + useEffect(() => { + if (!fetchRef.current) return; + (async () => { + const cen = { + lat: parseFloat(location.latitude), + lng: parseFloat(location.longitude), + }; + const variables = { + longitude: parseFloat(location.longitude) || null, + latitude: parseFloat(location.latitude) || null, + }; + await refetch(variables); + setCenter(cen); + })(); + }, [location]); + + useEffect(() => { + if (!location) return; + if (fetchRef.current) return; + const cen = { + lat: parseFloat(location.latitude), + lng: parseFloat(location.longitude), + }; + const variables = { + longitude: parseFloat(location.longitude) || null, + latitude: parseFloat(location.latitude) || null, + }; + fetchRestaurants({ variables }); + setCenter(cen); + fetchRef.current = true; + }, [location]); + + const showMessage = useCallback((messageObj) => { + setMessage(messageObj); + }, []); + const toggleSnackbar = useCallback(() => { + setMessage({}); + }, []); + + if (loader || loading || error) { + return ( + <Grid container className={classes.marginHeader}> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + <Box className={classes.spinnerContainer}> + {loading ? ( + <CircularProgress color="primary" size={48} /> + ) : ( + <Typography>Unable to load data </Typography> + )} + </Box> + </Grid> + ); + } + const { restaurants } = data?.nearByRestaurants ?? {}; + + const containerStyle = { + width: "100%", + height: "700px", + marginTop: "-50px", + }; + + function handleLoad(map) { + mapRef.current = map; + } + + const searchArea = async () => { + const cen = { + lat: parseFloat(mapRef.current.getCenter().toJSON().lat), + lng: parseFloat(mapRef.current.getCenter().toJSON().lng), + }; + const variables = { + longitude: parseFloat(cen.lng) || null, + latitude: parseFloat(cen.lat) || null, + }; + setCenter(cen); + await refetch(variables); + }; + + const onClickMarker = item => { + const element = document.querySelector( + `[id="${item._id}"]` + ); + element.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + + element.focus({ preventScroll: true }); + } + + return ( + <Grid container> + <FlashMessage + open={Boolean(message.type)} + severity={message.type} + alertMessage={message.message} + handleClose={toggleSnackbar} + /> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + + <Grid + container + spacing={0} + className={[classes.marginHeader, classes.rowReverse]} + > + <Grid className={classes.marginHeader} item md={9} xs={12}> + <Button className={classes.btn} onClick={() => searchArea()}> + Search area + </Button> + <GoogleMap + onLoad={handleLoad} + mapContainerStyle={containerStyle} + center={center} + zoom={10} + options={{ + fullscreenControl: false, + streetViewControl: false, + MapTypeControlOptions: false, + mapTypeControl: false, + }} + > + <Marker + position={{ + lat: parseFloat(location.latitude), + lng: parseFloat(location.longitude), + }} + icon={MarkerImage} + title={location.deliveryAddress} + /> + {restaurants?.map((item) => { + return ( + <Marker + key={item._id} + position={{ + lat: parseFloat(item.location.coordinates[1]), + lng: parseFloat(item.location.coordinates[0]), + }} + onClick={()=>onClickMarker(item)} + title={item.name} + /> + ); + })} + </GoogleMap> + </Grid> + <Grid className={classes.restaurants} item md={3} xs={12}> + <RestaurantGridForPickup + checkCart={checkCart} + restaurants={restaurants} + showMessage={showMessage} + /> + </Grid> + </Grid> + <Footer /> + <ClearCart + isVisible={clearModal} + toggleModal={toggleClearCart} + action={navigateClearCart} + /> + </Grid> + ); +} + +export default Pickup; diff --git a/enatega-multivendor-web/src/screens/Pickup/styles.js b/enatega-multivendor-web/src/screens/Pickup/styles.js new file mode 100644 index 0000000..7b013af --- /dev/null +++ b/enatega-multivendor-web/src/screens/Pickup/styles.js @@ -0,0 +1,45 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + marginHeader: { + marginTop: "100px", + }, + rowReverse: { + display: "flex", + flexDirection: "row-reverse", + }, + spinnerContainer: { + flexDirection: "row", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + marginTop: "100px", + }, + mapGrid: { + height: "700px", + width: "100%", + overflow: "hidden", + }, + restaurants: { + height: "700px", + overflow: "scroll", + }, + btn: { + zIndex: 1, + marginLeft: "40%", + background: theme.palette.primary.main, + color: theme.palette.common.white, + fontWeight: "bold", + boxShadow: `0 0 5px ${theme.palette.grey[300]}`, + "&:hover": { + background: theme.palette.success.main, + }, + }, + cardFocus: { + boxShadow: `0 0 10px ${theme.palette.grey[300]}`, + border: `2px solid ${theme.palette.primary.main}`, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Privacy/Privacy.js b/enatega-multivendor-web/src/screens/Privacy/Privacy.js new file mode 100644 index 0000000..8c4afcd --- /dev/null +++ b/enatega-multivendor-web/src/screens/Privacy/Privacy.js @@ -0,0 +1,195 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Grid, Typography } from "@mui/material"; +import React, { useContext, useEffect } from "react"; + +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import UserContext from "../../context/User"; +import useStyle from "./styles"; +import Analytics from "../../utils/analytics"; + +function PrivacyPolicy() { + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_PRIVACY_POLICY); + }, []); + const classes = useStyle(); + const { isLoggedIn } = useContext(UserContext); + return ( + <Grid className={classes.root}> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Grid container className={classes.mainContainer}> + <Box className={classes.imageContainer}> + <Typography + variant="h4" + color="textPrimary" + align="center" + className={classes.title} + > + Privacy Policy + </Typography> + </Box> + <Grid container item xs={12} className={classes.mainContainer}> + <Grid item xs={1} md={1} /> + <Grid container item xs={10} sm={10} md={9}> + <Typography + color="textSecondary" + variant="subtitle2" + className={classes.MV3} + > + This policy explains how we, enatega, a brand of + <a + href="https://enatega.com" + target="_blank" + rel="noopener noreferrer" + className={classes.linkDecoration} + > + <Typography + variant="caption" + color="primary" + className={classes.link} + > + {"https://enatega.com"} + </Typography> + </a> + , use your personal information which you provide to us when using + our service, including but not limited to our website and mobile + applications (apps). + </Typography> + <Typography variant="subtitle1" className={classes.boldText}> + What information we collect about you? + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + We collect personal information from you when you order goods or + services from us or use our website. We also collect information + when you complete any customer survey. Website usage information + may also be collected using cookies. + </Typography> + <Typography variant="subtitle1" className={classes.boldText}> + Cookies and Google Analytics + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Cookies are small text files that are placed on your computer by + websites that you visit. They are widely used in order to make + websites work, or work more efficiently, as well as to provide + information to the owners of the site. + </Typography> + <Typography variant="subtitle2"> + This website uses Google Analytics, a web analytics service + provided by Google, Inc. ("Google"). Google Analytics uses + "cookies", which are text files saved on your computer, to help + the website analyze how you use the site. The information + generated by the cookie about your use of the website will be + transmitted to and stored by Google on servers in the United + States. If this website anonymizes IP addresses, your IP address + will be truncated by Google within a EU member state or other EEA + state before being transmitted to the US. Only in exceptional + situations will your full IP address be transmitted to Google + servers in the United States and truncated there. Google will use + this information for the purpose of evaluating your use of the + website, compiling reports on website activity for website + operators and providing other services relating to website + activity and internet usage. Google will not associate your IP + address with any other data held by Google. You may refuse the use + of cookies by selecting the appropriate settings on your browser, + however please note that if you do this you may not be able to use + the full functionality of this website. By using this website, you + consent to the processing of data about you by Google in the + manner and for the purposes set out above. You can also prevent + Google from collecting information (including your IP address) via + cookies and processing this information by downloading this + browser plugin and installing it:{" "} + <a + href="https://tools.google.com/dlpage/gaoptout" + target="_blank" + rel="noopener noreferrer" + className={classes.linkDecoration} + > + <Typography + variant="caption" + color="primary" + className={classes.link} + > + {"https://tools.google.com/dlpage/gaoptout"} + </Typography> + </a> + <Typography variant="subtitle2" className={classes.MV3}> + Most web browsers allow some control of most cookies through the + browser settings. To find out more about cookies, including how + to see what cookies have been set and how to manage and delete + them, visit + <a + href="http://www.allaboutcookies.org" + target="_blank" + rel="noopener noreferrer" + className={classes.linkDecoration} + > + <Typography + variant="caption" + color="primary" + className={classes.link} + > + {"www.allaboutcookies.org"} + </Typography> + </a> + </Typography> + </Typography> + <Typography variant="subtitle1" className={classes.boldText}> + How will we use the information we collect from you? + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Information that we collect from you is used to process your order + and to manage your account. We may also use your information to + email you about other products or services that we think may be of + interest to you. + </Typography> + <Typography variant="subtitle2"> + In processing your order we may send your information to credit + reference and fraud prevention agencies. + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + From time to time we may send your information to third parties + which we consider may have goods or services which are of interest + to you. If you do not wish to be contacted by third parties please + email us at + <Typography + variant="caption" + color="primary" + className={classes.link} + > + {" info@enatega.com"} + </Typography> + </Typography> + <Typography variant="subtitle1" className={classes.boldText}> + Access to your information + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + You have a right to request a copy of the information we hold on + you at any time. Please email us if you would like to receive a + copy of this information –{" "} + <Typography + variant="caption" + color="primary" + className={classes.link} + > + {" info@enatega.com"} + </Typography> + . There will be a small charge for processing this request. + </Typography> + <Typography variant="subtitle1" className={classes.boldText}> + Other Websites + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Our website may have links to other websites. This privacy policy + only applies to this website. You should therefore read the + privacy policies of the other websites when you are using those + sites. + </Typography> + </Grid> + </Grid> + </Grid> + <Footer /> + </Grid> + ); +} + +export default React.memo(PrivacyPolicy); diff --git a/enatega-multivendor-web/src/screens/Privacy/styles.js b/enatega-multivendor-web/src/screens/Privacy/styles.js new file mode 100644 index 0000000..00ebd43 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Privacy/styles.js @@ -0,0 +1,43 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + paddingTop: "70px", + minWidth: "100%", + backgroundColor: "transparent", + color: theme.palette.secondary.light, + }, + imageContainer: { + width: "100%", + height: "400px", + backgroundImage: + "url(https://images.deliveryhero.io/image/foodpanda/cms-hero.jpg?width=2000&height=500|https://images.deliveryhero.io/image/foodpanda/cms-hero.jpg?width=4000&height=1000)", + backgroundSize: "cover", + backgroundPositionX: "50%", + backgroundPositionY: "center", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + title: { + fontWeight: theme.typography.fontWeightBold, + textTransform: "uppercase", + }, + linkDecoration: { + textDecoration: "none", + alignSelf: "center", + }, + link: { + fontSize: 16, + }, + boldText: { + fontWeight: 600, + }, + MV3: { + margin: theme.spacing(3, 0), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Profile/Profile.js b/enatega-multivendor-web/src/screens/Profile/Profile.js new file mode 100644 index 0000000..9dfbc24 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Profile/Profile.js @@ -0,0 +1,53 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Grid, Typography } from "@mui/material"; +import React, { useEffect, useContext } from "react"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { + AddressCard, + PasswordCard, + ProfileCard, +} from "../../components/Profile"; +import useStyles from "./styles"; +import Analytics from "../../utils/analytics"; +import FavouritesBg from "../../assets/images/fav-bg.png"; +import ProfileImage from "../../assets/images/profile.png"; +import UserContext from "../../context/User"; + +function Profile() { + const { profile } = useContext(UserContext); + const classes = useStyles(); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_PROFILE); + }, []); + return ( + <Grid container className={classes.root}> + <Header /> + <Box className={classes.topContainer}> + <Typography variant="h2" align="center" style={{ zIndex: 9999 }}> + {profile && profile?.name[0].toUpperCase()} + </Typography> + <Box style={{ zIndex: 100, position: "absolute" }}> + <img src={ProfileImage} alt="fav" /> + </Box> + <img src={FavouritesBg} alt="fav-bg" className={classes.bg} /> + </Box> + <Grid container item className={classes.marginHeader}> + <ProfileCard /> + </Grid> + <Grid container item className={classes.marginHeader}> + <PasswordCard /> + </Grid> + <Grid container item className={classes.marginHeader}> + <AddressCard /> + </Grid> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </Grid> + ); +} + +export default Profile; diff --git a/enatega-multivendor-web/src/screens/Profile/styles.js b/enatega-multivendor-web/src/screens/Profile/styles.js new file mode 100644 index 0000000..af144c0 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Profile/styles.js @@ -0,0 +1,66 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + "& .MuiTextField-root": { + marginBottom: theme.spacing(3), + }, + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey[200], + }, + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + "& .MuiButton-contained": { + borderRadius: "0px", + height: "50px", + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main, + }, + }, + backgroundColor: theme.palette.primary.dark, + }, + marginHeader: { + marginTop: "140px", + }, + topContainer: { + marginTop: "210px", + width: "100%", + display: "flex", + justifyContent: "center", + alignItems: "center", + position: "relative", + }, + bg: { + position: "absolute", + left: "-100px", + [theme.breakpoints.down("md")]: { + left: "-50px", + }, + maxWidth: "100%", + }, + footerContainer: { + background: theme.palette.primary.dark, + width: "100%", + marginTop: 100, + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Registration/Registration.js b/enatega-multivendor-web/src/screens/Registration/Registration.js new file mode 100644 index 0000000..f5ca237 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Registration/Registration.js @@ -0,0 +1,320 @@ +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import IconButton from "@mui/material/IconButton"; +import InputAdornment from "@mui/material/InputAdornment"; +import { useTheme } from "@mui/material/styles"; +import TextField from "@mui/material/TextField"; +import Typography from "@mui/material/Typography"; +import { Visibility, VisibilityOff } from "@mui/icons-material"; +import React, { useCallback, useRef, useState } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import { isValidEmailAddress } from "../../utils/customFunction"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import RegistrationIcon from "../../assets/images/emailLock.png"; +import { Avatar } from "@mui/material"; +import PhoneInput from "react-phone-input-2"; +import "react-phone-input-2/lib/style.css"; +import { gql, useMutation } from "@apollo/client"; +import { phoneExist } from "../../apollo/server"; +import { useEffect } from "react"; +import { useTranslation } from 'react-i18next'; + +const PHONE = gql` + ${phoneExist} +`; + +function Registration() { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const [error, setError] = useState(""); + const navigate = useNavigate(); + const formRef = useRef(null); + const { state } = useLocation(); + const [loading, setLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const [passError, setPassError] = useState(""); + const [emailError, setEmailError] = useState(""); + const [fNameError, setFNameError] = useState(""); + const [lNameError, setLNameError] = useState(""); + const [phone, setPhone] = useState(""); + + const [phoneError, setPhoneError] = useState(null); + const [PhoneEixst] = useMutation(PHONE, { + onCompleted, + onError, + }); + const handleBackNavigation = () => { + // Use history.push to navigate to the desired route + navigate("/new-login"); + }; + + useEffect(() => { + // Add an event listener for the popstate event + window.addEventListener("popstate", handleBackNavigation); + + // Remove the event listener when the component unmounts + return () => { + window.removeEventListener("popstate", handleBackNavigation); + }; + }); + function onCompleted({ phoneExist }) { + if (phoneExist?._id !== null) { + setError("Phone number already assocaited with some other user"); + setLoading(false); + } else { + navigate("/verify-email", { + replace: true, + state: { + email: formRef.current["email"].value.toLowerCase().trim(), + password: formRef.current["userPass"].value, + name: + formRef.current["firstName"].value + + " " + + formRef.current["lastName"].value, + phone: `+${phone}`, + picture: "", + }, + }); + } + } + function onError({ error }) { + setError("Something went wrong"); + } + + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; + const handleMouseDownPassword = (event) => { + event.preventDefault(); + }; + const clearErrors = () => { + setEmailError(""); + setFNameError(""); + setFNameError(""); + setPassError(""); + setError(""); + }; + + const handleAction = () => { + clearErrors(); + let validate = true; + const emailValue = formRef.current["email"].value; + const firstNameValue = formRef.current["firstName"].value; + const lastNameValue = formRef.current["lastName"].value; + const userPass = formRef.current["userPass"].value; + const passRegex = /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).+$/; + + if (!isValidEmailAddress(emailValue)) { + setEmailError(t('emailErr2')); + validate = false; + } + if (!firstNameValue.trim()) { + setFNameError(t('firstnameErr2')); + validate = false; + } + if (!lastNameValue.trim()) { + setLNameError(t('lastnameErr2')); + validate = false; + } + if (!userPass) { + setPassError(t('passwordErr2')); + validate = false; + } + if (!phone) { + setPhoneError(t('mobileErr2')); + validate = false; + } + if (!passRegex.test(userPass)) { + setPassError( + t('passwordErr1') + ); + validate = false; + } + if (validate) { + setLoading(true); + PhoneEixst({ variables: { phone: `+${phone}` } }); + } else { + setError(t('generalErr')); + } + }; + + + const toggleSnackbar = useCallback(() => { + setError(""); + }, []); + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + handleClose={toggleSnackbar} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={RegistrationIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Box mt={theme.spacing(1)} /> + <Typography variant="h5" className={classes.font700}> + {t('letsGetStarted')} + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + {t('createAccount')} + </Typography> + <Box mt={theme.spacing(3)} /> + <form ref={formRef}> + <TextField + name={"email"} + defaultValue={state?.email ?? ""} + error={Boolean(emailError)} + helperText={emailError} + variant="outlined" + label="Email" + fullWidth + InputLabelProps={{ + style: { + color: theme.palette.grey[500], + }, + }} + /> + <Box className={classes.rowField}> + <TextField + style={{ width: "45%" }} + name={"firstName"} + error={Boolean(fNameError)} + helperText={fNameError} + variant="outlined" + label="First Name" + fullWidth + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + <TextField + style={{ width: "45%" }} + name={"lastName"} + error={Boolean(lNameError)} + helperText={lNameError} + variant="outlined" + label="Last Name" + fullWidth + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + /> + </Box> + <TextField + name={"userPass"} + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + InputProps={{ + endAdornment: ( + <InputAdornment position="end"> + <IconButton + aria-label="toggle password visibility" + onClick={handleClickShowPassword} + onMouseDown={handleMouseDownPassword} + edge="end" + size="large" + > + {showPassword ? ( + <Visibility color="primary" /> + ) : ( + <VisibilityOff color="primary" /> + )} + </IconButton> + </InputAdornment> + ), + }} + error={Boolean(passError)} + helperText={passError} + fullWidth + variant="outlined" + label="Password" + type={showPassword ? "text" : "password"} + /> + <Box className={classes.rowField}> + <PhoneInput + placeholder="Enter phone number" + country={"pk"} + value={phone} + onChange={(phone) => setPhone(phone)} + containerStyle={{ + textAlign: "center", + marginRight: theme.spacing(2), + margin: "auto", + }} + inputStyle={{ + paddingLeft: 10, + width: "85%", + float: "right", + borderColor: theme.palette.grey[200], + height: 50, + }} + dropdownStyle={{ + position: "absolute", + top: "-60px", + left: "60px", + }} + /> + </Box> + <Typography variant="caption" style={{ color: "red" }}> + {phoneError} + </Typography> + <Box mt={theme.spacing(4)} /> + <Button + variant="contained" + fullWidth + type="email" + disableElevation + disabled={loading} + className={classes.btnBase} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + {t('continue')} + </Typography> + )} + </Button> + </form> + </LoginWrapper> + ); +} + +export default Registration; diff --git a/enatega-multivendor-web/src/screens/Registration/styles.js b/enatega-multivendor-web/src/screens/Registration/styles.js new file mode 100644 index 0000000..b04e318 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Registration/styles.js @@ -0,0 +1,40 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.text.disabled, + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(1, 0), + }, + btnBase: { + height: "50px", + backgroundColor: theme.palette.common.black, + opacity: 1, + transition: 'opacity 0.3s', + "&:hover": { + backgroundColor: theme.palette.common.black, + opacity: 0.8, + }, + width: "70%", + borderRadius: 10, + }, + codePicker: { + width: "100%", + marginRight: theme.spacing(2), + }, + form: { + display: "flex", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/ResetPassword/ResetPassword.js b/enatega-multivendor-web/src/screens/ResetPassword/ResetPassword.js new file mode 100644 index 0000000..103009c --- /dev/null +++ b/enatega-multivendor-web/src/screens/ResetPassword/ResetPassword.js @@ -0,0 +1,200 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { useMutation } from "@apollo/client"; +import { + Avatar, + Box, + Button, + CircularProgress, + TextField, + Typography, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { useLocation, useNavigate, Navigate } from "react-router-dom"; +import { resetPassword } from "../../apollo/server"; +import FlashMessage from "../../components/FlashMessage"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import VerifyEmailIcon from "../../assets/images/emailLock.png"; +import { LoginWrapper } from "../Wrapper"; + +const RESET_PASSWORD = gql` + ${resetPassword} +`; + +function ResetPassword() { + const formRef = useRef(); + const theme = useTheme(); + const classes = useStyles(); + const { state } = useLocation(); + const navigate = useNavigate(); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const [passError, setPassError] = useState(""); + + const [mutate] = useMutation(RESET_PASSWORD, { onCompleted, onError }); + + function onCompleted() { + try { + FlashMessage({ + message: "Password reset done", + }); + setError("Password reset done successfully"); + navigate("/login", { replace: true }); + } catch (e) { + setError("Something went wrong"); + console.log(e); + } finally { + setLoading(false); + } + } + + function onError(e) { + setLoading(false); + setError(e.message); + } + const clearErrors = () => { + setPassError(""); + setError(""); + }; + const handleAction = () => { + const passRegex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/; + clearErrors(); + let validate = true; + const newPass = formRef.current["newPassword"].value; + const retypePass = formRef.current["retypePassword"].value; + if (!passRegex.test(newPass) || !newPass) { + setPassError("Invalid Password"); + validate = false; + return; + } + if (!retypePass) { + setPassError("confirm password required"); + validate = false; + return; + } + if (validate) { + if (newPass === retypePass) { + setLoading(true); + mutate({ + variables: { + password: newPass, + email: state?.email.toLowerCase().trim(), + }, + }); + } else { + setPassError("Password must match with confirm password"); + } + } + }; + + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_FORGOT_PASSWORD); + }, []); + + const toggleSnackbar = useCallback(() => { + setError(""); + }, []); + + return state.email ? ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + handleClose={toggleSnackbar} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={VerifyEmailIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <form ref={formRef}> + <Box mt={theme.spacing(2)} /> + <Typography variant="h5" className={classes.font700}> + Set your password + </Typography> + <Box mt={theme.spacing(2)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + Kindly set your new password + </Typography> + <Box mt={theme.spacing(2)} /> + <TextField + name={"newPassword"} + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + defaultValue={""} + error={Boolean(passError)} + helperText={passError} + fullWidth + variant="outlined" + label="New Password" + type={"password"} + /> + <Box mt={theme.spacing(2)} /> + <TextField + name={"retypePassword"} + InputLabelProps={{ + style: { + color: theme.palette.grey[600], + }, + }} + defaultValue={""} + error={Boolean(passError)} + helperText={passError} + fullWidth + variant="outlined" + label="Retype password" + type={"password"} + /> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + color="primary" + fullWidth + type="email" + disableElevation + disabled={loading} + className={`${classes.btnBase} ${classes.customBtn}`} + onClick={(e) => { + e.preventDefault(); + handleAction(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + Save + </Typography> + )} + </Button> + <Box mt={theme.spacing(2)} /> + </form> + </LoginWrapper> + ) : ( + <Navigate to="/login" /> + ); +} + +export default ResetPassword; diff --git a/enatega-multivendor-web/src/screens/ResetPassword/styles.js b/enatega-multivendor-web/src/screens/ResetPassword/styles.js new file mode 100644 index 0000000..84d6b49 --- /dev/null +++ b/enatega-multivendor-web/src/screens/ResetPassword/styles.js @@ -0,0 +1,50 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.grey[500], + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(2, 0), + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.main, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main + }, + width: "70%", + borderRadius: 10, + }, + customBtn: { + background: theme.palette.common.main, + width: "70%", + transition: "opacity 0.3s", + opacity: 1, + "&:hover": { + backgroundColor: theme.palette.common.main, + opacity: 0.8, + }, + }, + form: { + display: "flex", + }, + codePicker: { + width: 80, + marginRight: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/RestaurantDetail/RestaurantDetail.js b/enatega-multivendor-web/src/screens/RestaurantDetail/RestaurantDetail.js new file mode 100644 index 0000000..4090b44 --- /dev/null +++ b/enatega-multivendor-web/src/screens/RestaurantDetail/RestaurantDetail.js @@ -0,0 +1,403 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + Button, + CircularProgress, + Container, + Divider, + Grid, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useLocation, useParams } from "react-router-dom"; +import { Link } from "react-scroll"; +import Scrollspy from "react-scrollspy"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import Analytics from "../../utils/analytics"; +import { + RestaurantClose, + RestaurantInfo, + VariationModal, +} from "../../components/Modals"; +import { + ItemCard, + MRestaurantCart, + RestaurantCart, + RestaurantHeader, +} from "../../components/RestaurantDetailComponent"; +import UserContext from "../../context/User"; +import { useRestaurant } from "../../hooks"; +import { DAYS } from "../../utils/constantValues"; +import useStyles from "./styles"; +import MoreHorizIcon from "@mui/icons-material/MoreHoriz"; + +function RestaurantDetail() { + const theme = useTheme(); + const isTablet = useMediaQuery(theme.breakpoints.down("lg")); + const classes = useStyles(); + const { state } = useLocation(); + const query = useParams(); + const [isClose, setIsClose] = useState(false); + const [mainError, setMainError] = useState({}); + const [addonData, setAddonData] = useState(null); + const [reviewModal, setReviewModal] = useState(false); + const [variationModal, setVariationModal] = useState(false); + const { data, loading, error } = useRestaurant(state?.id, query.slug); + const allDeals = data?.restaurant?.categories.filter( + (cat) => cat.foods.length + ); + const { + restaurant: restaurantCart, + setCartRestaurant, + checkItemCart, + addCartItem, + addQuantity, + cart, + clearCart, + isLoggedIn, + } = useContext(UserContext); + const deals = allDeals?.map((c, index) => ({ + ...c, + index, + })); + const headerData = { + name: data?.restaurant?.name ?? "...", + averageReview: data?.restaurant?.reviewData.ratings ?? "...", + averageTotal: data?.restaurant?.reviewData.total ?? "...", + isAvailable: data?.restaurant?.isAvailable ?? true, + openingTimes: data?.restaurant?.openingTimes ?? [], + deals: deals, + deliveryTime: data?.restaurant?.deliveryTime, + }; + const restaurantInfo = { + _id: data?.restaurant._id ?? "", + name: data?.restaurant?.name ?? "...", + image: data?.restaurant?.image ?? "", + deals: deals, + reviewData: data?.restaurant?.reviewData ?? {}, + address: data?.restaurant?.address ?? "", + deliveryCharges: data?.restaurant?.deliveryCharges ?? "", + deliveryTime: data?.restaurant?.deliveryTime ?? "...", + isAvailable: data?.restaurant?.isAvailable ?? true, + openingTimes: data?.restaurant?.openingTimes ?? [], + }; + + useEffect(() => { + window.scrollTo(0, 0); + }, []); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_RESTAURANTS_DETAIL); + }, []); + useEffect(() => { + if (data?.restaurant && (!isOpen || !data?.restaurant?.isAvailable)) { + toggleCloseModal(); + } + }, [data?.restaurant]); + + const toggleVariationModal = useCallback(() => { + setVariationModal((prev) => !prev); + }, []); + + const toggleReviewModal = useCallback(() => { + setReviewModal((prev) => !prev); + }, []); + + const toggleCloseModal = useCallback(() => { + setIsClose((prev) => !prev); + }, []); + + const isOpen = useCallback(() => { + if (data) { + if (data.restaurant.openingTimes.length < 1) return false; + const date = new Date(); + const day = date.getDay(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const todaysTimings = data.restaurant.openingTimes.find( + (o) => o.day === DAYS[day] + ); + if (todaysTimings === undefined) return false; + const times = todaysTimings.times.filter( + (t) => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ); + + return times.length > 0; + } else return false; + }, [data]); + + const addFoodToCart = async (food) => { + if (!restaurantInfo.isAvailable || !isOpen()) { + toggleCloseModal(); + return; + } + if (!restaurantCart || food.restaurant === restaurantCart) { + await addToCart(food, food.restaurant !== restaurantCart); + } + }; + + const addToCart = async (food, clearFlag) => { + if ( + food.variations.length === 1 && + food.variations[0].addons.length === 0 + ) { + await setCartRestaurant(food.restaurant); + const result = checkItemCart(food._id); + if (result.exist) await addQuantity(result.key); + else + await addCartItem(food._id, food.variations[0]._id, 1, [], clearFlag); + } else { + if (clearFlag) await clearCart(); + setAddonData({ + food, + addons: data?.restaurant.addons, + options: data?.restaurant.options, + restaurant: data?.restaurant._id, + image: data?.restaurant?.image, + }); + toggleVariationModal(); + } + await Analytics.track(Analytics.events.ADD_TO_CART, { + title: food.title, + restaurantName: food.restaurantName, + variations: food.variations, + }); + }; + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + if (loading || error) { + return ( + <div style={{ backgroundColor: theme.palette.grey[200] }}> + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + </Grid> + {/* <Subheader /> */} + <Grid container style={{ display: "flex" }}> + <Grid item lg={9} xs={12}> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + }} + > + <Box + className={classes.imageContainer} + style={{ + backgroundImage: `url('${restaurantInfo?.image ?? ""}')`, + }} + /> + <Box style={{ backgroundColor: theme.palette.common.white }}> + <RestaurantHeader headerData={restaurantInfo} loading /> + </Box> + <Divider orientation="horizontal" light /> + </Container> + <Box className={classes.spinnerContainer}> + {error ? ( + <Typography>Unable to fetch data {error.message}</Typography> + ) : ( + <CircularProgress color="primary" size={48} /> + )} + </Box> + </Grid> + </Grid> + <Box + className={classes.footerContainer} + style={{ background: "transparent" }} + > + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </div> + ); + } + + return ( + <> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + /> + <div + style={{ + backgroundColor: theme.palette.grey[200], + scrollBehavior: "smooth", + marginTop:'20px', + }} + > + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + </Grid> + {/* <Subheader /> */} + <Grid + container + style={{ display: "flex", flexDirection: "row-reverse" }} + className={classes.bg} + > + {!isTablet && <RestaurantCart showMessage={showMessage} />} + <Grid item lg={9} xs={12}> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + marginTop: "44px", + borderBottomLeftRadius: 50, + borderBottomRightRadius: 50, + }} + > + <Box + className={classes.imageContainer} + style={{ + backgroundImage: `url('${restaurantInfo?.image ?? ""}')`, + }} + > + <Button + onClick={toggleReviewModal} + style={{ position: "absolute", top: 10, right: 10 }} + > + <MoreHorizIcon + style={{ + background: theme.palette.common.blackShade, + color: theme.palette.common.white, + borderRadius: 20, + padding: 2, + marginTop:5, + }} + /> + </Button> + <Box + style={{ + border: `2px solid ${theme.palette.primary.main}`, + borderRadius: 10, + }} + className={classes.restaurantDetail} + > + <RestaurantHeader + toggleModal={toggleReviewModal} + headerData={headerData} + /> + </Box> + </Box> + </Container> + <Box p={3}> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + position: "sticky", + zIndex: 1200, + top: "63px", + display: "flex", + }} + > + <div className={classes.tabContainer}> + <Container + style={{ marginLeft: "0px", justifyContent: "center" }} + > + <Scrollspy + offset={-220} + className={classes.scrollpyStyles} + items={deals.map((item) => item._id)} + currentClassName={classes.active} + > + {deals.map((item, index) => ( + <li + key={`STICKY_${index}`} + className={classes.tabListStyle} + > + <Link + to={item._id} + spy={true} + smooth={true} + className={classes.anchorStyle} + offset={-220} + > + <Typography className={classes.tabTextStyle}> + {item.title} + </Typography> + </Link> + </li> + ))} + </Scrollspy> + </Container> + </div> + </Container> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + }} + > + {deals.map((item, index) => ( + <section key={`SECTION_${index}`} id={item._id}> + <ItemCard + {...item} + onPress={addFoodToCart} + restaurant={{ + restaurant: restaurantInfo._id, + restaurantName: restaurantInfo.name, + deliveryCharges: restaurantInfo.deliveryCharges, + }} + /> + </section> + ))} + </Container> + </Box> + </Grid> + </Grid> + <Box + className={classes.footerContainer} + style={{ background: "transparent" }} + > + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + <RestaurantClose + isVisible={isClose} + toggleModal={toggleCloseModal} + restaurant={restaurantInfo.name} + /> + <VariationModal + isVisible={variationModal} + toggleModal={toggleVariationModal} + data={addonData} + /> + <RestaurantInfo + isVisible={reviewModal} + toggleModal={toggleReviewModal} + restaurantInfo={restaurantInfo} + /> + {isTablet && cart.length && ( + <MRestaurantCart showMessage={showMessage} /> + )} + </div> + </> + ); +} + +export default RestaurantDetail; diff --git a/enatega-multivendor-web/src/screens/RestaurantDetail/styles.js b/enatega-multivendor-web/src/screens/RestaurantDetail/styles.js new file mode 100644 index 0000000..d73eb48 --- /dev/null +++ b/enatega-multivendor-web/src/screens/RestaurantDetail/styles.js @@ -0,0 +1,108 @@ +import makeStyles from "@mui/styles/makeStyles"; +import Bg from "../../assets/images/bg-invert.png"; +const useStyles = makeStyles((theme) => ({ + marginHeader: { + marginTop: "200px", + }, + active: { + color: theme.palette.primary.main, + borderBottom: `6px solid ${theme.palette.primary.main}`, + marginBottom: "-4px", + }, + anchorStyle: { + textDecoration: "none", + textTransform: "uppercase", + whiteSpace: "nowrap", + cursor: "pointer", + }, + tabTextStyle: { + ...theme.typography.subtitle2, + color: theme.palette.common.black, + fontWeight: 600, + [theme.breakpoints.down("md")]: { + fontSize: "0.6rem", + }, + }, + tabListStyle: { + padding: "16px 16px 16px 16px", + [theme.breakpoints.down("md")]: { + padding: "8px", + }, + }, + imageContainer: { + width: "100%", + height: "324px", + backgroundImage: `url('https://images.deliveryhero.io/image/fd-pk/LH/v1bq-hero.jpg?width=2000&height=500')`, + backgroundSize: "cover", + backgroundPositionX: "center", + backgroundPositionY: "center", + position: "relative", + borderBottomLeftRadius: 40, + boxShadow: + "inset 0 0 0 1000px rgba(0, 0, 0, 0), inset 0 0 0 1000px theme.palette.common.lightBlack", + borderBottomRightRadius: 40, + }, + tabContainer: { + width: "100%", + background: theme.palette.primary.light, + height: "71px", + display: "flex", + alignItems: "center", + position: "sticky", + top: "140px", + zIndex: 1200, + borderRadius: 10, + }, + scrollpyStyles: { + display: "flex", + alignItems: "center", + listStyleType: "none", + justifyContent: "space-evenly", + width: "100%", + paddingLeft: 0, + borderBottom: `2px solid ${theme.palette.primary.main}`, + overflow: "visible", + }, + + categoriesStyle: { + ...theme.typography.subtitle2, + color: theme.palette.text.disabled, + }, + spinnerContainer: { + flexDirection: "row", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + padding: theme.spacing(20, 0), + }, + footerContainer: { + background: theme.palette.success.dark, + width: "100%", + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, + restaurantDetail: { + position: "absolute", + left: "50%", + top: "50%", + transform: "translate(-50%,-50%)", + backgroundColor: theme.palette.common.darkBlack, + minWidth: "250px", + }, + bg: { + backgroundImage: `url(${Bg})`, + backgroundPositionX: "left", + backgroundPositionY: "bottom", + backgroundSize: "400px", + backgroundRepeat: "no-repeat", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/RestaurantDetail/temp.js b/enatega-multivendor-web/src/screens/RestaurantDetail/temp.js new file mode 100644 index 0000000..a335cc2 --- /dev/null +++ b/enatega-multivendor-web/src/screens/RestaurantDetail/temp.js @@ -0,0 +1,361 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { + Box, + CircularProgress, + Container, + Divider, + Grid, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useLocation, useParams } from "react-router-dom"; +import { Link } from "react-scroll"; +import Scrollspy from "react-scrollspy"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import Analytics from "../../utils/analytics"; +import { + RestaurantClose, + RestaurantInfo, + VariationModal, +} from "../../components/Modals"; +import { Subheader } from "../../components/RestaurantComponent"; +import { + ItemCard, + MRestaurantCart, + RestaurantCart, + RestaurantHeader, +} from "../../components/RestaurantDetailComponent"; +import UserContext from "../../context/User"; +import { useRestaurant } from "../../hooks"; +import { DAYS } from "../../utils/constantValues"; +import useStyles from "./styles"; + +function RestaurantDetail() { + const theme = useTheme(); + const isTablet = useMediaQuery(theme.breakpoints.down("lg")); + const classes = useStyles(); + const { state } = useLocation(); + const query = useParams(); + const [isClose, setIsClose] = useState(false); + const [mainError, setMainError] = useState({}); + const [addonData, setAddonData] = useState(null); + const [reviewModal, setReviewModal] = useState(false); + const [variationModal, setVariationModal] = useState(false); + const { data, loading, error } = useRestaurant(state?.id, query.slug); + const allDeals = data?.restaurant?.categories.filter( + (cat) => cat.foods.length + ); + const { + restaurant: restaurantCart, + setCartRestaurant, + checkItemCart, + addCartItem, + addQuantity, + cart, + clearCart, + isLoggedIn, + } = useContext(UserContext); + const deals = allDeals?.map((c, index) => ({ + ...c, + index, + })); + const headerData = { + name: data?.restaurant?.name ?? "...", + averageReview: data?.restaurant?.reviewData.ratings ?? "...", + averageTotal: data?.restaurant?.reviewData.total ?? "...", + isAvailable: data?.restaurant?.isAvailable ?? true, + openingTimes: data?.restaurant?.openingTimes ?? [], + deals: deals, + }; + const restaurantInfo = { + _id: data?.restaurant._id ?? "", + name: data?.restaurant?.name ?? "...", + image: data?.restaurant?.image ?? "", + deals: deals, + reviewData: data?.restaurant?.reviewData ?? {}, + address: data?.restaurant?.address ?? "", + deliveryCharges: data?.restaurant?.deliveryCharges ?? "", + deliveryTime: data?.restaurant?.deliveryTime ?? "...", + isAvailable: data?.restaurant?.isAvailable ?? true, + openingTimes: data?.restaurant?.openingTimes ?? [], + }; + + useEffect(() => { + window.scrollTo(0, 0); + }, []); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_RESTAURANTS_DETAIL); + }, []); + useEffect(() => { + if (data?.restaurant && (!isOpen || !data?.restaurant?.isAvailable)) { + toggleCloseModal(); + } + }, [data?.restaurant]); + + const toggleVariationModal = useCallback(() => { + setVariationModal((prev) => !prev); + }, []); + + const toggleReviewModal = useCallback(() => { + setReviewModal((prev) => !prev); + }, []); + + const toggleCloseModal = useCallback(() => { + setIsClose((prev) => !prev); + }, []); + + const isOpen = useCallback(() => { + if (data) { + if (data.restaurant.openingTimes.length < 1) return false; + const date = new Date(); + const day = date.getDay(); + const hours = date.getHours(); + const minutes = date.getMinutes(); + const todaysTimings = data.restaurant.openingTimes.find( + (o) => o.day === DAYS[day] + ); + if (todaysTimings === undefined) return false; + const times = todaysTimings.times.filter( + (t) => + hours >= Number(t.startTime[0]) && + minutes >= Number(t.startTime[1]) && + hours <= Number(t.endTime[0]) && + minutes <= Number(t.endTime[1]) + ); + + return times.length > 0; + } else return false; + }, [data]); + + const addFoodToCart = async (food) => { + if (!restaurantInfo.isAvailable || !isOpen()) { + toggleCloseModal(); + return; + } + if (!restaurantCart || food.restaurant === restaurantCart) { + await addToCart(food, food.restaurant !== restaurantCart); + } + }; + + const addToCart = async (food, clearFlag) => { + if ( + food.variations.length === 1 && + food.variations[0].addons.length === 0 + ) { + await setCartRestaurant(food.restaurant); + const result = checkItemCart(food._id); + if (result.exist) await addQuantity(result.key); + else + await addCartItem(food._id, food.variations[0]._id, 1, [], clearFlag); + } else { + if (clearFlag) await clearCart(); + setAddonData({ + food, + addons: data?.restaurant.addons, + options: data?.restaurant.options, + restaurant: data?.restaurant._id, + }); + toggleVariationModal(); + } + await Analytics.track(Analytics.events.ADD_TO_CART, { + title: food.title, + restaurantName: food.restaurantName, + variations: food.variations, + }); + }; + + const showMessage = useCallback((messageObj) => { + setMainError(messageObj); + }, []); + + const toggleSnackbar = useCallback(() => { + setMainError({}); + }, []); + + if (loading || error) { + return ( + <div style={{ backgroundColor: theme.palette.grey[200] }}> + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + </Grid> + <Subheader /> + <Grid container style={{ display: "flex" }}> + <Grid item lg={9} xs={12}> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + }} + > + <Box + className={classes.imageContainer} + style={{ + backgroundImage: `url('${restaurantInfo?.image ?? ""}')`, + }} + /> + <Box style={{ backgroundColor: theme.palette.common.white }}> + <RestaurantHeader headerData={restaurantInfo} loading /> + </Box> + <Divider orientation="horizontal" light /> + </Container> + <Box className={classes.spinnerContainer}> + {error ? ( + <Typography>Unable to fetch data {error.message}</Typography> + ) : ( + <CircularProgress color="primary" size={48} /> + )} + </Box> + </Grid> + </Grid> + <Box style={{ backgroundColor: theme.palette.common.white }}> + <Footer /> + </Box> + </div> + ); + } + + return ( + <> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + handleClose={toggleSnackbar} + /> + <div + style={{ + backgroundColor: theme.palette.grey[200], + scrollBehavior: "smooth", + }} + > + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + </Grid> + <Subheader /> + <Grid + container + style={{ display: "flex", flexDirection: "row-reverse" }} + > + {!isTablet && <RestaurantCart showMessage={showMessage} />} + <Grid item lg={9} xs={12}> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + }} + > + <Box + className={classes.imageContainer} + style={{ + backgroundImage: `url('${restaurantInfo?.image ?? ""}')`, + }} + /> + <Box style={{ backgroundColor: theme.palette.common.white }}> + <RestaurantHeader + toggleModal={toggleReviewModal} + headerData={headerData} + /> + </Box> + <Divider orientation="horizontal" light /> + </Container> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + position: "sticky", + zIndex: 1200, + top: "140px", + display: "flex", + }} + > + <div className={classes.tabContainer}> + <Container style={{ marginLeft: "0px" }}> + <Scrollspy + offset={-220} + className={classes.scrollpyStyles} + items={deals.map((item) => item._id)} + currentClassName={classes.active} + > + {deals.map((item, index) => ( + <li + key={`STICKY_${index}`} + className={classes.tabListStyle} + > + <Link + to={item._id} + spy={true} + smooth={true} + className={classes.anchorStyle} + offset={-220} + > + <Typography className={classes.tabTextStyle}> + {item.title} + </Typography> + </Link> + </li> + ))} + </Scrollspy> + </Container> + </div> + </Container> + <Container + maxWidth="xl" + style={{ + marginLeft: "0px", + paddingLeft: "0px", + paddingRight: "0px", + }} + > + {deals.map((item, index) => ( + <section key={`SECTION_${index}`} id={item._id}> + <ItemCard + {...item} + onPress={addFoodToCart} + restaurant={{ + restaurant: restaurantInfo._id, + restaurantName: restaurantInfo.name, + deliveryCharges: restaurantInfo.deliveryCharges, + }} + /> + </section> + ))} + </Container> + </Grid> + </Grid> + <Box style={{ backgroundColor: theme.palette.common.white }}> + <Footer /> + </Box> + <RestaurantClose + isVisible={isClose} + toggleModal={toggleCloseModal} + restaurant={restaurantInfo.name} + /> + <VariationModal + isVisible={variationModal} + toggleModal={toggleVariationModal} + data={addonData} + /> + <RestaurantInfo + isVisible={reviewModal} + toggleModal={toggleReviewModal} + restaurantInfo={restaurantInfo} + /> + {isTablet && cart.length && ( + <MRestaurantCart showMessage={showMessage} /> + )} + </div> + </> + ); +} + +export default RestaurantDetail; diff --git a/enatega-multivendor-web/src/screens/Restaurants/Restaurants.js b/enatega-multivendor-web/src/screens/Restaurants/Restaurants.js new file mode 100644 index 0000000..0b921a1 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Restaurants/Restaurants.js @@ -0,0 +1,231 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { gql, useQuery } from "@apollo/client"; +import { + Box, + CircularProgress, + Grid, + Typography, + useMediaQuery, + useTheme, +} from "@mui/material"; + +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useNavigate } from "react-router"; +import { restaurantList } from "../../apollo/server"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import { ClearCart } from "../../components/Modals"; + +import { + RestaurantGrid, + RestaurantRow, + Subheader, +} from "../../components/RestaurantComponent"; + +import SearchContainer from "../../components/HomeScreen/SearchContainer/SearchContainer"; +import { useLocationContext } from "../../context/Location"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import DetailedOrderCard from "../../components/Orders/DetailedOrderCard/DetailedOrderCard"; +import { ACTIVE_STATUS } from "../../utils/constantValues"; +import TawkMessengerReact from "@tawk.to/tawk-messenger-react"; + +const RESTAURANTS = gql` + ${restaurantList} +`; + +function Restaurants() { + const navigate = useNavigate(); + const { location } = useLocationContext(); + const [message, setMessage] = useState({}); + const [search, setSearch] = useState(""); + const { isLoggedIn } = useContext(UserContext); + const [clearModal, setClearModal] = useState(false); + const [navigateData, setNavigateData] = useState({}); + const classes = useStyles(); + const { + orders, + clearCart, + restaurant: cartRestaurant, + } = useContext(UserContext); + const theme = useTheme(); + const mobile = useMediaQuery(theme.breakpoints.down("sm")); + const activeOrders = orders.filter((o) => + ACTIVE_STATUS.includes(o.orderStatus) + ); + const navigateClearCart = useCallback(async () => { + await clearCart(); + navigate(`/restaurant/${navigateData.slug}`, { state: navigateData }); + }, [navigateData]); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_RESTAURANTS); + }, []); + const checkCart = useCallback( + (id, name, image, slug) => { + if (cartRestaurant && id !== cartRestaurant) { + setNavigateData({ id, name, image, slug }); + toggleClearCart(); + return false; + } + return true; + }, + [cartRestaurant] + ); + + const toggleClearCart = useCallback(() => { + setClearModal((prev) => !prev); + }, []); + + const showMessage = useCallback((messageObj) => { + setMessage(messageObj); + }, []); + const toggleSnackbar = useCallback(() => { + setMessage({}); + }, []); + + const { data, loading, error } = useQuery(RESTAURANTS, { + variables: { + longitude: location?.longitude || null, + latitude: location?.latitude || null, + ip: null, + }, + fetchPolicy: "network-only", + skip: !location, + }); + + if (loading || error) { + return ( + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + + <Box className={classes.spinnerContainer}> + {loading ? ( + <CircularProgress color="primary" size={48} /> + ) : ( + <Typography>Unable to load data</Typography> + )} + </Box> + </Grid> + ); + } + const { restaurants, sections } = data?.nearByRestaurants ?? { + restaurants: [], + sections: [], + }; + const restaurantSections = sections.map((sec) => ({ + ...sec, + restaurants: sec.restaurants + .map((id) => restaurants.filter((res) => res._id === id)) + .flat(), + })); + + const searchRestaurants = (searchText) => { + const data = []; + restaurants.forEach((restaurant) => { + const regex = new RegExp( + searchText.replace(/[\\[\]()+?.*]/g, (c) => "\\" + c), + "i" + ); + const result = restaurant.name.search(regex); + if (result < 0) { + const result = restaurant.categories.some((category) => { + const result = category.title.search(regex); + if (result < 0) { + const result = category.foods.some((food) => { + const result = food.title.search(regex); + return result > -1; + }); + return result; + } + return true; + }); + if (!result) return; + } + data.push(restaurant); + }); + return data; + }; + return ( + <Grid container> + <TawkMessengerReact + propertyId="5d0f4f6b36eab9721118c84e" + widgetId="1ftnb355n" + customStyle={{ + color: "red", + }} + /> + <FlashMessage + open={Boolean(message.type)} + severity={message.type} + alertMessage={message.message} + handleClose={toggleSnackbar} + /> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + <Box className={classes.searchWrapper}> + <Grid container item> + <SearchContainer + loading={loading} + isHome={false} + search={search} + setSearch={setSearch} + /> + </Grid> + </Box> + {activeOrders.length > 0 ? ( + <Box + style={{ + backgroundColor: theme.palette.button.lightest, + padding: mobile ? "10px" : "80px 90px", + width: "100%", + }} + > + <Grid container spacing={2}> + {activeOrders.map((item) => ( + <Grid key={item.id} item sm={12} xl={6} lg={6}> + {mobile ? null : <DetailedOrderCard key={item._id} {...item} />} + </Grid> + ))} + </Grid> + </Box> + ) : null} + {restaurantSections.length < 1 ? null : ( + <Box className={classes.topRestContainer}> + <Box className={classes.topRestWrapper}> + <Grid container item> + <RestaurantRow + checkCart={checkCart} + restaurantSections={restaurantSections} + showMessage={showMessage} + /> + </Grid> + </Box> + </Box> + )} + + <Box style={{ width: "100%", minHeight: "100vh" }}> + <RestaurantGrid + checkCart={checkCart} + restaurants={search ? searchRestaurants(search) : restaurants} + showMessage={showMessage} + search={search} + /> + </Box> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + <ClearCart + isVisible={clearModal} + toggleModal={toggleClearCart} + action={navigateClearCart} + /> + </Grid> + ); +} + +export default Restaurants; diff --git a/enatega-multivendor-web/src/screens/Restaurants/styles.js b/enatega-multivendor-web/src/screens/Restaurants/styles.js new file mode 100644 index 0000000..0b57b33 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Restaurants/styles.js @@ -0,0 +1,83 @@ +import makeStyles from "@mui/styles/makeStyles"; +import bg from "../../assets/images/img-map-background.jpeg"; + +const useStyles = makeStyles((theme) => ({ + marginHeader: { + marginTop: "200px", + }, + spinnerContainer: { + flexDirection: "row", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + height: "100vh", + marginTop: "100px", + }, + mapGrid: { + height: "200px", + width: "100%", + }, + mapImage: { + backgroundImage: `url(${bg})`, + backgroundPosition: "center", + backgroundSize: "cover", + backgroundRepeat: "no-repeat", + marginLeft: "8%", + marginTop: "20px", + height: "150px", + width: "80%", + borderRadius: "10px", + }, + mapText: { + marginLeft: "20px", + marginTop: "20px", + }, + mapButton: { + background: theme.palette.primary.main, + color: theme.palette.common.white, + fontWeight: "bold", + marginLeft: "20px", + boxShadow: `0 0 5px ${theme.palette.grey[300]}`, + "&:hover": { + background: theme.palette.success.main, + }, + }, + searchWrapper: { + width: "100%", + marginTop: "-26px", + }, + topRestContainer: { + backgroundColor: theme.palette.button.lightest, + borderRadius: "0px", + width: "100%", + paddingBottom: 10, + }, + topRestWrapper: { + background: theme.palette.button.dark, + width: "90%", + minHeight: "60vh", + borderTopRightRadius: "5rem", + borderBottomRightRadius: "5rem", + display: "flex", + alignItems: "center", + position: "relative", + [theme.breakpoints.down("md")]: { + width: "100%", + }, + }, + footerContainer: { + background: theme.palette.success.dark, + width: "100%", + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Restaurants/temp.js b/enatega-multivendor-web/src/screens/Restaurants/temp.js new file mode 100644 index 0000000..78d628e --- /dev/null +++ b/enatega-multivendor-web/src/screens/Restaurants/temp.js @@ -0,0 +1,206 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { gql, useQuery } from "@apollo/client"; +import { Box, CircularProgress, Grid, Typography, Button } from "@mui/material"; +import React, { useCallback, useContext, useEffect, useState } from "react"; +import { useNavigate } from "react-router"; +import { restaurantList } from "../../apollo/server"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import { ClearCart } from "../../components/Modals"; +import { + RestaurantGrid, + RestaurantRow, + SearchRestaurant, + Subheader, +} from "../../components/RestaurantComponent"; +import { useLocationContext } from "../../context/Location"; +import ActiveOrder from "../../components/Orders/ActiveOrder/Card/ActiveOrder"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import DeliveryTabs from "../../components/Tabs/Tabs"; + +const RESTAURANTS = gql` + ${restaurantList} +`; + +function Restaurants() { + const navigate = useNavigate(); + const { location } = useLocationContext(); + const [message, setMessage] = useState({}); + const [search, setSearch] = useState(""); + const { isLoggedIn } = useContext(UserContext); + const [clearModal, setClearModal] = useState(false); + const [navigateData, setNavigateData] = useState({}); + const classes = useStyles(); + const { clearCart, restaurant: cartRestaurant } = useContext(UserContext); + const [active, setActive] = useState("delivery"); + + const navigateClearCart = useCallback(async () => { + await clearCart(); + navigate(`/restaurant/${navigateData.slug}`, { state: navigateData }); + }, [navigateData]); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_RESTAURANTS); + }, []); + const checkCart = useCallback( + (id, name, image, slug) => { + if (cartRestaurant && id !== cartRestaurant) { + setNavigateData({ id, name, image, slug }); + toggleClearCart(); + return false; + } + return true; + }, + [cartRestaurant] + ); + + const toggleClearCart = useCallback(() => { + setClearModal((prev) => !prev); + }, []); + + const showMessage = useCallback((messageObj) => { + setMessage(messageObj); + }, []); + const toggleSnackbar = useCallback(() => { + setMessage({}); + }, []); + + const { data, loading, error } = useQuery(RESTAURANTS, { + variables: { + longitude: location?.longitude || null, + latitude: location?.latitude || null, + ip: null, + }, + fetchPolicy: "network-only", + skip: !location, + }); + + if (loading || error) { + return ( + <Grid container> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + <Grid container item className={classes.marginHeader}> + <SearchRestaurant search={""} setSearch={() => {}} /> + </Grid> + <Box className={classes.spinnerContainer}> + {loading ? ( + <CircularProgress color="primary" size={48} /> + ) : ( + <Typography>Unable to load data </Typography> + )} + </Box> + </Grid> + ); + } + const { restaurants, sections } = data?.nearByRestaurants ?? { + restaurants: [], + sections: [], + }; + const restaurantSections = sections.map((sec) => ({ + ...sec, + restaurants: sec.restaurants + .map((id) => restaurants.filter((res) => res._id === id)) + .flat(), + })); + + const searchRestaurants = (searchText) => { + const data = []; + restaurants.forEach((restaurant) => { + const regex = new RegExp( + searchText.replace(/[\\[\]()+?.*]/g, (c) => "\\" + c), + "i" + ); + const result = restaurant.name.search(regex); + if (result < 0) { + const result = restaurant.categories.some((category) => { + const result = category.title.search(regex); + if (result < 0) { + const result = category.foods.some((food) => { + const result = food.title.search(regex); + return result > -1; + }); + return result; + } + return true; + }); + if (!result) return; + } + data.push(restaurant); + }); + return data; + }; + + const activeTabChange = () => { + setActive("delivery"); + }; + const inactiveTabChange = () => { + setActive("pickup"); + }; + + const Map = () => { + return ( + <Grid className={classes.mapImage}> + <h3 className={classes.mapText}>Explore restaurants around you</h3> + <Button + className={classes.mapButton} + onClick={() => navigate("/pickup")} + > + Show map + </Button> + </Grid> + ); + }; + + return ( + <Grid container> + <FlashMessage + open={Boolean(message.type)} + severity={message.type} + alertMessage={message.message} + handleClose={toggleSnackbar} + /> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Subheader /> + + <Grid container item className={classes.marginHeader}> + <DeliveryTabs + active={active} + activeTabChange={activeTabChange} + inactiveTabChange={inactiveTabChange} + /> + {active === "pickup" && <Map />} + <SearchRestaurant search={search} setSearch={setSearch} /> + </Grid> + <Grid container item> + <ActiveOrder /> + </Grid> + {search ? null : ( + <Grid container item> + <RestaurantRow + checkCart={checkCart} + restaurantSections={restaurantSections} + showMessage={showMessage} + /> + </Grid> + )} + <Grid container item> + <RestaurantGrid + checkCart={checkCart} + restaurants={search ? searchRestaurants(search) : restaurants} + showMessage={showMessage} + /> + </Grid> + <Footer /> + <ClearCart + isVisible={clearModal} + toggleModal={toggleClearCart} + action={navigateClearCart} + /> + </Grid> + ); +} + +export default Restaurants; diff --git a/enatega-multivendor-web/src/screens/Settings/Settings.js b/enatega-multivendor-web/src/screens/Settings/Settings.js new file mode 100644 index 0000000..bc1474c --- /dev/null +++ b/enatega-multivendor-web/src/screens/Settings/Settings.js @@ -0,0 +1,43 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Grid, Typography } from "@mui/material"; +import React, { useEffect, useContext } from "react"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import useStyles from "./styles"; +import Analytics from "../../utils/analytics"; +import FavouritesBg from "../../assets/images/fav-bg.png"; +import ProfileImage from "../../assets/images/profile.png"; +import UserContext from "../../context/User"; +import LanguageCard from "../../components/Language/LanguageCard"; + +function Settings() { + const { profile } = useContext(UserContext); + const classes = useStyles(); + useEffect(async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_PROFILE); + }, []); + return ( + <Grid container className={classes.root}> + <Header /> + <Box className={classes.topContainer}> + <Typography variant="h2" align="center" style={{ zIndex: 9999 }}> + {profile && profile?.name[0].toUpperCase()} + </Typography> + <Box style={{ zIndex: 100, position: "absolute" }}> + <img src={ProfileImage} alt="fav" /> + </Box> + <img src={FavouritesBg} alt="fav-bg" className={classes.bg} /> + </Box> + <Grid container item className={classes.marginHeader}> + <LanguageCard /> + </Grid> + <Box className={classes.footerContainer}> + <Box className={classes.footerWrapper}> + <Footer /> + </Box> + </Box> + </Grid> + ); +} + +export default Settings; \ No newline at end of file diff --git a/enatega-multivendor-web/src/screens/Settings/styles.js b/enatega-multivendor-web/src/screens/Settings/styles.js new file mode 100644 index 0000000..045ffd9 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Settings/styles.js @@ -0,0 +1,66 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + "& .MuiTextField-root": { + marginBottom: theme.spacing(3), + }, + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey[200], + }, + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + "& .MuiButton-contained": { + borderRadius: "0px", + height: "50px", + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main, + }, + }, + backgroundColor: theme.palette.primary.dark, + }, + marginHeader: { + marginTop: "140px", + }, + topContainer: { + marginTop: "210px", + width: "100%", + display: "flex", + justifyContent: "center", + alignItems: "center", + position: "relative", + }, + bg: { + position: "absolute", + left: "-100px", + [theme.breakpoints.down("md")]: { + left: "-50px", + }, + maxWidth: "100%", + }, + footerContainer: { + background: theme.palette.primary.dark, + width: "100%", + marginTop: 100, + }, + footerWrapper: { + backgroundColor: theme.palette.primary.main, + width: "90%", + display: "flex", + marginLeft: "auto", + borderTopLeftRadius: "5rem", + borderBottomLeftRadius: "5rem", + }, +})); + +export default useStyles; \ No newline at end of file diff --git a/enatega-multivendor-web/src/screens/Stripe/Stripe.js b/enatega-multivendor-web/src/screens/Stripe/Stripe.js new file mode 100644 index 0000000..7adcde2 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Stripe/Stripe.js @@ -0,0 +1,157 @@ +/* eslint-disable react-hooks/exhaustive-deps */ + +import { useQuery } from "@apollo/client"; +import { + Box, + Button, + CircularProgress, + Grid, + Typography, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { useEffect, useState } from "react"; +import { useLocation } from "react-router"; +import { orderStripe } from "../../apollo/server"; +import MastercardIcon from "../../assets/icons/MastercardIcon"; +import VisaIcon from "../../assets/icons/VisaIcon"; +import FlashMessage from "../../components/FlashMessage"; +import Footer from "../../components/Footer/Footer"; +import { Header } from "../../components/Header"; +import { PaymentOrderCard } from "../../components/Orders"; +import ConfigurableValues from "../../config/constants"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; + +const ORDER_STRIPE = gql` + ${orderStripe} +`; + + +function Stripe() { + const { SERVER_URL } = ConfigurableValues(); + const classes = useStyles(); + const theme = useTheme(); + let query = new URLSearchParams(useLocation().search); + const id = query.get("id") ?? null; + const [loader] = useState(false); + const [mainError] = useState({}); + const { data, loading, error } = useQuery(ORDER_STRIPE, { + variables: { + id: id, + }, + }); + + const redirectToStripeCheckout = () => { + window.location.href = `${SERVER_URL}stripe/create-checkout-session?id=${order.orderId}&platform=web`; + }; + + useEffect(() => { + const trackEvent = async () => { + await Analytics.track(Analytics.events.NAVIGATE_TO_STRIPE); + }; + trackEvent(); + }, []); + + if (error) { + return ( + <Grid container className={classes.root}> + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + <Box + display="flex" + justifyContent="center" + alignItems="center" + flex={1} + style={{ maxWidth: "auto", width: "100%", minHeight: "55vh" }} + > + <Typography variant="h5">{error.message}</Typography> + </Box> + </Grid> + </Grid> + ); + } + + const order = data && data.orderStripe; + + return ( + <Grid container className={classes.root}> + <FlashMessage + open={Boolean(mainError.type)} + severity={mainError.type} + alertMessage={mainError.message} + /> + <Header /> + <Grid + container + item + className={classes.mainContainer} + justifyContent="center" + > + {loading || loader ? ( + <Box + display="flex" + alignItems="center" + justifyContent="center" + className={classes.spinnerContainer} + > + <CircularProgress size={48} /> + </Box> + ) : ( + <> + {order && <PaymentOrderCard {...order} />} + <Box + display="flex" + justifyContent="center" + alignItems="center" + flex={1} + style={{ + maxWidth: "auto", + width: "100%", + marginTop: "50px", + }} + > + <Box + style={{ + width: "100%", + height: "auto", + textAlign: "center", + }} + > + <Button + className={classes.btn} + variant="contained" + color="primary" + onClick={redirectToStripeCheckout} + > + <Box display="flex" alignItems="center"> + <Typography + variant="h6" + color="textPrimary" + style={{ fontWeight: "bold" }} + > + {"Stripe"} + </Typography> + </Box> + <Box display="flex"> + <VisaIcon width={50} height={40} /> + <Box ml={theme.spacing(1)} /> + <MastercardIcon width={50} height={40} /> + </Box> + </Button> + </Box> + </Box> + </> + )} + </Grid> + <Footer /> + </Grid> + ); +} + +export default React.memo(Stripe); diff --git a/enatega-multivendor-web/src/screens/Stripe/styles.js b/enatega-multivendor-web/src/screens/Stripe/styles.js new file mode 100644 index 0000000..027ee8a --- /dev/null +++ b/enatega-multivendor-web/src/screens/Stripe/styles.js @@ -0,0 +1,33 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + root: { + background: theme.palette.grey[100], + minHeight: "100vh", + }, + mainContainer: { + marginTop: "70px", + padding: theme.spacing(6, 0), + justifyContent: "center", + background: theme.palette.grey[100], + }, + link: { + textDecoration: "none", + }, + btn: { + backgroundColor: theme.palette.button.light, + minWidth: "50%", + height: "100%", + borderRadius: 5, + boxShadow: theme.shadows[0], + justifyContent: "space-between", + padding: theme.spacing(1.5), + border: `1px solid ${theme.palette.grey[300]}`, + "&:hover": { + backgroundColor: theme.palette.button.light, + opacity: 0.8, + }, + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Terms/Terms.js b/enatega-multivendor-web/src/screens/Terms/Terms.js new file mode 100644 index 0000000..2cd5774 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Terms/Terms.js @@ -0,0 +1,888 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import { Box, Grid, Typography } from "@mui/material"; +import clsx from "clsx"; +import React, { useContext, useEffect } from "react"; +import Footer from "../../components/Footer/Footer"; +import { Header, LoginHeader } from "../../components/Header"; +import UserContext from "../../context/User"; +import Analytics from "../../utils/analytics"; +import useStyle from "./styles"; + +function Terms() { + useEffect(async()=>{ + await Analytics.track(Analytics.events.NAVIGATE_TO_TERMS) + },[]) + const classes = useStyle(); + const { isLoggedIn } = useContext(UserContext); + return ( + <Grid className={classes.root}> + {isLoggedIn ? <Header /> : <LoginHeader showIcon />} + <Grid container className={classes.mainContainer}> + <Box className={classes.imageContainer}> + <Typography variant="h4" color="textPrimary" align="center" className={classes.title}> + TERMS AND CONDITIONS | ENATEGA + </Typography> + </Box> + <Grid container item xs={12} className={classes.mainContainer}> + <Grid item xs={1} md={1} /> + <Grid container item xs={10} sm={10} md={9}> + <ol className={classes.boldText}> + <Typography variant="subtitle2" className={classes.MV3}> + Published: 2021 + </Typography> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + TERMS OF USE + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + These Terms of Use (“<b>Terms</b>”) govern your use of the websites and mobile applications provided + by enatega (collectively the “<b>Platforms</b>”). Please read these Terms carefully. By accessing and + using the Platforms, you agree that you have read, understood and accepted the Terms including any + additional terms and conditions and any policies referenced herein, available on the Platforms or + available by hyperlink. If you do not agree or fall within the Terms, please do not use the Platforms. + </Typography> + <Typography variant="subtitle2"> + The Platforms may be used by (i) natural persons who have reached 18 years of age and (ii) corporate + legal entities, e.g companies. Where applicable, these Terms shall be subject to country-specific + provisions as set out herein. + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Users below the age of 18 must obtain consent from parent(s) or legal guardian(s), who by accepting + these Terms shall agree to take responsibility for your actions and any charges associated with your + use of the Platforms and/or purchase of Goods. If you do not have consent from your parent(s) or legal + guardian(s), you must stop using/accessing the Platforms immediately. + </Typography> + <Typography variant="subtitle2"> + Enatega reserves the right to change or modify these Terms (including our policies which are + incorporated into these Terms) at any time. You are strongly recommended to read these Terms + regularly. You will be deemed to have agreed to the amended Terms by your continued use of the + Platforms following the date on which the amended Terms are posted. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Enatega + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2">What we do</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + Through our Platforms, enatega links you to the vendors (“<b>Vendors</b>”) for you to order a + variety of goods including prepared meals, non-prepared food and miscellaneous non-food items + (hereinafter collectively referred to as "<b>Goods</b>") to be delivered to you. When you place an + order for Goods from our Vendors (“<b>Order</b>”), enatega acts as an agent on behalf of that + Vendor to facilitate, process and conclude the order and subsequently for either us or the Vendor + to deliver your Order to you. Vendors may be owned and operated by third party vendors, our + affiliate companies, or us. + </Typography> + </li> + <li> + <Typography variant="subtitle2">How to contact us</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + For customer support, you may reach out to us via email or through our in-app customer support + chat feature.{" "} + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={clsx(classes.boldText, classes.MV3)}> + Use of the Platforms and enatega Account + </Typography> + <Typography variant="subtitle2"> + You will need to register for a enatega account for you to use the Platform. When you register for a + enatega account we will ask you to provide your personal information including a valid email address, + a mobile phone number and a unique password. To purchase an Order, depending on which payment method + you opt for, you may need to provide us with your credit card details. Your unique password should not + be shared with anyone and you agree to keep it secret at all times. You are solely responsible for + keeping your password safe. Save for cases of fraud or abuse which are not your fault, you accept that + all Orders placed under your enatega account are your sole responsibility. + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + enatega shall not be liable for Orders that encounter delivery issues due to incomplete, incorrect or + missing information provided by you. You are obliged to provide information that is complete, accurate + and truthful for the proper processing of the Order, including your delivery address and contact + information. + </Typography> + <Typography variant="subtitle2"> + If you wish to delete your enatega account, please send us an email requesting the same. We may + restrict, suspend or terminate your enatega account and/or use of the Platforms, if we reasonably + believe that: + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + someone other than you is using your enatega account; or + </Typography> + <Typography variant="subtitle2"> + where you are suspected or discovered to have been involved in any activity or conduct that is in + breach of these Terms, our policies and guidelines, or involved in activity or conduct which we deem + in our sole discretion to be an abuse of the Platforms. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={clsx(classes.boldText, classes.MV3)}> + Restrictions + </Typography> + <Typography variant="subtitle2">Activities Prohibited on the Platforms</Typography> + <Typography variant="subtitle2" className={classes.MV3}> + In processing your order we may send your information to credit reference and fraud prevention + agencies. + </Typography> + <Typography variant="subtitle2"> + The following is a non-exhaustive list of the types of conduct that are illegal or prohibited on the + Platforms. Enatega reserves the right to investigate and take appropriate legal action against anyone + who, in enatega's sole discretion, engages in any of the prohibited activities. Prohibited activities + include, but are not limited to the following: + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2"> + using the Platforms for any purpose in violation of local, state, or federal laws or regulations; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting any content that infringes the intellectual property rights, privacy rights, publicity + rights, trade secret rights, or any other rights of any party; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting content that is unlawful, obscene, defamatory, threatening, harassing, abusive, + slanderous, hateful, or embarrassing to any other person or entity as determined by enatega in its + sole discretion or pursuant to local community standards; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting content that constitutes cyber-bullying, as determined by enatega in its sole discretion; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting content that depicts any dangerous, life-threatening, or otherwise risky behavior; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting telephone numbers, street addresses, or last names of any person; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting URLs to external websites or any form of HTML or programming code; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + posting anything that may be “spam,” as determined by enatega in its sole discretion; + </Typography> + </li> + <li> + <Typography variant="subtitle2">impersonating another person when posting content;</Typography> + </li> + <li> + <Typography variant="subtitle2"> + harvesting or otherwise collecting information about others, including e-mail addresses, without + their consent; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + allowing any other person or entity to use your identification for posting or viewing comments; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + harassing, threatening, stalking, or abusing any person on the Platforms; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + engaging in any other conduct that restricts or inhibits any other person from using or enjoying + the Websites, or which, in the sole discretion of enatega, exposes enatega or any of its + customers, suppliers, or any other parties to any liability or detriment of any type; or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + encouraging other people to engage in any prohibited activities as described herein. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + enatega reserves the right but is not obligated to do any or all of the following: + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + investigate an allegation that any content posted on the Platforms does not conform to these Terms + and determine in its sole discretion to remove or request the removal of the content; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + remove content which is abusive, illegal, or disruptive, or that otherwise fails to conform with + these Terms; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + suspend or terminate a user’s access to the Platforms or their enatega Account upon any breach of + these Terms; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + monitor, edit, or disclose any content on the Platforms; and + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + edit or delete any content posted on the Platforms, regardless of whether such content violates + these standards. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Intellectual Property + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + All trademarks, logos, images, and service marks, including these Terms as displayed on the Platforms + or in our marketing material, whether registered or unregistered, are the intellectual property of + enatega and/or third parties who have authorised us with the use (collectively the “<b>Trademarks</b> + ”). You may not use, copy, reproduce, republish, upload, post, transmit, distribute, or modify these + Trademarks in any way without our prior express written consent. The use of enatega's trademarks on + any other website not approved by us is strictly prohibited. Enatega will aggressively enforce its + intellectual property rights to the fullest extent of the law, including criminal prosecution. Enatega + neither warrants nor represents that your use of materials displayed on the Platforms will not + infringe rights of third parties not owned by or affiliated with enatega. Use of any materials on the + Platforms is at your own risk. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Restrictions on Goods + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2"> + Some of the Goods we offer on our Platforms are subject to restrictions for purchase (“ + <b>Restricted Goods</b>”) + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Alcohol / Alcoholic Products (“<b>Alcohol</b>”){" "} + </Typography> + <Typography variant="subtitle2" className={classes.MV2}> + To purchase Alcohol, you must be of the statutory legal age. Enatega, the Vendor and their + delivery riders, as the case may be, reserve the right in their sole discretion: + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + to ask for valid proof of age (e.g. ID card) to any persons before they deliver Alcohol; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + to refuse delivery if you are unable to prove you are of legal age; and/or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + to refuse delivery to any persons for any reason whatsoever. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Cigarettes/Tobacco Products (“<b>Tobacco</b>”) + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + We may offer Tobacco on some of our Platforms where the laws allow. By offering Tobacco for sale + on our Platforms, we do not purport to advertise, promote or encourage the purchase or use of + Tobacco in any way. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + To purchase Tobacco, you must be of the statutory legal age. Enatega, the Vendor and their + delivery riders, as the case may be, reserve the right in their sole discretion: + </Typography> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + to ask for valid proof of age (e.g. ID card) to any persons before they deliver Tobacco; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + to refuse delivery if you are unable to prove you are of legal age; and/or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + to refuse delivery to any persons for any reason whatsoever. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2"> + Any offer for any Alcohol and Tobacco made on the Platforms is void when it is prohibited by law. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Orders + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2"> + When you place an Order with enatega, enatega will confirm your order by sending you a + confirmation email containing the Order receipt. Where applicable, Orders will include delivery + fees and any applicable tax (e.g. goods and services tax, value-added tax, etc.). + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Minimum Order Value - Some of our Vendors require a minimum order value (“<b>MOV</b>”) before an + Order can be placed and delivered to you. Where an applicable Order fails to meet the MOV, you + will have the option of paying the difference to meet the MOV or to add more Goods to your Order. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Special Instructions – enatega and the Vendor (as the case may be) reasonably endeavour to comply + with your special instructions for an Order. However in some cases where this is not feasible, + possible or commercially reasonable, enatega and/or the Vendor reserve the right to proceed to + prepare the Order in accordance with standard operating procedures. Neither enatega nor the Vendor + shall be responsible to replace or refund an Order which does not conform to special instructions + provided by you. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Allergens – enatega is not obligated to provide ingredient information or allergen information on + the Platforms. Further, enatega does not guarantee that the Goods sold by Vendors are free of + allergens. If you have allergies, allergic reactions or dietary restrictions and requirements, + please contact the Vendor before placing an Order on our Platforms. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Please note that your Order may be subject to additional terms and conditions provided by the + Vendor. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Prior to placing the Order</Typography> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + You are required to provide the delivery address in order for the Platform to display the + Vendors available in your delivery area. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Once you select a Vendor, you will be taken to that Vendor’s menu page for you to select and + add your Goods to the cart. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2">Placing the Order</Typography> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + To complete an Order, please follow the onscreen instructions after clicking ‘Checkout’. You + may be required to provide additional details for us to complete your Order. You are required + to review and confirm that all the information you provide, including the amounts, delivery + details, personal details, payment information, and voucher codes (if applicable) is true, + accurate and complete before you click “PLACE ORDER”. An Order is successfully placed when you + receive an email confirmation containing your Order receipt from us. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2">Cancelling an Order</Typography> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + Please contact us immediately via our in-app customer support chat feature if you wish to + cancel your Order after it has been placed. You have the right to cancel your Order provided a + Vendor has not yet accepted your Order. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Refunds</Typography> + <ul> + <li> + <Typography variant="subtitle2">Online Payment Orders</Typography> + <Typography variant="subtitle2"> + You have the right to a refund for a cancelled Order only if a Vendor has not yet accepted + your Order. Should you still decide to cancel your Order after it has been accepted by the + Vendor, you understand that no refunds (whether in whole or in part) will be issued to you + and you forfeit the delivery of your cancelled Order. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Cash-on-Delivery Orders </Typography> + <Typography variant="subtitle2"> + You have the right to cancel your Order only if a Vendor has not yet accepted your Order. + Should you still decide to cancel your Order after it has been accepted by the Vendor, you + understand that you shall forfeit the delivery of your cancelled Order and + cash-on-delivery may be removed from your list of available payment methods for your + future orders. + </Typography> + </li> + </ul> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2"> + Enatega reserves the right to cancel any Order and/or suspend, deactivate or terminate your + enatega account in its sole discretion if it reasonably suspects or detects fraudulent behavior or + activity associated with your enatega account and/or with your Order.{" "} + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Prices and Payments + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2"> + Prices quoted on the Platform shall be displayed in the applicable country’s national currency and + subject to applicable tax. Prices and offers on the Platforms may vary from the prices and you + accept that offers offered by our Vendors (either on their own websites, mobile applications, or + at their brick-and-mortar outlets). + </Typography> + </li> + <li> + <Typography variant="subtitle2">include TAX, VAT or such other equivalent tax; or</Typography> + </li> + <li> + <Typography variant="subtitle2">exclude TAX, VAT or such other equivalent tax.</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + A breakdown of the prices and additional charges are displayed before Checkout. When you place an + Order, you agree to all amounts, additional charges and the final ‘Total’ amount which is + displayed to you.{" "} + </Typography> + </li> + <li> + <Typography variant="subtitle2">Delivery fees are chargeable on every Order unless:</Typography> + </li> + <li> + <Typography variant="subtitle2"> + you opt to collect your Order directly from the Vendor (“<b>Pick-Up</b>”); + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + you have a valid promotional or discount voucher and apply it at Checkout; or + </Typography> + </li> + <li> + <Typography variant="subtitle2">unless stated otherwise.</Typography> + </li> + <li> + <Typography variant="subtitle2"> + Prices indicated on the Platforms are as at the time of each Order and may be subject to change. + </Typography> + <li> + <Typography variant="subtitle2"> + You can choose to pay for an Order using any of the different payment methods offered on the + Platforms including: + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Our payment partners: Visa, Mastercard, American Express, Google Pay, PayPal, Apple Pay; + </Typography> + </li> + <li> + <Typography variant="subtitle2">Cash-on-Delivery; or</Typography> + </li> + </li> + <li> + <Typography variant="subtitle2">Such other payment method we offer from time to time.</Typography> + </li> + <li> + <Typography variant="subtitle2"> + If you have existing credit in your enatega account or valid promotional or discount vouchers, you + can use this pay for part or all of your Order as the case may be. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + After an Order is successfully placed, you will receive an email confirmation from us with your + Order receipt. Delivery fees will not appear in your Order receipt if you opt for Pick-Up. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Payment Methods</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + Enatega reserves the right to offer additional payment methods and/or remove existing payment + methods at anytime in its sole discretion. If you choose to pay using an online payment method, + the payment shall be processed by our third party payment service provider(s). With your consent, + your credit card / payment information will be stored with our third party payment service + provider(s) for future orders. Enatega does not store your credit card or payment information. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + You must ensure that you have sufficient funds on your credit and debit card to fulfil payment of + an Order. Insofar as required, enatega takes responsibility for payments made on our Platforms + including refunds, chargebacks, cancellations and dispute resolution, provided if reasonable and + justifiable and in accordance with these Terms. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Delivery, Pick-Up and Vendor Delivery + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2">Delivery Areas</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + You understand that our Vendors offer their Goods in specific delivery areas and our Vendors vary + from delivery area to delivery area. By entering your delivery address on the Platforms, you will + see the Vendors that we make available to you at that time. Delivery areas may expand, shrink or + change depending on weather and traffic conditions and situations of force majeure.{" "} + </Typography> + </li> + <li> + <Typography variant="subtitle2">Delivery Time</Typography> + </li> + <li> + <Typography variant="subtitle2"> + Enatega shall deliver your Order to the delivery address provided by You. You may choose for your + Order to be delivered “ASAP” or scheduled for a specific time. An estimated delivery time will be + provided to you in your email confirmation but delivery times shall vary depending on factors that + are not controlled by us (e.g. order quantity, distance, time of day (peak periods), weather + conditions, traffic conditions, etc.). You can view the remaining delivery time of an Order when + you click on ‘My orders’ on the Platforms. You acknowledge that the delivery time we provide is + only an estimate and Orders may arrive earlier or later. To ensure that you do not miss a delivery + of an Order, you should ensure that either you or someone is at the delivery location to receive + the Order once an Order is placed. If your Order contains Alcohol or Tobacco (if applicable) and + you or the recipient is or appears to be below the legal age, or fails to provide a valid proof of + ID, enatega reserves the right not to deliver your Order to you. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Unsuccessful or Failed Deliveries </Typography> + </li> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + In cases where we attempt to deliver an Order but we are unable to do so due to the reasons + caused by you, including but not limited to: + </Typography> + <ul> + <li> + <Typography variant="subtitle2"> + no one was present or available to receive the Order; or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + customer was uncontactable despite attempts to reach the customer via the phone number + provided; or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + lack of appropriate or sufficient access to deliver the Order successfully; + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + lack of a suitable or secure location to leave the Order; or + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + in the case of Restricted Goods, customer did not meet the statutory age requirements or + delivery did not deem it safe or appropriate for the customer to receive the Restricted + Goods. + </Typography> + </li> + </ul> + <li> + <Typography variant="subtitle2">No-show Cancellations</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + If you remain uncontactable or fail to receive the Order within ten (10) minutes from the time + the Order arrives at your delivery address, enatega reserves the right to cancel the Order + without refund or remedy to you. + </Typography> + </li> + </li> + </ul> + <li> + <Typography variant="subtitle2">Wrong Order, Missing Items, Defective Goods</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + Upon receipt of your Order, if you discover that there are issues with your Order (e.g. wrong + order, defective order, or missing items) please contact customer support via one of the methods + indicated in Clause 1.3 above immediately. In some cases, enatega may request for photographic + proof and/or additional information to properly investigate the issue with your Order. If we + determine that the Order and/or Goods you received are not of satisfactory condition or quality, + we will compensate you for your Order or parts of your Order. + </Typography> + <li> + <Typography variant="subtitle2">Order Pick-Up</Typography> + </li> + <ul className={classes.circle}> + <li> + <Typography variant="subtitle2"> + Where available, you will have the option of collecting your Order in-person directly from the + Vendor’s premises ("<b>Pick-Up</b>") instead of having the Order delivered to You. Your email + confirmation will indicate the time for you to Pick-Up the Order (“Collection Time”). The + Vendor will prepare the Order by the Collection Time. In some cases, a reasonable delay may be + expected. The Vendor agrees to hold the Order for you at the Vendor’s premises for no more + than a reasonable period of twenty (20) minutes from the Collection Time (“<b>Holding Time</b> + ”) and shall not be obliged to provide the Order to you if you fail to Pick-Up your Order + within the Holding Time. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + In the event of unreasonable delays in Pick-Up attributable to you, you bear the risk of any + damage or loss of Goods or any deterioration in quality or change in condition of the Goods + (e.g. changes in the temperature fit for consumption). In this case, you shall not be entitled + to a replacement, refund or replacement of the Goods. You alone are responsible for inspecting + the Goods/Order when you Pick-Up your Order and shall report any issues and/or defects to the + Vendor before leaving the Vendor’s premises. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2">Vendor Delivery</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + In some cases, our Vendors will deliver the Order to you (“Vendor Delivery”). While we will use + reasonable efforts to provide prior notice to you on Vendor Delivery, this may not always be + possible. Where Vendor Delivery applies, we may ask you to contact the Vendor directly in the + event of issues or delays in your delivery. Enatega shall not be responsible in any way for Orders + or Goods that are delivered by Vendors.{" "} + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Vouchers, Discounts and Promotions + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2"> + From time to time, enatega may run marketing and promotional campaigns which offer voucher codes, + discounts, and other promotional offers to be used on the Platforms (“<b>Vouchers</b>”). Vouchers + are subject to validity periods, redemption periods, and in certain cases, may only be used once. + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + Unless otherwise stated, Vouchers can only be used on our Platforms.{" "} + </Typography> + </li> + <li> + <Typography variant="subtitle2">Vouchers cannot be exchanged for cash.</Typography> + </li> + <li> + <Typography variant="subtitle2"> + Enatega reserves the right to void, discontinue or reject the use of any Voucher without prior + notice Individual restaurants terms & conditions apply + </Typography> + </li> + <li> + <Typography variant="subtitle2"> + We may exclude certain Vendors from the use of Vouchers at any time without prior notice to you. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Representations, Warranties and Limitation of Liabilities + </Typography> + <ul className={classes.bullet}> + <li> + <Typography variant="subtitle2">Representations and Warranties</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + You acknowledge and agree that the content on the Platforms are provided on an “as is” and “as + available” basis, and that your use of or reliance upon the Platforms and any content, goods, + products or services accessed or obtained thereby is at your sole risk and discretion. While + enatega makes reasonable efforts to ensure the provision of the Platforms and the services we + offer, are available at all times, we do not warrant or represent that the Platforms shall be + provided in a manner which is secure, timely, uninterrupted, error-free, free of technical + difficulties, defects or viruses. Please expect temporary interruptions of the Platform due to + scheduled or regular system maintenance work, downtimes attributable to internet or electronic + communications or events of force majeure. + </Typography> + <Typography variant="subtitle2">Limitation of Liability</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + To the extent permitted by law, enatega (which shall include its employees, directors, agents, + representatives, affiliates and parent company) exclude all liability (whether arising in + contract, in negligence or otherwise) for loss or damage which you or any third party may incur in + connection with our Platforms, our services, and any website linked to our Platforms and any + content or material posted on it. Your exclusive remedy with respect to your use of the Platforms + is to discontinue your use of the Platforms. The enatega entities, their agents, representatives, + and service providers shall not be liable for any indirect, special, incidental, consequential, or + exemplary damages arising from your use of the Platforms or for any other claim related in any way + to your use of the Platforms. These exclusions for indirect, special, consequential, and exemplary + damages include, without limitation, damages for lost profits, lost data, loss of goodwill, work + stoppage, work stoppage, computer failure, or malfunction, or any other commercial damages or + losses, even if the enatega entities, their agents, representatives, and service providers have + been advised of the possibility thereof and regardless of the legal or equitable theory upon which + the claim is based. Because some states or jurisdictions do not allow the exclusion or the + limitation of liability for consequential or incidental damages, in such states or jurisdictions, + enatega, the enatega entities, its agents, representatives and service providers' liability shall + be limited to the extent permitted by law. + </Typography> + </li> + <li> + <Typography variant="subtitle2">Vendor’s representations</Typography> + <Typography variant="subtitle2" className={classes.MV2}> + Enatega shall neither be liable for actions or omissions of the Vendor nor you in regard to + provision of the Goods and where Vendor Delivery applies to your Order. Enatega does not assume + any liability for the quantity, quality, condition or other representations of the Goods and/or + services provided by Vendors or guarantee the accuracy or completeness of the information + (including menu information, photos and images of the Goods) displayed on the Vendor’s + listing/offering on the Platform. Nothing in these Terms shall exclude Vendor’s liability for + death or personal injury arising from Vendor’s gross negligence or willful misconduct. + </Typography> + </li> + </ul> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Vendor Liability + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Vendors are responsible for the preparation, condition and quality of Goods. In cases of Vendor + Delivery, Vendors are responsible for delivery of the Goods and/or Orders. Enatega shall not be liable + for any loss or damage arising from your contractual relationship with the Vendor. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Personal Data (Personal Information) Protection + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + You agree and consent to enatega and any of its affiliate companies collecting, using, processing and + disclosing your Personal Data in accordance with these Terms and as further described in our Privacy + Policy. Our Privacy Policy is available via the links on our Platforms, and shall form a part of these + Terms. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Indemnity + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + You agree to indemnify, defend, hold harmless enatega, its directors, officers, employees, + representatives, agents, and affiliates, from any and all third party claims, liability, damages + and/or costs (including but not limited to, legal fees) arising from your use of the Platforms or your + breach of these Terms. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Third Party Links and Websites + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + The Platforms may contain links to other third party websites and by clicking on these links, you + agree to do so at your own risk. Enatega does not control or endorse these third party websites or + links and shall not be responsible for the content of these linked pages. Enatega accepts no liability + or responsibility for any loss or damage which may be suffered by you in relation to your access and + use of these third party links and websites. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Termination + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Enatega has the right to terminate, suspend or delete your account and access to the Platforms, + including any delivery service we provide to you in respect of an Order, for any reason, including, + without limitation, if enatega, in its sole discretion, considers your use to be unacceptable, or in + the event of any breach by you of the Terms. Enatega may, but shall be under no obligation to, provide + you a warning prior to termination of your use of the Websites. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Amendments + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + Enatega may amend these Terms at any time in its sole discretion. The amended Terms shall be effective + immediately upon posting and you agree to the new Terms by continued use of the Platforms. It is your + responsibility to check the Terms regularly. If you do not agree with the amended Terms, whether in + whole or in part, you must stop using the Platforms immediately. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Severability + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + If any provision of these Terms of Use is found to be invalid by any court having competent + jurisdiction, the invalidity of such provision shall not affect the validity of the remaining + provisions of these Terms of Use, which shall remain in full force and effect. No waiver of any + provision in these Terms of Use shall be deemed a further or continuing waiver of such provision or + any other provision. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Governing Law + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + These Terms shall be governed and construed in accordance with the laws of the country / courts of + jurisdiction. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Contact Us + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + If you wish to contact us regarding any questions or comments you may have, please send an email to + our customer support email or via our in-app customer support chat feature. + </Typography> + </li> + <li> + <Typography variant="subtitle2" className={classes.boldText}> + Prevailing Language + </Typography> + <Typography variant="subtitle2" className={classes.MV3}> + In the event of a dispute as to the Terms, the English version shall prevail. The English language + version of these Terms shall control in all respects and shall prevail in case of any inconsistencies + with translated versions. + </Typography> + </li> + </ol> + </Grid> + </Grid> + </Grid> + <Footer /> + </Grid> + ); +} + +export default React.memo(Terms); diff --git a/enatega-multivendor-web/src/screens/Terms/styles.js b/enatega-multivendor-web/src/screens/Terms/styles.js new file mode 100644 index 0000000..44d5b0f --- /dev/null +++ b/enatega-multivendor-web/src/screens/Terms/styles.js @@ -0,0 +1,55 @@ +import makeStyles from '@mui/styles/makeStyles'; + +const useStyles = makeStyles((theme) => ({ + mainContainer: { + display: "flex", + paddingTop: "70px", + minWidth: "100%", + backgroundColor: "transparent", + color: theme.palette.secondary.light, + }, + imageContainer: { + width: "100%", + height: "400px", + backgroundImage: + "url(https://images.deliveryhero.io/image/foodpanda/cms-hero.jpg?width=2000&height=500|https://images.deliveryhero.io/image/foodpanda/cms-hero.jpg?width=4000&height=1000)", + backgroundSize: "cover", + backgroundPositionX: "50%", + backgroundPositionY: "center", + display: "flex", + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + title: { + fontWeight: theme.typography.fontWeightBold, + textTransform: "uppercase", + }, + linkDecoration: { + textDecoration: "none", + alignSelf: "center", + }, + link: { + fontSize: 16, + }, + boldText: { + fontWeight: 600, + fontSize: "1rem", + }, + bullet: { + listStyleType: "disc", + margin: theme.spacing(3, 0), + }, + circle: { + listStyleType: "circle", + }, + MV3: { + width: "100%", + margin: theme.spacing(3, 0), + }, + MV2: { + margin: theme.spacing(2, 0), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/VerifyEmail/VerifyEmail.js b/enatega-multivendor-web/src/screens/VerifyEmail/VerifyEmail.js new file mode 100644 index 0000000..ceb475b --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyEmail/VerifyEmail.js @@ -0,0 +1,284 @@ +import { useMutation } from "@apollo/client"; +import { + Avatar, + Box, + Button, + CircularProgress, + Typography, + useTheme, +} from "@mui/material"; +import gql from "graphql-tag"; +import React, { + useCallback, + useEffect, + useRef, + useState, + useContext, +} from "react"; +import { Navigate, useLocation, useNavigate } from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import Analytics from "../../utils/analytics"; +import useStyles from "./styles"; +import VerifyEmailIcon from "../../assets/images/emailLock.png"; +import { LoginWrapper } from "../Wrapper"; +import { createUser, sendOtpToEmail } from "../../apollo/server"; +import UserContext from "../../context/User"; +import OtpInput from "react-otp-input"; +import { useTranslation } from 'react-i18next'; +import ConfigurableValues from "../../config/constants"; + +const SEND_OTP_TO_EMAIL = gql` + ${sendOtpToEmail} +`; +const CREATEUSER = gql` + ${createUser} +`; +function VerifyEmail() { + const { t } = useTranslation(); + const formRef = useRef(); + const theme = useTheme(); + const classes = useStyles(); + const navigate = useNavigate(); + const { state: user } = useLocation(); + const [error, setError] = useState(""); + const [loading, setLoading] = useState(false); + const { setTokenAsync } = useContext(UserContext); + const [otpError, setOtpError] = useState(false); + const [seconds, setSeconds] = useState(30); + const [otp, setOtp] = useState(""); + const { SKIP_EMAIL_VERIFICATION } = ConfigurableValues() + const handleBackNavigation = () => { + // Use history.push to navigate to the desired route + navigate("/registration"); + }; + + useEffect(() => { + // Add an event listener for the popstate event + window.addEventListener("popstate", handleBackNavigation); + + // Remove the event listener when the component unmounts + return () => { + window.removeEventListener("popstate", handleBackNavigation); + }; + }); + const [otpFrom, setOtpFrom] = useState( + Math.floor(100000 + Math.random() * 900000).toString() + ); + const [createUser, { loading: createLoading }] = useMutation(CREATEUSER, { + onCompleted: onCompletedCreate, + onError: onErrorCreate, + }); + const [sendOtp] = useMutation(SEND_OTP_TO_EMAIL, { + onCompleted: onCompletedOtp, + onError: onErrorOtp, + }); + + function onErrorOtp(e) { + setLoading(false); + setError(e.message); + } + + function onCompletedOtp(e) { + console.log("otp sent"); + } + + function onErrorCreate(e) { + setLoading(false); + setError(e.message); + } + async function onCompletedCreate({ createUser }) { + try { + await Analytics.identify( + { + userId: createUser.userId, + name: createUser.name, + email: createUser.email, + }, + createUser.userId + ); + await Analytics.track(Analytics.events.USER_CREATED_ACCOUNT, { + userId: createUser.userId, + name: createUser.name, + email: createUser.email, + }); + navigate("/", { + replace: true, + }); + setTokenAsync(createUser.token); + } catch (e) { + setError("Something went wrong"); + console.log(e); + } finally { + setLoading(false); + } + } + useEffect(() => { + sendOtp({ + variables: { email: user?.email, otp: otpFrom }, + }); + setSeconds(30); + }, [otpFrom, user?.email, sendOtp]); + + useEffect(() => { + const myInterval = setInterval(() => { + if (seconds > 0) { + setSeconds(seconds - 1); + } + if (seconds === 0) { + clearInterval(myInterval); + } + }, 1000); + return () => { + clearInterval(myInterval); + }; + }); + + const toggleSnackbar = useCallback(() => { + setError(""); + }, []); + + const onCodeFilled = useCallback((code) => { + if (SKIP_EMAIL_VERIFICATION || code === otpFrom) { + createUser({ + variables: { + phone: user.phone, + email: user.email, + password: user.password, + name: user.name, + picture: "", + }, + }); + } else { + setOtpError(true); + } + },[SKIP_EMAIL_VERIFICATION, createUser, otpFrom, user.email, user.name, user.password, user.phone]); + + const resendOtp = () => { + setOtpFrom(Math.floor(100000 + Math.random() * 900000).toString()); + }; + const handleCreateUser = useCallback((val) => { + setOtp(val); + if (val.length === 6) { + onCodeFilled(val); + } + },[onCodeFilled]); + + useEffect(()=>{ + let timer = null + if(!SKIP_EMAIL_VERIFICATION) return + setOtp('111111') + timer = setTimeout(()=>{ + handleCreateUser('111111') + },3000) + return ()=>{timer && clearTimeout(timer)} + },[SKIP_EMAIL_VERIFICATION,handleCreateUser]) + + return user?.email ? ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + handleClose={toggleSnackbar} + /> + + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={VerifyEmailIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + {createLoading ? ( + <CircularProgress color="primary" /> + ) : ( + <form ref={formRef}> + <Box mt={theme.spacing(2)} /> + <Typography variant="h5" className={classes.font700}> + {t('verifyEmail')} + </Typography> + <Box mt={theme.spacing(2)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + {t('enterOtp')} + </Typography> + <Box mt={theme.spacing(2)} /> + <OtpInput + value={otp} + onChange={handleCreateUser} + numInputs={6} + containerStyle={{ + width: "100%", + display: "flex", + alignSelf: "center", + backgroundColor: theme.palette.common.white, + }} + inputStyle={{ + width: 45, + height: 45, + margin: 5, + borderRadius: 5, + fontSize: theme.typography.h2, + border: `1px solid ${theme.palette.grey[400]}`, + boxShadow: theme.shadows[3], + }} + focusStyle={{ + outlineColor: theme.palette.grey[900], + }} + editable + renderInput={(props) => <input {...props} />} + /> + <Box mt={2} /> + {otpError && ( + <Typography variant={"h6"} style={{ color: "red", fontSize: 14 }}> + {t('invalidCode')} + </Typography> + )} + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + color="primary" + fullWidth + type="email" + disableElevation + className={classes.btnBase} + disabled={seconds !== 0} + onClick={(e) => { + e.preventDefault(); + resendOtp(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + {t('resendCode')} + </Typography> + )} + </Button> + <Box mt={theme.spacing(2)} /> + <Typography variant="caption" className={`${classes.caption}`}> + {seconds === 0 ? "" : `${t('retryAfter')} ${seconds}s`} + </Typography> + </form> + )} + </LoginWrapper> + ) : ( + <Navigate to="/login" /> + ); +} + +export default VerifyEmail; diff --git a/enatega-multivendor-web/src/screens/VerifyEmail/styles.js b/enatega-multivendor-web/src/screens/VerifyEmail/styles.js new file mode 100644 index 0000000..901b8cd --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyEmail/styles.js @@ -0,0 +1,40 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.grey[500], + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(2, 0), + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.black, + transition: "opacity 0.3s", + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.main, + }, + width: "70%", + borderRadius: 10, + }, + form: { + display: "flex", + }, + codePicker: { + width: 80, + marginRight: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/VerifyForgotOtp/VerifyForgotOtp.js b/enatega-multivendor-web/src/screens/VerifyForgotOtp/VerifyForgotOtp.js new file mode 100644 index 0000000..1474138 --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyForgotOtp/VerifyForgotOtp.js @@ -0,0 +1,193 @@ +import { useEffect } from "react"; +import { useMutation, gql } from "@apollo/client"; +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useTheme } from "@mui/material/styles"; +import Typography from "@mui/material/Typography"; +import React, { useState } from "react"; +import { useNavigate, useLocation } from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import RegistrationIcon from "../../assets/images/emailLock.png"; +import { Avatar } from "@mui/material"; +import OtpInput from "react-otp-input"; +import { forgotPassword } from "../../apollo/server"; + +const FORGOT_PASSWORD = gql` + ${forgotPassword} +`; +function VerifyForgotOtp() { + const theme = useTheme(); + const classes = useStyles(); + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const navigate = useNavigate(); + const [seconds, setSeconds] = useState(30); + const [otpError, setOtpError] = useState(false); + const [loading, setLoading] = useState(false); + const [otpFrom, setOtpFrom] = useState( + Math.floor(100000 + Math.random() * 900000).toString() + ); + const [sendOtp] = useMutation(FORGOT_PASSWORD, { onCompleted, onError }); + const { state } = useLocation(); + useEffect(() => { + const myInterval = setInterval(() => { + if (seconds > 0) { + setSeconds(seconds - 1); + } + if (seconds === 0) { + clearInterval(myInterval); + } + }, 1000); + return () => { + clearInterval(myInterval); + }; + }); + + useEffect(() => { + sendOtp({ variables: { email: state?.email, otp: otpFrom } }); + setSeconds(30); + }, [otpFrom, sendOtp, state?.email]); + + function onCompleted() { + try { + setLoading(true); + } catch (e) { + setError("Something went wrong"); + console.log(e); + } finally { + setLoading(false); + } + } + + function onError(e) { + setLoading(false); + setError(e.message); + } + + const onCodeFilled = async (code) => { + if (code === otpFrom) { + navigate("/new-password", { + replace: true, + state: { + email: state?.email, + }, + }); + } else { + setOtpError(true); + } + }; + + const resendOtp = () => { + setOtpFrom(Math.floor(100000 + Math.random() * 900000).toString()); + }; + const handleCode = (val) => { + const code = val; + setOtp(val); + if (code.length === 6) { + onCodeFilled(code); + } + }; + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={RegistrationIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Typography variant="h5" className={classes.font700}> + Forgot password ? + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + Please enter the otp we sent to your <br /> + email + </Typography> + <Box display="flex"> + <Box m="auto"> + <OtpInput + value={otp} + onChange={handleCode} + numInputs={6} + containerStyle={{ + width: "100%", + display: "flex", + alignSelf: "center", + }} + inputStyle={{ + width: 45, + height: 45, + margin: 5, + borderRadius: 5, + fontSize: theme.typography.h2, + border: "none", + boxShadow: theme.shadows[3], + }} + focusStyle={{ + outlineColor: theme.palette.grey[900], + }} + editable + renderInput={(props) => <input {...props} />} + /> + <Box mt={2} /> + {otpError && ( + <Typography variant={"h6"} style={{ color: "red", fontSize: 14 }}> + Invalid code, please check and enter again + </Typography> + )} + </Box> + </Box> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + fullWidth + type="email" + disableElevation + disabled={seconds !== 0} + className={classes.btnBase} + onClick={(e) => { + e.preventDefault(); + resendOtp(); + }} + > + {loading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + Resend Code + </Typography> + )} + </Button> + <Box mt={theme.spacing(2)} /> + <Typography variant="caption" className={`${classes.caption}`}> + {seconds !== 0 ? `Retry after ${seconds}s` : ""} + </Typography> + </LoginWrapper> + ); +} + +export default VerifyForgotOtp; diff --git a/enatega-multivendor-web/src/screens/VerifyForgotOtp/styles.js b/enatega-multivendor-web/src/screens/VerifyForgotOtp/styles.js new file mode 100644 index 0000000..7c12e22 --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyForgotOtp/styles.js @@ -0,0 +1,40 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.grey[500], + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(2, 0), + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.black, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.black + }, + width: "70%", + borderRadius: 10, + }, + form: { + display: "flex", + }, + codePicker: { + width: 80, + marginRight: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/VerifyPhone/VerifyPhone.js b/enatega-multivendor-web/src/screens/VerifyPhone/VerifyPhone.js new file mode 100644 index 0000000..6a0df2e --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyPhone/VerifyPhone.js @@ -0,0 +1,259 @@ +import { useCallback, useEffect } from "react"; +import { useMutation, gql } from "@apollo/client"; +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import CircularProgress from "@mui/material/CircularProgress"; +import { useTheme } from "@mui/material/styles"; +import Typography from "@mui/material/Typography"; +import React, { useContext, useState } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import FlashMessage from "../../components/FlashMessage"; +import UserContext from "../../context/User"; +import { LoginWrapper } from "../Wrapper"; +import useStyles from "./styles"; +import RegistrationIcon from "../../assets/images/emailLock.png"; +import { Avatar } from "@mui/material"; +import OtpInput from "react-otp-input"; +import { Link as RouterLink } from "react-router-dom"; +import { sendOtpToPhoneNumber, updateUser } from "../../apollo/server"; +import { useTranslation } from 'react-i18next'; +import ConfigurableValues from "../../config/constants"; + +const SEND_OTP_TO_PHONE = gql` + ${sendOtpToPhoneNumber} +`; +const UPDATEUSER = gql` + ${updateUser} +`; +function VerifyPhone() { + const { t } = useTranslation(); + const theme = useTheme(); + const classes = useStyles(); + const [otp, setOtp] = useState(""); + const [error, setError] = useState(""); + const navigate = useNavigate(); + const { state } = useLocation(); + const [seconds, setSeconds] = useState(30); + const [otpError, setOtpError] = useState(false); + const [otpFrom, setOtpFrom] = useState( + Math.floor(100000 + Math.random() * 900000).toString() + ); + const { profile } = useContext(UserContext); + const { SKIP_MOBILE_VERIFICATION } = ConfigurableValues() + + const [sendOtp, { loading: loadingOtp }] = useMutation(SEND_OTP_TO_PHONE, { + onCompleted: onOtpCompleted, + onError: onOtpError, + }); + + useEffect(() => { + const myInterval = setInterval(() => { + if (seconds > 0) { + setSeconds(seconds - 1); + } + if (seconds === 0) { + clearInterval(myInterval); + } + }, 1000); + return () => { + clearInterval(myInterval); + }; + }); + + useEffect(() => { + if (state?.phone) { + sendOtp({ variables: { phone: state?.phone, otp: otpFrom } }); + } else { + sendOtp({ variables: { phone: profile?.phone, otp: otpFrom } }); + } + setSeconds(30); + }, [otpFrom, sendOtp, state?.phone, profile?.phone]); + + function onOtpError(error) { + if (error.networkError) { + FlashMessage({ + message: error.networkError.result.errors[0].message, + }); + } else if (error.graphQLErrors) { + FlashMessage({ + message: error.graphQLErrors[0].message, + }); + } + } + function onOtpCompleted(data) { + FlashMessage({ + message: "OTP sent to your phone.", + }); + } + function onUpdateUserError(error) { + if (error.networkError) { + FlashMessage({ + message: error.networkError.result.errors[0].message, + }); + } else if (error.graphQLErrors) { + FlashMessage({ + message: error.graphQLErrors[0].message, + }); + } + } + + function onUpdateUserCompleted() { + FlashMessage({ + message: "Phone number has been verified successfully!.", + }); + } + + const [mutate, { loading: updateUserLoading }] = useMutation(UPDATEUSER, { + onCompleted: onUpdateUserCompleted, + onError: onUpdateUserError, + }); + + const onCodeFilled = useCallback((code) => { + if (SKIP_MOBILE_VERIFICATION || code === otpFrom) { + mutate({ + variables: { + name: profile.name, + phone: state?.phone ? state.phone : profile.phone, + phoneIsVerified: true, + }, + }); + navigate(-1, { + replace: true, + }); + } else { + setOtpError(true); + setError("Invalid Code"); + } + },[SKIP_MOBILE_VERIFICATION, mutate, navigate, otpFrom, profile?.name, profile?.phone, state?.phone]); + + const resendOtp = () => { + setOtpFrom(Math.floor(100000 + Math.random() * 900000).toString()); + }; + const handleCode = useCallback((val) => { + const code = val; + setOtp(val); + if (code.length === 6) { + onCodeFilled(code); + } + },[onCodeFilled]); + + useEffect(()=>{ + let timer = null + if(!SKIP_MOBILE_VERIFICATION) return + setOtp('111111') + timer = setTimeout(()=>{ + handleCode('111111') + },3000) + return ()=>{timer && clearTimeout(timer)} + },[SKIP_MOBILE_VERIFICATION,handleCode]) + + return ( + <LoginWrapper> + <FlashMessage + open={Boolean(error)} + severity={"error"} + alertMessage={error} + /> + <Box display="flex"> + <Box m="auto"> + <Avatar + m="auto" + alt="email" + src={RegistrationIcon} + sx={{ + width: 100, + height: 100, + display: "flex", + alignSelf: "center", + }} + /> + </Box> + </Box> + <Typography variant="h5" className={classes.font700}> + {t('verifyPhone')} <br /> {t('number')} + </Typography> + <Box mt={theme.spacing(1)} /> + <Typography + variant="caption" + className={`${classes.caption} ${classes.fontGrey}`} + > + {t('enterOtpPhone')} + </Typography> + <Box display="flex"> + <Box m="auto"> + <OtpInput + value={otp} + onChange={handleCode} + numInputs={6} + containerStyle={{ + width: "100%", + display: "flex", + alignSelf: "center", + backgroundColor: theme.palette.common.white, + }} + inputStyle={{ + width: 45, + height: 45, + margin: 5, + borderRadius: 5, + fontSize: theme.typography.h2, + border: `1px solid ${theme.palette.grey[400]}`, + boxShadow: theme.shadows[3], + }} + focusStyle={{ + outlineColor: theme.palette.grey[900], + }} + editable + renderInput={(props) => <input {...props} />} + /> + <Box mt={2} /> + {otpError && ( + <Typography variant={"h6"} style={{ color: "red", fontSize: 14 }}> + {t('invalidCode')} + </Typography> + )} + </Box> + </Box> + <Box mt={theme.spacing(8)} /> + <Button + variant="contained" + fullWidth + type="email" + disableElevation + disabled={seconds !== 0} + className={classes.btnBase} + onClick={(e) => { + e.preventDefault(); + resendOtp(); + }} + > + {loadingOtp || updateUserLoading ? ( + <CircularProgress color="primary" /> + ) : ( + <Typography + variant="caption" + className={`${classes.caption} ${classes.font700}`} + > + {t('resendCode')} + </Typography> + )} + </Button> + <Box mt={theme.spacing(2)} /> + <Typography variant="caption" className={`${classes.caption}`}> + {seconds !== 0 ? `${t('retryAfter')} ${seconds}s` : ""} + </Typography> + <Box mt={theme.spacing(2)} /> + <RouterLink to="/" style={{ textDecoration: "none" }}> + <Typography + variant="caption" + color="primary" + className={`${classes.caption}`} + > + {t('skipNow')} + </Typography> + </RouterLink> + </LoginWrapper> + ); +} + +export default VerifyPhone; diff --git a/enatega-multivendor-web/src/screens/VerifyPhone/styles.js b/enatega-multivendor-web/src/screens/VerifyPhone/styles.js new file mode 100644 index 0000000..23d8eda --- /dev/null +++ b/enatega-multivendor-web/src/screens/VerifyPhone/styles.js @@ -0,0 +1,41 @@ +import makeStyles from "@mui/styles/makeStyles"; + +const useStyles = makeStyles((theme) => ({ + font700: { + fontWeight: theme.typography.fontWeightBold, + }, + caption: { + fontSize: "0.875rem", + }, + fontGrey: { + color: theme.palette.grey[500], + }, + rowField: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + margin: theme.spacing(2, 0), + }, + btnBase: { + height: "50px", + opacity: 1, + backgroundColor: theme.palette.primary.black, + transition: 'opacity 0.3s', + "&:hover": { + opacity: 0.8, + backgroundColor: theme.palette.primary.black, + transition: 'opacity 0.3s', + }, + width: "70%", + borderRadius: 10, + }, + form: { + display: "flex", + }, + codePicker: { + width: 80, + marginRight: theme.spacing(2), + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/LoginWrapper.js b/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/LoginWrapper.js new file mode 100644 index 0000000..5f073d5 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/LoginWrapper.js @@ -0,0 +1,19 @@ +import { Box, Container } from "@mui/material"; +import React from "react"; +import { LoginHeader } from "../../../components/Header"; +import useStyles from "./styles"; + +function LoginWrapper({ children }) { + const classes = useStyles(); + return ( + <Box className={classes.root}> + <LoginHeader /> + <Box className={classes.mainContainer}> + <Container maxWidth="xs" className={classes.loginBox}> + {children} + </Container> + </Box> + </Box> + ); +} +export default React.memo(LoginWrapper); diff --git a/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/styles.js b/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/styles.js new file mode 100644 index 0000000..bd34680 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Wrapper/LoginWrapper/styles.js @@ -0,0 +1,42 @@ +import makeStyles from "@mui/styles/makeStyles"; +import bg from "../../../assets/images/bg.png"; + +const useStyles = makeStyles((theme) => ({ + root: { + "& .MuiInputBase-input": { + color: theme.palette.text.secondary, + }, + "& .MuiOutlinedInput-root": { + "& fieldset": { + borderColor: theme.palette.grey[200], + }, + "&:hover fieldset": { + borderColor: theme.palette.text.disabled, + }, + "&.Mui-focused fieldset": { + borderColor: theme.palette.primary.main, + }, + }, + }, + mainContainer: { + display: "flex", + justifyContent: "center", + alignItems: "center", + width: "100%", + height: "100vh", + backgroundColor: theme.palette.grey[50], + background: `url(${bg})`, + backgroundRepeat: "no-repeat", + backgroundSize: "cover", + backgroundPosition: "center center", + }, + loginBox: { + background: theme.palette.common.white, + paddingTop: "40px", + paddingBottom: "40px", + borderRadius: 20, + textAlign: "center", + }, +})); + +export default useStyles; diff --git a/enatega-multivendor-web/src/screens/Wrapper/index.js b/enatega-multivendor-web/src/screens/Wrapper/index.js new file mode 100644 index 0000000..1643701 --- /dev/null +++ b/enatega-multivendor-web/src/screens/Wrapper/index.js @@ -0,0 +1,3 @@ +import LoginWrapper from "./LoginWrapper/LoginWrapper"; + +export { LoginWrapper }; diff --git a/enatega-multivendor-web/src/translations/ar.js b/enatega-multivendor-web/src/translations/ar.js new file mode 100644 index 0000000..2bfab24 --- /dev/null +++ b/enatega-multivendor-web/src/translations/ar.js @@ -0,0 +1,206 @@ +const ar = { + translation: { + selectLanguage: "اللغة المختارة", + saveButton: "يحفظ", + footerText: + "Enatega عبارة عن منصة مفتوحة المصدر لإدارة التسليم لـ مستقبل. نحن نعطي الأولوية للابتكار والمرونة والقدرة على تحمل التكاليف، وتقديم حل قابل للتطوير وقابل للتخصيص يعمل على تبسيط عملك عمليات التسليم.", + footerLinkHome: "الصفحة الرئيسية", + footerLinkPP: "سياسة الخصوصية", + footerLinkTC: "الشروط والأحكام", + footerEndText: "إناتيغا - © 2022 جميع الحقوق محفوظة", + followUs: "تابعنا", + poweredBy: "يعمل بواسطة", + linksTitle: "روابط", + subTotal: "المجموع الفرعي", + deliveryFee: "رسوم التوصيل", + haveVoucher: "هل لديك قسيمة ؟", + remove: "إزالة", + change: "يتغيرون", + tip: "نصيحة", + taxFee: "الرسوم الضريبية", + total: "مجموع", + discount: "خصم", + name: "اسم", + phone: "هاتف", + email: "بريد إلكتروني", + address: "عنوان", + changeAddress: "تغيير العنوان", + contactInfo: "معلومات الاتصال", + paymentMethod: "طريقة الدفع او السداد", + orderBtn: "مكان الامر", + deliveryTime: "وقت التوصيل", + delivery: "توصيل", + searchRestaurantPlaceholder: "البحث عن المطاعم والأطباق", + allRestaurant: "جميع المطاعم", + pending: "قيد الانتظار", + accepted: "تم قبوله", + assigned: "تم تعيينه", + picked: "تم الاختيار", + delivered: "تم التوصيل", + completed: "تم الانتهاء", + titleOrders: "طلباتي", + titleProfile: "الملف الشخصي", + titleSettings: "الإعدادات", + titleHelp: "مساعدة", + titleChat: "محادثة", + titleLogout: "تسجيل خروج", + passwordInfo: "معلومات كلمة المرور", + myAddresses: "عناويني", + edit: "تعديل", + creditDebitCard: "بطاقة الائتمان / الخصم", + paypal: "باي بال", + cash: "نقداً", + deliverTo: "توصيل إلى", + ASSIGNED: "مُكَلَّف", + PENDING: "قيد الانتظار", + PICKED: "اختار", + ACCEPTED: "قبلت", + DELIVERED: "تم التوصيل", + COMPLETED: "مكتمل", + orderPlaced: "تم الطلب", + "Order ID": "رقم الأمر", + "Order status: PENDING": "حالة الطلب: في انتظار", + "Order status: ACCEPTED": "حالة الطلب: مقبول", + "Order status: ASSIGNED": "حالة الطلب: مُعيَّن", + "Order status: PICKED": "حالة الطلب: تم ​​اختياره", + "Order status: DELIVERED": "حالة الطلب: تم ​​التسليم", + "Order status: Order Placed": "حالة الطلب: تم ​​تقديم الطلب", + deliveryAddress: "عنوان التسليم", + orderDetail: "تفاصيل الطلب", + orderFrom: "طلبك من", + orderNo: "رقم طلبك", + findRestaurants: "العثور على المطاعم", + putUsInYourPocket: "ضعنا في جيبك.", + containerText: + "كلها بين يديك - المطاعم التي تحبها. ابحث عن الطعام المناسب لمزاجك واجعل اللقمة الأولى تدوم. تفضل، قم بتنزيلنا.", + findingAddress: + "العثور على العنوان باستخدام دمج نظام تحديد المواقع العالمي (GPS)", + zonesFunctionality: "وظيفة المناطق للمطاعم والمندوبين", + multipleRestaurants: "ميزة إضافة مطاعم متعددة", + realTimeOrder: "تحديثات استلام الطلبات في الوقت الحقيقي", + differentSections: "ميزة الأقسام المختلفة للترويج للمطاعم", + previousOrder: "تاريخ الطلبات السابقة وإضافة المطاعم المفضلة", + ourDelivery: "نظام إدارة التوصيل الخاص بنا مصمم للمستقبل", + builtOnCommunity: "بنيت على مبادئ توجيه المجتمع", + yourCart: "سلة التسوق الخاصة بك", + startAdding: "ابدأ في إضافة العناصر إلى سلة التسوق الخاصة بك", + goToCheckout: "انتقل إلى السداد", + activeOrders: "الطلبات النشطة", + pastOrders: "الطلبات السابقة", + deliveringTo: "توصيل إلى", + restaurantDeliver: "نحن نسأل المطعم كم سيستغرق توصيل طعامك", + riderDeliver: "نحن نسأل السائق كم سيستغرق توصيل طعامك", + orderPending: "طلبك قيد الانتظار لا يزال", + areYouSure: "هل أنت متأكد؟", + clearCartText: "بتغيير المطعم، سيتم مسح العناصر التي أضفتها إلى السلة", + ok: "حسنًا", + cancel: "إلغاء", + submit: "إرسال", + titleFavourite: "المفضلة", + titleEmptyFav: "لا توجد المفضلة المحفوظة", + emptyFavDesc: "سترى كل ما تفضله هنا ، لجعل الطلب أسرع", + emptyFavBtn: "دعونا نجد بعض المفضلة", + exactLocation: "هل هذا موقعك الدقيق؟", + yourArea: "أدخل منطقتك", + currentLocation: "استخدم الموقع الحالي", + deliveryDetails: "التفاصيل المطلوبة - على سبيل المثال. الطابق / المبنى", + deliveryDetailError: "مطلوب تفاصيل التوصيل", + currentPassword: "كلمة المرور الحالية", + newPassword: "كلمة مرور جديدة", + deliver: "توصيل", + time: "وقت", + pickup: "الاستلام", + selectTime: "اختر الوقت", + am: "صباحًا", + pm: "مساءً", + set: "تعيين", + apply: "تطبيق", + applyAVoucher: "تطبيق قسيمة", + readAll: "اقرأ الكل", + readMore: "اقرأ المزيد", + demo: "عرض توضيحي", + getQuote: "الحصول على اقتباس", + restaurantCloseText: + "المطعم مغلق الآن. تحقق من المطاعم الأخرى المفتوحة أو شاهد القائمة للتخطيط لوجبتك القادمة.", + seeOtherRestaurants: "انظر لمطاعم أخرى", + goToMenu: "الانتقال إلى القائمة", + deliveryHours: "ساعات التوصيل", + about: "حول", + reviews: "التقييمات", + closedAllDay: "مغلق طوال اليوم", + minute: "دقيقة", + welcome: "مرحبًا!", + signUpOrLogin: "قم بالتسجيل أو تسجيل الدخول للمتابعة", + signInWithGoogle: "المتابعة باستخدام Google", + or: "أو", + continueWithEmail: "المتابعة باستخدام البريد الإلكتروني", + terms: "الشروط والأحكام", + privacyPolicy: "سياسة الخصوصية", + bySigningUp: "بالتسجيل، أنت توافق على ", + and: " و ", + whatsYourEmail: "ما هو بريدك الإلكتروني؟", + checkAccount: "سنتحقق مما إذا كان لديك حساب", + continue: "استمر", + invalidEmail: "بريد إلكتروني غير صالح", + letsGetStarted: "لنبدأ!", + createAccount: "أنشئ حسابك في إناتيجا", + firstnameErr1: "الاسم الأول مطلوب!", + firstnameErr2: "اسم أول غير صالح!", + lastnameErr1: "الاسم الأخير مطلوب!", + lastnameErr2: "اسم أخير غير صالح!", + mobileErr1: "رقم الهاتف مطلوب!", + mobileErr2: "رقم هاتف غير صالح!", + emailErr2: "بريد إلكتروني غير صالح", + passwordErr1: + "كلمة مرور غير صالحة. يجب أن تحتوي كلمة المرور على حرف كبير وحرف صغير ورقم واحد على الأقل.", + passwordErr2: "كلمة مرور غير صالحة", + generalErr: "هناك شيء ناقص", + verifyEmail: "تحقق من بريدك الإلكتروني", + enterOtp: "الرجاء إدخال رمز OTP الذي أرسلناه إلى بريدك الإلكتروني المحدث", + enterOtpPhone: "الرجاء إدخال رمز OTP الذي أرسلناه إلى رقم هاتفك الإلكتروني", + invalidCode: "الرمز غير صالح، الرجاء التحقق وإدخاله مرة أخرى", + resendCode: "إعادة إرسال الرمز", + retryAfter: "إعادة المحاولة بعد", + loginBtn: "تسجيل الدخول", + addToCart: "أضف إلى السلة", + customize: "تخصيص", + optional: "اختياري", + required: "مطلوب", + specialInstructions: "تعليمات خاصة", + anySpecific: "هل لديك تفضيلات معينة؟ أخبر المطعم.", + selectVariation: "اختر التباين", + closed: "مغلق", + new: "جديد", + orderCancelled: "تم إلغاء طلبك", + orderCompleted: "تم إكمال الطلب بنجاح. شكرًا لك على طلبك", + reorder: "إعادة الطلب", + review: "مراجعة", + subTitle: " اختر ١", + placeholder: "على سبيل المثال، بدون مايونيز", + phoneNumMissing: "الرقم الهاتفي مفقود", + updatePhone: "قم بتحديث هاتفك", + number: "الرقم؟", + secureAcc: "نحتاج هذا لتأمين حسابك", + verifyPhone: "تحقق من هاتفك", + skipNow: "تخطى الآن", + favouriteListUpdated: "تم تحديث قائمة المفضلات", + pendingText: "في انتظار الرد من", + acceptedText: "الوقت المقدر للتحضير", + orderLateText: "آسف! طلبك متأخر قليلاً.", + riderPickText: "سيقوم سائقك بالحصول عليه عندما يكون جاهزًا.", + orderIs: "طلبك هو", + orderAssigned: "تم تعيينه للسائق", + orderAssignedToRider: + "تم تعيين طلبك لسائقنا، سيتم استلام الطلب عندما يكون جاهزًا.", + riderOnWay: "سائقك في الطريق.", + orderHasBeen: "تم طلبك", + enjoyYourMeal: "استمتع بوجبتك!", + cancelled: "تم الإلغاء", + personalDetail: "التفاصيل الشخصية", + voucherCode: "رمز القسيمة", + pickUp: "استلام", + warning: "تحذير", + warningText: "أحد العناصر غير متاح", + }, +}; +export default ar; diff --git a/enatega-multivendor-web/src/translations/de.js b/enatega-multivendor-web/src/translations/de.js new file mode 100644 index 0000000..ab33e1d --- /dev/null +++ b/enatega-multivendor-web/src/translations/de.js @@ -0,0 +1,214 @@ +const de = { + translation: { + selectLanguage: "Sprache auswählen", + saveButton: "speichern", + footerText: + "Enatega ist eine Open-Source-Liefermanagementplattform für Zukunft. Wir legen Wert auf Innovation, Flexibilität und Erschwinglichkeit. und bieten Sie eine skalierbare, anpassbare Lösung, die Ihre Prozesse optimiert Lieferprozesse.", + footerLinkHome: "Startseite", + footerLinkPP: "Datenschutzbestimmungen", + footerLinkTC: "Geschäftsbedingungen", + footerEndText: "Enatega - © 2022 Alle Rechte vorbehalten", + followUs: "Folge uns", + poweredBy: "Angetrieben von", + linksTitle: "Verknüpfungen", + subTotal: "Zwischensumme", + deliveryFee: "Liefergebühr", + haveVoucher: "Hast du einen Gutschein?", + remove: "Entfernen", + change: "Veränderung", + taxFee: "Steuerbelastungen", + total: "Gesamt", + tip: "Tipp", + discount: "Rabatt", + name: "Name", + phone: "Telefon", + email: "Email", + address: "Adresse", + changeAddress: "Adresse ändern", + contactInfo: "Kontaktinformationen", + paymentMethod: "Zahlungsmethode", + orderBtn: "Bestellung aufgeben", + deliveryTime: "Lieferzeit", + delivery: "Lieferung", + searchRestaurantPlaceholder: "Suche nach Restaurants und Küchen", + allRestaurant: "Alle Restaurants", + pending: "Ausstehend", + accepted: "Akzeptiert", + assigned: "Zugewiesen", + picked: "Abgeholt", + delivered: "Geliefert", + completed: "Abgeschlossen", + titleOrders: "meine Bestellungen", + titleSettings: "Einstellungen", + titleProfile: "Profiel", + titleHelp: "Hilfe", + titleChat: "Plaudern", + titleLogout: "Ausloggen", + passwordInfo: "Passwortinformationen", + myAddresses: "Meine Adressen", + edit: "Bearbeiten", + creditDebitCard: "Kredit- / Debitkarte", + paypal: "Paypal", + cash: "Bargeld", + deliverTo: "Liefern an", + ASSIGNED: "zugewiesen", + PENDING: "ausstehend", + PICKED: "abgeholt", + ACCEPTED: "akzeptiert", + DELIVERED: "geliefert", + COMPLETED: "abgeschlossen", + orderPlaced: "Bestellung aufgegeben", + "Order ID": "Auftragsnummer", + "Order status: PENDING": "Bestellstatus: AUSSTEHEND", + "Order status: ACCEPTED": "Bestellstatus: AKZEPTIERT", + "Order status: ASSIGNED": "Bestellstatus: ZUGEWIESEN", + "Order status: PICKED": "Bestellstatus: AUSGEWÄHLT", + "Order status: DELIVERED": "Bestellstatus: GELIEFERT", + "Order status: Order Placed": "Bestellstatus: Bestellung aufgegeben", + deliveryAddress: "Lieferadresse", + orderDetail: "Bestelldetails", + orderFrom: "Ihre Bestellung von", + orderNo: "Ihre Bestellnummer", + findRestaurants: "Restaurants finden", + putUsInYourPocket: "Steck uns in deine Tasche.", + containerText: + "Alles liegt in deiner Handfläche – die Restaurants, die du liebst. Finde das richtige Essen, um deine Stimmung zu treffen, und mache den ersten Bissen zum Erlebnis. Los, lade uns herunter.", + findingAddress: "Adresse finden mit GPS-Integration", + zonesFunctionality: "Zonenfunktion für Restaurants und Fahrer", + multipleRestaurants: "Funktion zum Hinzufügen mehrerer Restaurants", + realTimeOrder: "Echtzeitaktualisierungen zum Bestellempfang", + differentSections: + "Funktion für verschiedene Abschnitte zur Förderung von Restaurants", + previousOrder: + "Vorherige Bestellhistorie und Hinzufügen von Lieblingsrestaurants", + ourDelivery: "Unser Liefersystem ist für die Zukunft konzipiert", + builtOnCommunity: "Auf gemeinschaftsgetriebenen Prinzipien aufgebaut", + yourCart: "Ihr Warenkorb", + startAdding: "Beginnen Sie damit, Artikel in Ihren Warenkorb zu legen", + goToCheckout: "ZUR KASSE GEHEN", + activeOrders: "Aktive Bestellungen", + pastOrders: "Vergangene Bestellungen", + deliveringTo: "Lieferung an", + restaurantDeliver: + "Wir fragen das Restaurant, wie lange es dauern wird, um Ihr Essen zu liefern", + riderDeliver: + "Wir fragen den Fahrer, wie lange es dauern wird, um Ihr Essen zu liefern", + orderPending: "Ihre Bestellung ist noch ausstehend", + areYouSure: "Bist du sicher?", + clearCartText: + "Durch den Wechsel des Restaurants werden die Artikel in deinem Warenkorb gelöscht", + ok: "OK", + cancel: "Abbrechen", + submit: "einreichen", + titleFavourite: "Favoritin", + titleEmptyFav: "Keine Favoriten gespeichert", + emptyFavDesc: + "Hier sehen Sie alle Ihre Favoriten, um die Bestellung noch schneller zu machen.", + emptyFavBtn: "Lassen Sie uns einige Favoriten finden", + exactLocation: "Ist dies dein genauer Standort?", + yourArea: "Gib deine Region ein", + currentLocation: "Aktuellen Standort verwenden", + deliveryDetails: "Erforderliche Angaben, z. Boden / Gebäude", + deliveryDetailError: "Lieferdetails sind erforderlich", + currentPassword: "Aktuelles Passwort", + newPassword: "Neues Passwort", + deliver: "Lieferung", + time: "Zeit", + pickup: "Abholung", + selectTime: "Zeit auswählen", + am: "vormittags", + pm: "nachmittags", + set: "Einstellen", + apply: "Anwenden", + applyAVoucher: "Gutschein anwenden", + readAll: "Alles lesen", + readMore: "Mehr lesen", + demo: "Demo", + getQuote: "Angebot erhalten", + restaurantCloseText: + "Das Restaurant ist derzeit geschlossen. Schauen Sie sich andere offene Restaurants an oder werfen Sie einen Blick auf die Speisekarte für Ihre nächste Mahlzeit.", + seeOtherRestaurants: "ANDERE RESTAURANTS ANZEIGEN", + goToMenu: "Zur Speisekarte", + deliveryHours: "Lieferzeiten", + about: "ÜBER", + reviews: "BEWERTUNGEN", + closedAllDay: "Den ganzen Tag geschlossen", + minute: "Minute", + welcome: "Willkommen!", + signUpOrLogin: "Registrieren oder anmelden, um fortzufahren", + signInWithGoogle: "MIT GOOGLE FORTFAHREN", + or: "oder", + continueWithEmail: "MIT E-MAIL FORTFAHREN", + terms: "Allgemeine Geschäftsbedingungen", + privacyPolicy: "Datenschutzrichtlinie", + bySigningUp: "Durch die Registrierung stimmst du unseren ", + and: " und ", + whatsYourEmail: "Was ist deine E-Mail-Adresse?", + checkAccount: "Wir überprüfen, ob du ein Konto hast", + continue: "Weiter", + invalidEmail: "Ungültige E-Mail-Adresse", + letsGetStarted: "Lass uns anfangen!", + createAccount: "Erstelle dein Enatega-Konto", + firstnameErr1: "Vorname ist erforderlich!", + firstnameErr2: "Ungültiger Vorname!", + lastnameErr1: "Nachname ist erforderlich!", + lastnameErr2: "Ungültiger Nachname!", + mobileErr1: "Telefonnummer ist erforderlich!", + mobileErr2: "Ungültige Telefonnummer!", + emailErr2: "Ungültige E-Mail-Adresse", + passwordErr1: + "Ungültiges Passwort. Das Passwort muss mindestens 1 Großbuchstaben, 1 Kleinbuchstaben und 1 Zahl enthalten.", + passwordErr2: "Ungültiges Passwort", + generalErr: "Etwas fehlt", + verifyEmail: "Bestätigen Sie Ihre E-Mail", + enterOtp: + "Bitte geben Sie den OTP ein, den wir an Ihre aktualisierte E-Mail gesendet haben", + enterOtpPhone: "Bitte geben Sie den OTP ein, den wir an Ihre aktualisierte Telefonnummer gesendet haben", + invalidCode: "Ungültiger Code, bitte überprüfen und erneut eingeben", + resendCode: "Code erneut senden", + retryAfter: "Erneuter Versuch nach", + loginBtn: "Anmeldung", + addToCart: "in den Warenkorb legen", + customize: "Anpassen", + optional: "Optional", + required: "Erforderlich", + specialInstructions: "Besondere Anweisungen", + anySpecific: + "Irgendwelche spezifischen Vorlieben? Lassen Sie es das Restaurant wissen.", + selectVariation: "Variation auswählen", + closed: "Geschlossen", + new: "NEU", + orderCancelled: "Ihre Bestellung wurde storniert", + orderCompleted: + "Bestellung erfolgreich abgeschlossen. Vielen Dank für Ihre Bestellung", + reorder: "NEUBESTELLEN", + review: "Überprüfung", + subTitle: "Auswahl 1", + placeholder: "z.B. Keine Mayo", + phoneNumMissing: "Telefonnummer fehlt", + updatePhone: "Aktualisieren Sie Ihr Telefon", + number: "Nummer?", + secureAcc: "Wir brauchen das, um Ihr Konto zu sichern", + verifyPhone: "Überprüfen Sie Ihr Telefon", + skipNow: "Jetzt überspringen", + favouriteListUpdated: "Favoritenliste aktualisiert", + pendingText: "Warten auf Antwort von", + acceptedText: "Geschätzte Zubereitungszeit", + orderLateText: "Entschuldigung! Ihre Bestellung kommt etwas spät.", + riderPickText: "Ihr Fahrer wird es abholen, sobald es bereit ist.", + orderIs: "Ihre Bestellung ist", + orderAssigned: "Dem Fahrer zugewiesen", + orderAssignedToRider: + "Ihre Bestellung wurde unserem Fahrer zugewiesen und wird abgeholt, sobald sie bereit ist.", + riderOnWay: "Ihr Fahrer ist unterwegs.", + orderHasBeen: "Ihre Bestellung wurde", + enjoyYourMeal: "Guten Appetit!", + cancelled: "Abgebrochen", + personalDetail: "Persönliche Angaben", + voucherCode: "Gutscheincode", + pickUp: "Abholung", + warning: "Warnung", + warningText: "Ein oder mehrere Elemente sind nicht verfügbar", + }, +}; +export default de; diff --git a/enatega-multivendor-web/src/translations/en.js b/enatega-multivendor-web/src/translations/en.js new file mode 100644 index 0000000..267c596 --- /dev/null +++ b/enatega-multivendor-web/src/translations/en.js @@ -0,0 +1,209 @@ +const en = { + translation: { + selectLanguage: "Select Language", + saveButton: "Save", + footerText: + "Enatega is an open-source delivery management platform for the future. We prioritize innovation, flexibility, and affordability, and offer a scalable, customizable solution that streamlines your delivery processes.", + footerLinkHome: "Home", + footerLinkPP: "Privacy Policy", + footerLinkTC: "Terms and Conditions", + footerEndText: "Enatega – © 2022 All Rights Reserved", + followUs: "Follow Us", + poweredBy: "Powered By", + linksTitle: "Links", + subTotal: "SubTotal", + deliveryFee: "Delivery Fee", + haveVoucher: "Do you have a voucher ?", + remove: "Remove", + change: "Change", + taxFee: "Tax Charges", + total: "Total", + tip: "Tip", + discount: "Discount", + name: "Name", + phone: "Phone", + email: "Email", + address: "Address", + changeAddress: "Change Address", + contactInfo: "Contact Information", + paymentMethod: "Payment Method", + orderBtn: "Place order", + deliveryTime: "Delivery Time", + delivery: "Delivery", + searchRestaurantPlaceholder: "Search for restaurant and cuisines", + allRestaurant: "All Restaurants", + pending: "PENDING", + accepted: "ACCEPTED", + assigned: "ASSIGNED", + picked: "PICKED", + delivered: "DELIVERED", + completed: "COMPLETED", + titleOrders: "My Orders", + titleProfile: "Profile", + titleSettings: "Settings", + titleHelp: "Help", + titleChat: "Chat", + titleLogout: "Logout", + passwordInfo: "Password Info", + myAddresses: "My Addresses", + edit: "Edit", + creditDebitCard: "Credit / Debit Card", + paypal: "Paypal", + cash: "Cash", + deliverTo: "Deliver to", + ASSIGNED: "ASSIGNED", + PENDING: "PENDING", + PICKED: "PICKED", + ACCEPTED: "ACCEPTED", + DELIVERED: "DELIVERED", + COMPLETED: "COMPLETED", + orderPlaced: "Order Placed", + "Order ID": "Order ID", + "Order status: PENDING": "Order status: PENDING", + "Order status: ACCEPTED": "Order status: ACCEPTED", + "Order status: ASSIGNED": "Order status: ASSIGNED", + "Order status: PICKED": "Order status: PICKED", + "Order status: DELIVERED": "Order status: DELIVERED", + "Order status: Order Placed": "Order status: Order Placed", + deliveryAddress: "Delivery Address", + orderDetail: "Order Detail", + orderFrom: "Your Order From", + orderNo: "Your Order No.", + findRestaurants: "Find Restaurants", + putUsInYourPocket: "Put us in your pocket", + containerText: + "It's all at your fingertips -- the restaurants you love. Find the right food to suit your mood, and make the first bite last. Go ahead, download us.", + findingAddress: "Finding address using GPS integration", + zonesFunctionality: "Zones functionality for Restaurants and Riders", + multipleRestaurants: "Multiple Restaurant adding feature", + realTimeOrder: "Real-time order receiving updates", + differentSections: "Different sections feature for promoting restaurants", + previousOrder: "Previous order history and adding favorite restaurants", + ourDelivery: "Our delivery management system is designed for the future.", + builtOnCommunity: "Built on community-driven principles.", + yourCart: "Your Cart", + startAdding: "Start adding items to your cart", + goToCheckout: "GO TO CHECKOUT", + activeOrders: "ACTIVE ORDERS", + pastOrders: "PAST ORDERS", + deliveringTo: "DELIVERING TO", + restaurantDeliver: + "We are asking the restaurant how long it will take to deliver your food", + riderDeliver: + "We are asking the rider how long it will take to deliver your food", + orderPending: "Your order is still pending", + areYouSure: "Are you sure?", + clearCartText: + "By changing restaurant, the items you`ve added to cart will be cleared", + ok: "OK", + cancel: "CANCEL", + submit: "Submit", + titleFavourite: "Favourites", + titleEmptyFav: "No Favourites Saved", + emptyFavDesc: + "You'll see all your favourites here, to make ordering even faster.", + emptyFavBtn: "Let's find some favourites", + exactLocation: "Is this your exact location?", + yourArea: "Enter Your Area", + currentLocation: "Use current location", + deliveryDetails: "Required details -e.g. floor/ building", + deliveryDetailError: "Delivery details is required", + currentPassword: "Current Password", + newPassword: "New Password", + deliver: "Delivery", + time: "Time", + pickup: "Pickup", + selectTime: "Select Time", + am: "AM", + pm: "PM", + set: "Set", + apply: "Apply", + applyAVoucher: "Apply a voucher", + readAll: "Read All", + readMore: "Read More", + demo: "Demo", + getQuote: "Get Quote", + restaurantCloseText: + "The restaurant is closed right now. Check out others that are open or take a look at the menu to plan for your next meal.", + seeOtherRestaurants: "SEE OTHER RESTAURANTS", + goToMenu: "Go To Menu", + deliveryHours: "Delivery hours", + about: "ABOUT", + reviews: "REVIEWS", + closedAllDay: "Closed all day", + minute: "Minute", + welcome: "Welcome!", + signUpOrLogin: "Sign up or log in to continue", + signInWithGoogle: "CONTINUE WITH GOOGLE", + or: "or", + continueWithEmail: "CONTINUE WITH EMAIL", + terms: "Terms and Conditions", + privacyPolicy: "Privacy Policy", + bySigningUp: "By signing up, you agree to our ", + and: " and ", + whatsYourEmail: "What's your Email?", + checkAccount: "We'll check if you've an account", + continue: "Continue", + invalidEmail: "Invalid Email", + letsGetStarted: "Let's get started!", + createAccount: "Create your Enatega Account", + firstnameErr1: "Firstname is required!", + firstnameErr2: "Invalid First Name!", + lastnameErr1: "Lastname is required!", + lastnameErr2: "Invalid Last Name!", + mobileErr1: "Phone number is required!", + mobileErr2: "Invalid Phone number", + emailErr2: "Invalid Email", + passwordErr1: + "Invalid Password. Password must contain at least 1 capital letter, 1 small letter, and 1 number.", + passwordErr2: "Invalid Password", + generalErr: "Something is missing", + verifyEmail: "Verify your email", + enterOtp: "Please enter the OTP we sent to your updated email", + enterOtpPhone : "Please enter the OTP we sent to your updated Phone Number", + invalidCode: " Invalid code, please check and enter again", + resendCode: "Resend code", + retryAfter: "Retry after", + loginBtn: "Login", + addToCart: "Add to Cart", + customize: "Customize", + optional: "OPTIONAL", + required: "REQUIRED", + specialInstructions: "Special Instructions", + anySpecific: "Any specific preferances? Let the restaurant know.", + selectVariation: "Select Variation", + closed: "Closed", + new: "NEW", + orderCancelled: "Your order has been cancelled", + orderCompleted: "Order completed successfully. Thankyou for placing order", + reorder: "REORDER", + review: "Review", + subTitle: "Select 1", + placeholder: "e.g. No mayo", + phoneNumMissing: "Phone Number is missing", + updatePhone: "Update your phone", + number: "number?", + secureAcc: "We need this to secure your account", + verifyPhone: "Verify your phone", + skipNow: "Skip now", + favouriteListUpdated: "Favourite list updated", + pendingText: "Waiting response from", + acceptedText: "Estimated preparation time", + orderLateText: "Sorry! Your order is bit late.", + riderPickText: "Your rider will pick it up once its ready", + orderIs: "Your order is", + orderAssigned: "assigned to the rider", + orderAssignedToRider: + "Your order is assigned to our rider, order will be picked once its ready.", + riderOnWay: "Your rider is on the way.", + orderHasBeen: "Your order has been", + enjoyYourMeal: "Enjoy your meal!", + cancelled: "Cancelled", + personalDetail: "Personal Detail", + voucherCode: "Voucher code", + pickUp: "Pickup", + warning: "warning", + warningText: "One or more item is not available", + }, +}; +export default en; diff --git a/enatega-multivendor-web/src/translations/fr.js b/enatega-multivendor-web/src/translations/fr.js new file mode 100644 index 0000000..f8dce3a --- /dev/null +++ b/enatega-multivendor-web/src/translations/fr.js @@ -0,0 +1,216 @@ +const fr = { + translation: { + selectLanguage: "Choisir la langue", + saveButton: "sauvegarder", + footerText: + "Enatega est une plateforme open source de gestion des livraisons pour le avenir. Nous accordons la priorité à l innovation, à la flexibilité et à l abordabilité, et offrez une solution évolutive et personnalisable qui rationalise votre processus de livraison.", + footerLinkHome: "Accueil", + footerLinkPP: "Politique de confidentialité", + footerLinkTC: "Conditions générales", + footerEndText: "Enatega - © 2022 Tous droits réservés", + followUs: "Suivez-nous", + poweredBy: "Propulsé par", + linksTitle: "Liens", + subTotal: "Total", + deliveryFee: "Frais de livraison", + haveVoucher: "Avez-vous un bon", + remove: "Retirer", + change: "Changement", + taxFee: "charges fiscales", + total: "Total", + tip: "Pourboire", + discount: "Remise", + name: "prénom", + phone: "Téléphone", + email: "Email", + address: "Adresse", + changeAddress: "Changer l adresse", + contactInfo: "Informations de contact", + paymentMethod: "Mode de paiement", + orderBtn: "Passer la commande", + deliveryTime: "Heure de livraison", + delivery: "Livraison", + searchRestaurantPlaceholder: "Recherche de restaurants et de cuisines", + allRestaurant: "Tous les restaurants", + pending: "En attente", + accepted: "Accepté(e)", + assigned: "Assigné(e)", + picked: "Ramassé(e)", + delivered: "Livré(e)", + completed: "Terminé(e)", + titleOrders: "Mes commandes", + titleProfile: "Profil", + titleHelp: "Aidez-moi", + titleSettings: "Setting", + titleChat: "Bavarder", + titleLogout: "Connectez - Out", + passwordInfo: "Informations de mot de passe", + myAddresses: "Mes adresses", + edit: "Modifier", + creditDebitCard: "Carte de crédit / débit", + paypal: "Paypal", + cash: "Espèces / Liquide", + deliverTo: "Livrer à", + ASSIGNED: "attribué", + PENDING: "en attente", + PICKED: "choisi", + ACCEPTED: "accepté", + DELIVERED: "livré", + COMPLETED: "terminé", + orderPlaced: "Commande passée", + "Order ID": "Numéro de commande", + "Order status: PENDING": "Suivi de commande: En attente", + "Order status: ACCEPTED": "Statut de la commande : ACCEPTÉ", + "Order status: ASSIGNED": "Statut de la commande : ATTRIBUÉ", + "Order status: PICKED": "Statut de la commande : CHOISI", + "Order status: DELIVERED": "Statut de la commande : LIVRÉ", + "Order status: Order Placed": "Statut de la commande : Commande passée", + deliveryAddress: "Adresse de livraison", + orderDetail: "Détails de la commande", + orderFrom: "Votre commande de", + orderNo: "Votre numéro de commande", + findRestaurants: "Trouver des restaurants", + putUsInYourPocket: "Mettez-nous dans votre poche", + containerText: + "Tout est à portée de main - les restaurants que vous adorez. Trouvez la nourriture idéale pour satisfaire vos envies et faites durer le plaisir dès la première bouchée. Allez-y, téléchargez-nous.", + findingAddress: "Trouver une adresse en utilisant l'intégration GPS", + zonesFunctionality: + "Fonctionnalité de zones pour les restaurants et les livreurs", + multipleRestaurants: "Fonctionnalité d'ajout de plusieurs restaurants", + realTimeOrder: "Mises à jour en temps réel de la réception des commandes", + differentSections: + "Fonctionnalité de différentes sections pour promouvoir les restaurants", + previousOrder: + "Historique des commandes précédentes et ajout de restaurants favoris", + ourDelivery: + "Notre système de gestion des livraisons est conçu pour l'avenir", + builtOnCommunity: "Basé sur des principes communautaires", + yourCart: "Votre panier", + startAdding: "Commencez à ajouter des articles à votre panier", + goToCheckout: "ALLER À LA CAISSE", + activeOrders: "Commandes en cours", + pastOrders: "Commandes passées", + deliveringTo: "Livraison à", + restaurantDeliver: + "Nous demandons au restaurant combien de temps il faudra pour livrer votre nourriture.", + riderDeliver: + "Nous demandons au livreur combien de temps il faudra pour livrer votre nourriture", + orderPending: "Votre commande est toujours en attente", + areYouSure: "Êtes-vous sûr ?", + clearCartText: + "En changeant de restaurant, les articles que vous avez ajoutés au panier seront supprimés", + ok: "OK", + cancel: "ANNULER", + submit: "Soumettre", + titleFavourite: "favorite", + titleEmptyFav: "Aucun favori enregistré", + emptyFavDesc: + "Vous verrez tous vos favoris ici, pour rendre la commande encore plus rapide.", + emptyFavBtn: "Trouvons quelques favoris", + exactLocation: "Est-ce votre emplacement exact ?", + yourArea: "Entrez votre région", + currentLocation: "Utiliser l'emplacement actuel", + deliveryDetails: "Détails requis -e.g. étage / bâtiment", + deliveryDetailError: "Les détails de livraison sont requis", + currentPassword: "Mot de passe actuel", + newPassword: "Nouveau mot de passe", + deliver: "Livraison", + time: "Temps", + pickup: "Ramassage", + selectTime: "Sélectionner l'heure", + am: "AM", + pm: "PM", + set: "Définir", + apply: "Appliquer", + applyAVoucher: "Appliquer un bon", + readAll: "Tout lire", + readMore: "Lire plus", + demo: "Démo", + getQuote: "Obtenir un devis", + restaurantCloseText: + "Le restaurant est actuellement fermé. Découvrez les autres restaurants ou consultez le menu pour planifier votre prochain repas.", + seeOtherRestaurants: "VOIR LES AUTRES RESTAURANTS", + goToMenu: "Aller au menu", + deliveryHours: "Heures de livraison", + about: "À PROPOS DE", + reviews: "AVIS", + closedAllDay: "Fermé toute la journée", + minute: "Minute", + welcome: "Bienvenue !", + signUpOrLogin: "Inscrivez-vous ou connectez-vous pour continuer", + signInWithGoogle: "CONTINUER AVEC GOOGLE", + or: "ou", + continueWithEmail: "CONTINUER AVEC EMAIL", + terms: "Conditions générales", + privacyPolicy: "Politique de confidentialité", + bySigningUp: "En vous inscrivant, vous acceptez notre ", + and: " et ", + whatsYourEmail: "Quelle est votre adresse e-mail ?", + checkAccount: "Nous vérifierons si vous avez un compte", + continue: "Continuer", + invalidEmail: "Adresse e-mail invalide", + letsGetStarted: "Commençons !", + createAccount: "Créez votre compte Enatega", + firstnameErr1: "Le prénom est requis !", + firstnameErr2: "Prénom invalide !", + lastnameErr1: "Le nom de famille est requis !", + lastnameErr2: "Nom de famille invalide !", + mobileErr1: "Le numéro de téléphone est requis !", + mobileErr2: "Numéro de téléphone invalide !", + emailErr2: "E-mail invalide", + passwordErr1: + "Mot de passe invalide. Le mot de passe doit contenir au moins 1 lettre majuscule, 1 lettre minuscule et 1 chiffre.", + passwordErr2: "Mot de passe invalide", + generalErr: "Quelque chose manque", + verifyEmail: "Vérifiez votre e-mail", + enterOtp: + "Veuillez entrer le code OTP que nous avons envoyé à votre e-mail mis à jour", + enterOtpPhone : "Veuillez entrer le code OTP que nous avons envoyé à votre numéro de numéro mis à jour", + invalidCode: "Code invalide, veuillez vérifier et entrer à nouveau", + resendCode: "Renvoyer le code", + retryAfter: "Réessayer après", + loginBtn: "S'identifier", + addToCart: "Ajouter au panier", + customize: "Personnaliser", + optional: "Facultatif", + required: "Obligatoire", + specialInstructions: "Instructions spéciales", + anySpecific: + "Des préférences spécifiques ? Faites-le savoir au restaurant.", + selectVariation: "Sélectionner la variation", + closed: "Fermé", + new: "NOUVEAU", + orderCancelled: "Votre commande a été annulée", + orderCompleted: + "Commande complétée avec succès. Merci d'avoir passé commande", + reorder: "RECOMMANDER", + review: "Critique", + subTitle: "Sélectionner 1", + placeholder: "par exemple, sans mayonnaise", + phoneNumMissing: "Numéro de téléphone manquant", + updatePhone: "Mettez à jour votre téléphone", + number: "numéro ?", + secureAcc: "Nous avons besoin de ceci pour sécuriser votre compte", + verifyPhone: "Vérifiez votre téléphone", + skipNow: "Passer maintenant", + favouriteListUpdated: "Liste de favoris mise à jour", + pendingText: "En attente d'une réponse de", + acceptedText: "Temps de préparation estimé", + orderLateText: "Désolé ! Votre commande est un peu en retard.", + riderPickText: "Votre livreur la récupérera une fois prête.", + orderIs: "Votre commande est", + orderAssigned: "Assignée au livreur", + orderAssignedToRider: + "Votre commande a été assignée à notre livreur, elle sera récupérée une fois prête.", + riderOnWay: "Votre livreur est en chemin.", + orderHasBeen: "Votre commande a été", + enjoyYourMeal: "Bon appétit !", + cancelled: "Annulée", + personalDetail: "Détail personnel", + voucherCode: "Code de réduction", + pickUp: "Ramassage", + warning: "Avertissement", + warningText: "Un ou plusieurs éléments ne sont pas disponibles", + }, +}; +export default fr; diff --git a/enatega-multivendor-web/src/translations/km.js b/enatega-multivendor-web/src/translations/km.js new file mode 100644 index 0000000..34ee96b --- /dev/null +++ b/enatega-multivendor-web/src/translations/km.js @@ -0,0 +1,214 @@ +const km = { + translation: { + selectLanguage: "ជ្រើសរើស​ភាសា", + saveButton: "រក្សាទុក", + footerText: + "Enatega គឺជាវេទិកាគ្រប់គ្រងការចែកចាយប្រភពបើកចំហសម្រាប់ អនាគត។ យើងផ្តល់អាទិភាពដល់ការច្នៃប្រឌិត ភាពបត់បែន និងតម្លៃសមរម្យ។ និងផ្តល់ជូននូវដំណោះស្រាយដែលអាចធ្វើមាត្រដ្ឋានបាន និងអាចប្ដូរតាមបំណងបាន ដែលសម្រួលដល់ដំណើរការរបស់អ្នក។ ដំណើរការចែកចាយ។", + footerLinkHome: "ទំព័រដើម", + footerLinkPP: "គោលគ្រឿងបទនិងលក្ខខណ្ឌ", + footerLinkTC: "លក្ខខណ្ឌ និងលក្ខណៈ", + footerEndText: "Enatega - © 2022 រក្សាសិទ្ធិទាំងអស់", + followUs: "តាមដានពួកយើង", + poweredBy: "ដោនឡូតដោយ", + linksTitle: "តំណ", + subTotal: "សរុបរង", + deliveryFee: "ថ្លៃសេវាដឹកជញ្ជូន", + haveVoucher: "តើអ្នកមានប័ណ្ណទូទាត់ទេ?", + remove: "យកចេញ", + change: "ផ្លាស់ប្តូរ", + taxFee: "ការគិតពន្ធ", + total: "សរុប", + tip: "គុណភាព", + discount: "បញ្ចុះតម្លៃ", + name: "ឈ្មោះ", + phone: "ទូរស័ព្ទ", + email: "អ៊ីមែល", + address: "អាសយដ្ឋាន", + changeAddress: "ផ្លាស់ប្តូរអាសយដ្ឋាន", + contactInfo: "ព័ត៌មានទំនាក់ទំនង", + paymentMethod: "វិធី​សា​ស្រ្ត​ទូទាត់", + orderBtn: "ដាក់បញ្ជាទិញ", + deliveryTime: "ពេលវេលាដឹកជញ្ជូន", + delivery: "ការដឹកជញ្ជូន", + searchRestaurantPlaceholder: "ស្វែងរកភោជនីយដ្ឋាន និងម្ហូប", + allRestaurant: "ភោជនីយដ្ឋានទាំងអស់។", + pending: "កំពុងរង់ចាំ", + accepted: "បានទទួលយក", + assigned: "បានបញ្ជាក់", + picked: "បានយក", + delivered: "បានដឹកជញ្ជូន", + completed: "បានបញ្ចប់", + titleOrders: "ការបញ្ជាទិញរបស់ខ្ញុំ", + titleProfile: "ប្រវត្តិរូប", + titleSettings: "ការកំណត់", + titleHelp: "ជំនួយ", + titleChat: "ជជែក", + titleLogout: "ចាកចេញ", + passwordInfo: "ព័ត៌មានពាក្យសម្ងាត់", + myAddresses: "អាសយដ្ឋានរបស់ខ្ញុំ", + edit: "កែប្រែ", + creditDebitCard: "ប័ណ្ណឥណទាន / ប័ណ្ណសម្រាប់បង់ប្រាក់", + paypal: "ប៉ាយប៉ាល់", + cash: "សាច់ប្រាក់", + deliverTo: "ដឹកជញ្ជូន​ទៅ", + ASSIGNED: "បានគោរព", + PENDING: "កំពុងរងចាំ", + PICKED: "បានយក", + ACCEPTED: "បានទទួលយក", + DELIVERED: "បានដឹកជញ្ជូន", + COMPLETED: "បានបញ្ចប់", + orderPlaced: "បានបញ្ជាទិញ", + "Order ID": "លេខ​លំដាប់", + "Order status: PENDING": "ស្ថានភាពការបញ្ជាទិញ៖ កំពុងរង់ចាំ", + "Order status: ACCEPTED": "ស្ថានភាពការបញ្ជាទិញ៖ យល់ព្រម", + "Order status: ASSIGNED": "ស្ថានភាពបញ្ជាទិញ៖ បានកំណត់", + "Order status: PICKED": "ស្ថានភាពការបញ្ជាទិញ៖ ជ្រើសរើស", + "Order status: DELIVERED": "ស្ថានភាពការបញ្ជាទិញ៖ ប្រគល់", + "Order status: Order Placed": "ស្ថានភាពបញ្ជាទិញ៖ បញ្ជាទិញ", + deliveryAddress: "អាស័យ​ដ្ឋាន​សំរាប់​ការ​ដឹកជញ្ជូន", + orderDetail: "លំអិតលំដាប់", + orderFrom: "ការបញ្ជាទិញ​របស់អ្នកពី", + orderNo: "លេខកូដបញ្ជាទិញ​របស់អ្នក", + findRestaurants: "ស្វែងរកភោជនីយដ្ឋាន", + putUsInYourPocket: "ដាក់​យើង​ក្នុង​ការណែនាំ​របស់អ្នក។", + containerText: + "ទាំងអស់គឺនៅក្នុងជំហានរបស់អ្នក - ភោជនីយដ្ឋានដែលអ្នកចូលចិត្ត។ ស្វែងរកអាហារត្រឹមត្រូវដើម្បីប្រវត្តិរូបសង្ខេបរបស់អ្នក និងធ្វើឲ្យភាពជឿជាក់ដែលចាប់ផ្តើមត្រូវនៅមកហើយ។ ទៅមើលអ្នកអាចទាញយកយើងហើយតែសូម។", + findingAddress: "រកអាសយដ្ឋានដោយប្រើប្រាស់ការបញ្ចូលទីតាំង GPS", + zonesFunctionality: "អនុគមន៍តំបន់សម្រាប់ភោជនីយដ្ឋាន និងអ្នកបើកបរ", + multipleRestaurants: "មុខងារបន្ថែមភោជនីយដ្ឋានច្រើន", + realTimeOrder: "ការធ្វើបច្ចុប្បន្នភាពការទទួលបានការអាប់ដេតនាពេលវេលាពេលព្រឹក", + differentSections: "មុខងារជំពាក់សំណួរសំខាន់សម្រាប់ការអាប់ដេតភោជនីយដ្ឋាន", + previousOrder: "ប្រវត្តិការបញ្ជាទិញចាស់ និងបន្ថែមភោជនីយដ្ឋានដែលចូលចិត្ត", + ourDelivery: + "ប្រព័ន្ធគ្រប់គ្រងការដឹកជញ្ជូនរបស់យើងត្រូវបានរចនាសម្រាប់អនាគតពីអសន្និរក", + builtOnCommunity: "បានស្នើរស្នេហ៍លើប្រភេទគោលបំណងដែលបានទាក់ទងដោយសហគម", + yourCart: "រទេះរបស់អ្នក", + startAdding: "ចាប់ផ្តើមបន្ថែមធាតុទៅក្នុងរទេះរបស់អ្នក", + goToCheckout: "ទៅកាន់ការបង់ប្រាក់", + activeOrders: "ប្រវត្តិការដែលកំពុងដំណើរការ", + pastOrders: "ប្រវត្តិការណែនាំចាស់", + deliveringTo: "កំពង់ទុកទៅ", + restaurantDeliver: + "យើងខុសស្នើសុំទៅកាន់ភោជនីយដ្ឋានដើម្បីស្វែងយល់ថាតើការដឹកជញ្ជូនអាហាររបស់អ្នកនឹងចំនួនប៉ុន្មាន។", + riderDeliver: + "យើងខុសស្នើសុំទៅកាន់អ្នកបើកបរដើម្បីស្វែងយល់ថាតើការដឹកជញ្ជូនអាហាររបស់អ្នកនឹងចំនួនប៉ុន្មាន។", + orderPending: "ការបញ្ជាទិញរបស់អ្នកនៅលើកំពុងរងចាំ។", + areYouSure: "តើ​អ្នក​ប្រាកដ​ឬទេ?", + clearCartText: + "ដោយ​ផ្លាស់​ប្តូរ​ភោជនីយដ្ឋាន​ភ្ជាប់, វានឹងត្រូវ​បានលុបចោល​ពីកន្លែងទំនិញដែលអ្នកបានបន្ថែម​ទៅក្នុង​រទេះ", + ok: "ព្រម", + cancel: "បោះបង់", + submit: "ដាក់ស្នើ", + titleFavourite: "ចូលចិត្ត", + titleEmptyFav: "មិនមានរក្សាទុកសំណព្វ", + emptyFavDesc: + "អ្នកនឹងឃើញចំណូលចិត្តទាំងអស់របស់អ្នកនៅទីនេះដើម្បីធ្វើឱ្យការបញ្ជាទិញកាន់តែលឿន។", + emptyFavBtn: "តោះស្វែងរកចំនូលចិត្តមួយចំនួន", + exactLocation: "តើនេះគឺជាទីតាំងរបស់អ្នកដែរទេ?", + yourArea: "បញ្ចូលតំបន់របស់អ្នក", + currentLocation: "ប្រើទីតាំងបច្ចុប្បន្ន", + deliveryDetails: "ព័ត៌មានលម្អិតចាំបាច់ -e. ជាន់ / អាគារ", + deliveryDetailError: "តម្រូវឲ្យមានព័ត៌មានការដឹកជូន", + currentPassword: "ពាក្យសម្ងាត់បច្ចុប្បន្ន", + newPassword: "ពាក្យសម្ងាត់ថ្មី", + deliver: "ដឹកជូន", + time: "ពេល", + pickup: "ជ្រើសរើសពេល", + selectTime: "ព្រឹក", + am: "ព្រឹក", + pm: "ល្ងាច", + set: "កំណត់", + apply: "អនុវត្ត", + applyAVoucher: "អនុវត្តប័ណ្ណ", + readAll: "អាន​ទាំងអស់", + readMore: "អាន​បន្ត", + demo: "បង្ហាញលក្ខណៈ", + getQuote: "ទទួល​សេចក្ដី​បញ្ជា", + restaurantCloseText: + "ភោជនីយដ្ឋាននេះបិទហើយ។ ពិភាក្សាផ្សារផ្សេងទៀតដែលត្រូវបានបើកឬទិញស្វែងរកមុខម្ហូបដូចជាមូលហេតុអាហាររបស់អ្នកបន្តឬសិស្សបន្តរបស់អ្នក។", + seeOtherRestaurants: "មើលភោជនីយដ្ឋានផ្សេងទៀត", + goToMenu: "ទៅកាន់ម៉ឺន", + deliveryHours: "ម៉ោងដឹកជូន", + about: "អំពី", + reviews: "ពិនិត្យឡើង", + closedAllDay: "បិទលក់រាល់ថ្ងៃ", + minute: "នាទី", + welcome: "សូមស្វាគមន៍!", + signUpOrLogin: "ចុះឈ្មោះ ឬ ចូលគណនីដើម្បីបន្ត", + signInWithGoogle: "បន្តជាមួយគម្រោង Google", + or: "ឬ", + continueWithEmail: "បន្តជាមួយអ៊ីម៉ែល", + terms: "លក្ខខណ្ឌ និង លក្ខណៈអនុញ្ញាត", + privacyPolicy: "គោលការណ៍ភាពឯកជន", + bySigningUp: "ដោយការចុះឈ្មោះអ្នកទទួលស្គាល់ថាអ្នកទទួលយកទិន្នន័យរបស់យើងយើង", + and: " និង ", + whatsYourEmail: "អ្នកមានអ៊ីមែលអ្វីខ្លះ?", + checkAccount: "យើងនឹងពិនិត្យមើលថាអ្នកមានគណនីឬឬទេ", + continue: "បន្ត", + invalidEmail: "អ៊ីម៉ែលមិនត្រឹមត្រូវ", + letsGetStarted: "តោះចាប់ផ្តើម!", + createAccount: "បង្កើតគណនីរបស់អ្នកនៅលើ Enatega", + firstnameErr1: "ទីតាំងគោលត្រាចាំបាច់!", + firstnameErr2: "ឈ្មោះជានិច្ចរាយ!", + lastnameErr1: "នាមត្រកូលត្រាចាំបាច់!", + lastnameErr2: "នាមជានិច្ចរាយ!", + mobileErr1: "លេខទូរស័ព្ទត្រូវបានចាំបាច់!", + mobileErr2: "លេខទូរស័ព្ទមិនត្រឹមត្រូវ!", + emailErr2: "អ៊ីម៉ែលមិនត្រឹមត្រូវ", + passwordErr1: + "លេខសំងាត់មិនត្រឹមត្រូវ។ លេខសំងាត់ត្រូវតែមានតួអក្សរធំ 1 តួអក្សរតូច 1 និងលេខ 1 យ៉ាងតិច។", + passwordErr2: "លេខសំងាត់មិនត្រឹមត្រូវ", + generalErr: "មាន​អ្វី​ខុស​ប្រូហ្វាល", + verifyEmail: "ធ្វើអោយអ៊ីម៉ែលរបស់អ្នកត្រូវបានផ្ទៀងផ្ទាត់", + enterOtp: "សូមបញ្ចូល OTP ដែលយើងបានផ្ញើទៅអ៊ីម៉ែលរបស់អ្នកដោយប្រើទម្រង់ថ្មី", + enterOtpPhone : "សូមបញ្ចូល OTP ដែលយើងបានផ្ញើទៅអ៊ីម៉ែលរបស់អ្នកដោយប្រើទម្រង់ថ្មី", + invalidCode: "កូដមិនត្រឹមត្រូវ។ សូមពិនិត្យមើលហើយបញ្ចូលម្ដងទៀត", + resendCode: "ផ្ញើម្ដងទៀតកូដ", + retryAfter: "ព្រមាន​ម្ដង​ទៀត បន្ទាប់ពី", + loginBtn: "ចូល", + addToCart: "បន្ថែមទៅកន្ត្រក", + customize: "កំណត់​ប្រៀបធៀប", + optional: "ជ្រើស​រើស​បាន", + required: "ត្រូវ​ការ", + specialInstructions: "ការ​ណែនាំ​ពិសេស", + anySpecific: + "មាន​ចង់​អនុញ្ញាត​អ្វី​មួយ​ទៀតដែរទេ? ឲ្យ​មើល​ពិសេស​ទៅ​បាន​គឺ​បាន។", + selectVariation: "ជ្រើស​រើស​ការ​ផ្លាស់​ប្ដូរ", + closed: "បិទ", + new: "ថ្មី", + orderCancelled: "ការបញ្ជាទិញរបស់អ្នកត្រូវបានលុបចោល", + orderCompleted: + "ការបញ្ជាទិញបានបញ្ចប់ដោយជោគជ័យ។ សូមអរគុណចំពោះការបញ្ជាទិញរបស់អ្នក", + reorder: "កម្មវិធីការបញ្ជាទិញឡើងវិញ", + review: "ពិនិត្យឡើងវិញ", + + subTitle: "ជ្រើសរើស ១", + placeholder: "ឧបករណ៍ មិនមាចវ៉ាអ៊ី", + phoneNumMissing: "លេខទូរស័ព្ទបានខុសបាត់", + updatePhone: "ធ្វើបច្ចុប្បន្នភាពទូរស័ព្ទរបស់អ្នក", + number: "លេខទំនេរ?", + secureAcc: "យើងត្រូវការវាយបញ្ចូលនេះដើម្បីបង្កើតគណនីរបស់អ្នក", + verifyPhone: "ផ្ទៀងផ្ទាត់ទូរស័ព្ទរបស់អ្នក", + skipNow: "រំលងឥឡូវនេះ", + favouriteListUpdated: "បានធ្វើឲ្យបានបន្ថែមចំនួនរបស់អ្នកបញ្ជាទិញបានទំនិញទើប", + pendingText: "កំពុងរង់ចាំការឆ្លើយពី", + acceptedText: "ពេលធ្វើរការពិសេស", + orderLateText: "សុំទោស! ការបញ្ជាទិញ​របស់​អ្នក​មាន​តម្រូវ​ជាមួយ​នៅ​រយះ​ពេល។", + riderPickText: + "អ្នក​ប៊ូរ​សំអាតហើយ​នឹង​យក​វា​ឡើង​សំរាប់​អ្នក​នៅ​ពេល​ដែល​វា​រួច​ហើយ។", + orderIs: "ការបញ្ជាទិញ​របស់​អ្នក​គឺ", + orderAssigned: "បាន​ផ្ដល់​ទៅ​មក​អ្នក​ប៊ូរ", + orderAssignedToRider: + "ការបញ្ជាទិញ​របស់​អ្នក​ត្រូវបាន​ផ្ដល់​ទៅលើ​បដិសណ្ឋាន​របស់យើង​ហើយ​នឹង​ត្រូវបាន​យក​ឡើង​សំរាប់​អ្នក​នៅ​ពេល​ដែល​វា​រួច​ហើយ។", + riderOnWay: "អ្នក​ប៊ូរ​របស់​អ្នក​គឺ​នៅ​លើ​ផ្លូវ។", + orderHasBeen: "ការបញ្ជាទិញ​របស់​អ្នក​ត្រូវ​បាន", + enjoyYourMeal: "សូមស្រស់ស្អាត!", + cancelled: "បោះបង់", + personalDetail: "ព័ត៌មានផ្ទាល់ខ្លួន", + voucherCode: "លេខ​កូដ​ប៉ាន់ស្សារ", + pickUp: "យកមកដល់", + warning: "ប្រុងប្រយ័ត្ន", + warningText: "មានមួយឬច្រើនធាតុមួយចំនួនមិនមានទេ", + }, +}; +export default km; diff --git a/enatega-multivendor-web/src/translations/zh.js b/enatega-multivendor-web/src/translations/zh.js new file mode 100644 index 0000000..5b4489a --- /dev/null +++ b/enatega-multivendor-web/src/translations/zh.js @@ -0,0 +1,204 @@ +const zh = { + translation: { + selectLanguage: "选择语言", + saveButton: "节省", + footerText: + "Enatega 是一个开源交付管理平台 未来。我们优先考虑创新、灵活性和可承受性,并提供可扩展、可定制的解决方案,简化您的 交付流程", + footerLinkHome: "主页", + footerLinkPP: "隐私政策", + footerLinkTC: "条款和条件", + footerEndText: "Enatega - © 2022 版权所有", + followUs: "关注我们", + poweredBy: "由...提供动力", + linksTitle: "链接", + subTotal: "小计", + deliveryFee: "快递费", + haveVoucher: "你有优惠券吗", + remove: "去掉", + change: "更改", + taxFee: "税费", + total: "总", + tip: "小费", + discount: "折扣", + name: "名称", + phone: "电话", + email: "电子邮件", + address: "地址", + changeAddress: "更改地址", + contactInfo: "联系信息", + paymentMethod: "付款方法", + orderBtn: "下订单", + deliveryTime: "送货时间", + delivery: "送货", + searchRestaurantPlaceholder: "搜索餐厅和菜系", + allRestaurant: "所有餐厅", + pending: "待定", + accepted: "已接受", + assigned: "已分配", + picked: "已接", + delivered: "已送达", + completed: "已完成", + titleOrders: "我的订单", + titleProfile: "轮廓", + titleHelp: "救命", + titleSettings: "设置", + titleChat: "聊", + titleLogout: "登出", + passwordInfo: "密码信息", + myAddresses: "我的地址", + edit: "编辑", + creditDebitCard: "信用卡 / 借记卡", + paypal: "贝宝", + cash: "现金", + deliverTo: "递送至", + ASSIGNED: "已分配", + PENDING: "待定", + PICKED: "已取货", + ACCEPTED: "已接受", + DELIVERED: "已交付", + COMPLETED: "已完成", + orderPlaced: "订单已下达", + "Order ID": "订单号", + "Order status: PENDING": "订单状态:待处理", + "Order status: ACCEPTED": "订单状态:已接受", + "Order status: ASSIGNED": "订单状态:已分配", + "Order status: PICKED": "订单状态:已挑选", + "Order status: DELIVERED": "订单状态:已交付", + "Order status: Order Placed": "订单状态:已下订单", + deliveryAddress: "邮寄地址", + orderDetail: "订单详情", + orderFrom: "您的订单来自", + orderNo: "您的订单号", + findRestaurants: "寻找餐厅", + putUsInYourPocket: "把我们装进你的口袋里", + containerText: + "一切尽在掌握之中 - 你喜爱的餐厅。找到适合你心情的美食,让第一口持续留香。来吧,下载我们", + findingAddress: "使用GPS集成找地址", + zonesFunctionality: "针对餐厅和骑手的区域功能", + multipleRestaurants: "多个餐厅添加功能", + realTimeOrder: " 实时订单接收更新", + differentSections: "为推广餐厅设置不同板块功能", + previousOrder: "查看以往订单历史和添加喜爱餐厅", + ourDelivery: "我们的送货管理系统是为未来设计的", + builtOnCommunity: "基于社区驱动的原则构建", + yourCart: "您的购物车", + startAdding: "开始将商品加入购物车", + goToCheckout: "去结账", + activeOrders: "活跃订单", + pastOrders: "历史订单", + deliveringTo: "送货至", + restaurantDeliver: "我们正在询问餐厅送餐需要多长时间", + riderDeliver: "我们正在询问骑手送餐需要多长时间", + orderPending: "您的订单仍在等待中", + areYouSure: "你确定吗?", + clearCartText: "更改餐厅将清除您添加到购物车的物品", + ok: "好的", + cancel: "取消", + submit: "提交", + titleFavourite: "喜爱", + titleEmptyFav: "没有收藏夹", + emptyFavDesc: "您会在这里看到所有收藏夹,以加快订购速度。", + emptyFavBtn: "让我们找到一些最爱", + exactLocation: "这是您的确切位置吗?", + yourArea: "输入您的地区", + currentLocation: "使用当前位置", + deliveryDetails: "必填详细信息-例如 楼层/建筑物", + deliveryDetailError: "需要送货详情", + currentPassword: "当前密码", + newPassword: "新密码", + deliver: "送货", + time: "时间", + pickup: "取货", + selectTime: "选择时间", + am: "上午", + pm: "下午", + set: "设置", + apply: "申请", + applyAVoucher: "使用优惠券", + readAll: "阅读全部", + readMore: "阅读更多", + demo: "演示", + getQuote: "获取报价", + restaurantCloseText: + "该餐厅目前已关闭。查看其他开放的餐厅或浏览菜单,计划下一餐。", + seeOtherRestaurants: "查看其他餐厅", + goToMenu: "进入菜单", + deliveryHours: "送货时间", + about: "关于", + reviews: "评价", + closedAllDay: "全天关闭", + minute: "分钟", + welcome: "欢迎!", + signUpOrLogin: "注册或登录以继续", + signInWithGoogle: "继续使用 Google", + or: "或者", + continueWithEmail: "继续使用电子邮件", + terms: "条款和条件", + privacyPolicy: "隐私政策", + bySigningUp: "通过注册,您同意我们的", + and: " 和 ", + whatsYourEmail: "你的电子邮件是什么?", + checkAccount: "我们会检查你是否有账户", + continue: "继续", + invalidEmail: "无效的电子邮件", + letsGetStarted: "让我们开始吧!", + createAccount: "创建您的 Enatega 账户", + firstnameErr1: "名字是必填项!", + firstnameErr2: "无效的名字!", + lastnameErr1: "姓氏是必填项!", + lastnameErr2: "无效的姓氏!", + mobileErr1: "电话号码是必填项!", + mobileErr2: "无效的电话号码!", + emailErr2: "无效的电子邮件", + passwordErr1: + "无效的密码。密码必须至少包含1个大写字母、1个小写字母和1个数字。", + passwordErr2: "无效的密码", + generalErr: "有东西缺失", + verifyEmail: "验证您的电子邮件", + enterOtp: "请输入我们发送到您更新的电子邮件的OTP", + enterOtpPhone : "请输入我们发送到您更新的电话号码的OTP", + invalidCode: "无效的代码,请检查并重新输入", + resendCode: "重新发送代码", + retryAfter: "稍后重试", + loginBtn: "登录", + addToCart: "添加到购物车", + customize: "自定义", + optional: "可选的", + required: "必需的", + specialInstructions: "特别说明", + anySpecific: "有什么特别的喜好吗?告诉餐厅。", + selectVariation: "选择变体", + closed: "关闭", + new: "新", + orderCancelled: "您的订单已取消", + orderCompleted: "订单已成功完成。感谢您的订购", + reorder: "重新订购", + review: "评论", + subTitle: "选择 1", + placeholder: "例如,不要蛋黄酱", + phoneNumMissing: "电话号码缺失", + updatePhone: "更新您的电话", + number: "号码?", + secureAcc: "我们需要这个来保护您的账户", + verifyPhone: "验证您的电话", + skipNow: "现在跳过", + favouriteListUpdated: "收藏列表已更新", + pendingText: "等待来自的回复", + acceptedText: "预计准备时间", + orderLateText: "抱歉!您的订单有点晚了。", + riderPickText: "您的骑手会在准备好后取货。", + orderIs: "您的订单是", + orderAssigned: "分配给骑手", + orderAssignedToRider: "您的订单已分配给我们的骑手,订单准备好后将被取货。", + riderOnWay: "您的骑手正在路上。", + orderHasBeen: "您的订单已", + enjoyYourMeal: "享用您的餐点!", + cancelled: "已取消", + personalDetail: "个人详情", + voucherCode: "优惠码", + pickUp: "取件", + warning: "警告", + warningText: "一个或多个项目不可用", + }, +}; +export default zh; diff --git a/enatega-multivendor-web/src/utils/analytics.js b/enatega-multivendor-web/src/utils/analytics.js new file mode 100644 index 0000000..257da3f --- /dev/null +++ b/enatega-multivendor-web/src/utils/analytics.js @@ -0,0 +1,70 @@ +/* eslint-disable import/no-anonymous-default-export */ +import amplitude from "amplitude-js"; +//import ConfigurableValues from "../config/constants"; +let isInitialized = false; +// const { AMPLITUDE_API_KEY } = ConfigurableValues(); +const { AMPLITUDE_API_KEY } = "2114f5db4c014dc7ad4ed2ad747341b5"; +const apiKey = AMPLITUDE_API_KEY; + +export const events = { + USER_LOGGED_IN: "USER_LOGGED_IN", + USER_CREATED_ACCOUNT: "USER_CREATED_ACCOUNT", + USER_LOGGED_OUT: "USER_LOGGED_OUT", + ADD_TO_CART: "ADD_TO_CART", + ORDER_PLACED: "ORDER_PLACED", + NAVIGATE_TO_HOME: "NAVIGATE_TO_HOME", + NAVIGATE_TO_FAVOURITES: "NAVIGATE_TO_FAVOURITES", + NAVIGATE_TO_FORGOT_PASSWORD: "NAVIGATE_TO_FORGOT_PASSWORD", + NAVIGATE_TO_RESTAURANTS: "NAVIGATE_TO_RESTAURANTS", + NAVIGATE_TO_RESTAURANTS_DETAIL: "NAVIGATE_TO_RESTAURANTS_DETAIL", + NAVIGATE_TO_ORDER: "NAVIGATE_TO_ORDER", + NAVIGATE_TO_ORDER_DETAIL: "NAVIGATE_TO_ORDER_DETAIL", + NAVIGATE_TO_TERMS: "NAVIGATE_TO_TERMS", + NAVIGATE_TO_PRIVACY_POLICY: "NAVIGATE_TO_PRIVACY_POLICY", + NAVIGATE_TO_PROFILE: "NAVIGATE_TO_PROFILE", + NAVIGATE_TO_STRIPE: "NAVIGATE_TO_STRIPE", + NAVIGATE_TO_PAYPAL: "NAVIGATE_TO_PAYPAL", +}; +export async function initialize() { + if (isInitialized || !apiKey) { + return; + } + + await amplitude.getInstance().init(apiKey); + isInitialized = true; +} + +export async function identify(options, userId) { + initialize(); + // eslint-disable-next-line no-undef + const properties = options; + + if (!apiKey) return; + if (userId) { + await amplitude.setUserId(userId); + } + if (properties) { + await amplitude.getInstance().setUserProperties(properties); + } else { + await amplitude.getInstance().clearUserProperties(); + } +} +export async function track(event, options) { + initialize(); + const properties = options; + + if (!apiKey) return; + + if (properties) { + await amplitude.getInstance().logEvent(event, properties); + } else { + await amplitude.getInstance().logEvent(event); + } +} + +export default { + events, + initialize, + identify, + track, +}; diff --git a/enatega-multivendor-web/src/utils/constantValues.js b/enatega-multivendor-web/src/utils/constantValues.js new file mode 100644 index 0000000..7c54167 --- /dev/null +++ b/enatega-multivendor-web/src/utils/constantValues.js @@ -0,0 +1,8 @@ + +const ACTIVE_STATUS = ["PENDING", "PICKED", "ACCEPTED", "ASSIGNED"]; +const INACTIVE_STATUS = ["DELIVERED", "COMPLETED", "CANCELLED"]; +const ORDER_STATUS = ["PENDING", "ACCEPTED"]; +const DAYS = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]; + + +export { ACTIVE_STATUS, INACTIVE_STATUS, ORDER_STATUS, DAYS }; diff --git a/enatega-multivendor-web/src/utils/currencies.js b/enatega-multivendor-web/src/utils/currencies.js new file mode 100644 index 0000000..8aaa748 --- /dev/null +++ b/enatega-multivendor-web/src/utils/currencies.js @@ -0,0 +1,166 @@ +export const stripeCurrencies = [ + { currency: 'USD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AED', currency_symbol: 'د.إ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AFN', currency_symbol: '؋', multiplier: 100, type: 'STRIPE' }, + { currency: 'ALL', currency_symbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'AMD', currency_symbol: '֏', multiplier: 100, type: 'STRIPE' }, + { currency: 'ANG', currency_symbol: 'ƒ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AOA', currency_symbol: 'Kz', multiplier: 100, type: 'STRIPE' }, + { currency: 'ARS', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AUD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'AWG', currency_symbol: 'ƒ', multiplier: 100, type: 'STRIPE' }, + { currency: 'AZN', currency_symbol: '₼', multiplier: 100, type: 'STRIPE' }, + { currency: 'BAM', currency_symbol: 'BAM', multiplier: 100, type: 'STRIPE' }, + { currency: 'BBD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BDT', currency_symbol: '৳', multiplier: 100, type: 'STRIPE' }, + { currency: 'BGN', currency_symbol: 'лв', multiplier: 100, type: 'STRIPE' }, + { currency: 'BIF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'BMD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BND', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BOB', currency_symbol: 'Bs.', multiplier: 100, type: 'STRIPE' }, + { currency: 'BRL', currency_symbol: 'R$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BSD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'BWP', currency_symbol: 'P', multiplier: 100, type: 'STRIPE' }, + { currency: 'BZD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CAD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CDF', currency_symbol: 'Fr', multiplier: 100, type: 'STRIPE' }, + { currency: 'CHF', currency_symbol: 'Fr', multiplier: 100, type: 'STRIPE' }, + { currency: 'CLP', currency_symbol: '$', multiplier: 1, type: 'STRIPE' }, + { currency: 'CNY', currency_symbol: '¥', multiplier: 100, type: 'STRIPE' }, + { currency: 'COP', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CRC', currency_symbol: '₡', multiplier: 100, type: 'STRIPE' }, + { currency: 'CVE', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'CZK', currency_symbol: 'Kč', multiplier: 100, type: 'STRIPE' }, + { currency: 'DJF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'DKK', currency_symbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'DOP', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'DZD', currency_symbol: 'د.ج', multiplier: 100, type: 'STRIPE' }, + { currency: 'EGP', currency_symbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'ETB', currency_symbol: 'Br', multiplier: 100, type: 'STRIPE' }, + { currency: 'EUR', currency_symbol: '€', multiplier: 100, type: 'STRIPE' }, + { currency: 'FJD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'FKP', currency_symbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GBP', currency_symbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GEL', currency_symbol: '₾', multiplier: 100, type: 'STRIPE' }, + { currency: 'GIP', currency_symbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'GMD', currency_symbol: 'D', multiplier: 100, type: 'STRIPE' }, + { currency: 'GNF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'GTQ', currency_symbol: 'Q', multiplier: 100, type: 'STRIPE' }, + { currency: 'GYD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'HKD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'HNL', currency_symbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'HRK', currency_symbol: 'kn', multiplier: 100, type: 'STRIPE' }, + { currency: 'HTG', currency_symbol: 'G', multiplier: 100, type: 'STRIPE' }, + { currency: 'HUF', currency_symbol: 'Ft', multiplier: 100, type: 'STRIPE' }, + { currency: 'IDR', currency_symbol: 'Rp', multiplier: 100, type: 'STRIPE' }, + { currency: 'ILS', currency_symbol: 'ع.د', multiplier: 100, type: 'STRIPE' }, + { currency: 'INR', currency_symbol: '₹', multiplier: 100, type: 'STRIPE' }, + { currency: 'ISK', currency_symbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'JMD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'JPY', currency_symbol: '¥', multiplier: 1, type: 'STRIPE' }, + { currency: 'KES', currency_symbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'KGS', currency_symbol: 'с', multiplier: 100, type: 'STRIPE' }, + { currency: 'KHR', currency_symbol: '៛', multiplier: 100, type: 'STRIPE' }, + { currency: 'KMF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'KRW', currency_symbol: '₩', multiplier: 1, type: 'STRIPE' }, + { currency: 'KYD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'KZT', currency_symbol: '₸', multiplier: 100, type: 'STRIPE' }, + { currency: 'LAK', currency_symbol: '₭', multiplier: 100, type: 'STRIPE' }, + { currency: 'LBP', currency_symbol: 'ل.ل', multiplier: 100, type: 'STRIPE' }, + { currency: 'LKR', currency_symbol: 'Rs', multiplier: 100, type: 'STRIPE' }, + { currency: 'LRD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'LSL', currency_symbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'MAD', currency_symbol: 'د.م.', multiplier: 100, type: 'STRIPE' }, + { currency: 'MDL', currency_symbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'MGA', currency_symbol: 'Ar', multiplier: 1, type: 'STRIPE' }, + { currency: 'MKD', currency_symbol: 'ден', multiplier: 100, type: 'STRIPE' }, + { currency: 'MMK', currency_symbol: 'Ks', multiplier: 100, type: 'STRIPE' }, + { currency: 'MNT', currency_symbol: '₮', multiplier: 100, type: 'STRIPE' }, + { currency: 'MOP', currency_symbol: 'P', multiplier: 100, type: 'STRIPE' }, + { currency: 'MRO', currency_symbol: 'UM', multiplier: 100, type: 'STRIPE' }, + { currency: 'MUR', currency_symbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'MVR', currency_symbol: '.ރ', multiplier: 100, type: 'STRIPE' }, + { currency: 'MWK', currency_symbol: 'MK', multiplier: 100, type: 'STRIPE' }, + { currency: 'MXN', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'MYR', currency_symbol: 'RM', multiplier: 100, type: 'STRIPE' }, + { currency: 'MZN', currency_symbol: 'MT', multiplier: 100, type: 'STRIPE' }, + { currency: 'NAD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'NGN', currency_symbol: '₦', multiplier: 100, type: 'STRIPE' }, + { currency: 'NIO', currency_symbol: 'C$', multiplier: 100, type: 'STRIPE' }, + { currency: 'NOK', currency_symbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'NPR', currency_symbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'NZD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'PAB', currency_symbol: 'B/.', multiplier: 100, type: 'STRIPE' }, + { currency: 'PEN', currency_symbol: 'S/.', multiplier: 100, type: 'STRIPE' }, + { currency: 'PGK', currency_symbol: 'K', multiplier: 100, type: 'STRIPE' }, + { currency: 'PHP', currency_symbol: '₱', multiplier: 100, type: 'STRIPE' }, + { currency: 'PKR', currency_symbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'PLN', currency_symbol: 'zł', multiplier: 100, type: 'STRIPE' }, + { currency: 'PYG', currency_symbol: '₲', multiplier: 1, type: 'STRIPE' }, + { currency: 'QAR', currency_symbol: 'ر.ق', multiplier: 100, type: 'STRIPE' }, + { currency: 'RON', currency_symbol: 'lei', multiplier: 100, type: 'STRIPE' }, + { currency: 'RSD', currency_symbol: 'дин', multiplier: 100, type: 'STRIPE' }, + { currency: 'RUB', currency_symbol: '₽', multiplier: 100, type: 'STRIPE' }, + { currency: 'RWF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'SAR', currency_symbol: 'ر.س', multiplier: 100, type: 'STRIPE' }, + { currency: 'SBD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'SCR', currency_symbol: '₨', multiplier: 100, type: 'STRIPE' }, + { currency: 'SEK', currency_symbol: 'kr', multiplier: 100, type: 'STRIPE' }, + { currency: 'SGD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'SHP', currency_symbol: '£', multiplier: 100, type: 'STRIPE' }, + { currency: 'SLL', currency_symbol: 'Le', multiplier: 100, type: 'STRIPE' }, + { currency: 'SOS', currency_symbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'SRD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'STD', currency_symbol: 'Db', multiplier: 100, type: 'STRIPE' }, + { currency: 'SZL', currency_symbol: 'L', multiplier: 100, type: 'STRIPE' }, + { currency: 'THB', currency_symbol: '฿', multiplier: 100, type: 'STRIPE' }, + { currency: 'TJS', currency_symbol: 'ЅМ', multiplier: 100, type: 'STRIPE' }, + { currency: 'TOP', currency_symbol: 'T$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TRY', currency_symbol: '₺', multiplier: 100, type: 'STRIPE' }, + { currency: 'TTD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TWD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'TZS', currency_symbol: 'Sh', multiplier: 100, type: 'STRIPE' }, + { currency: 'UAH', currency_symbol: '₴', multiplier: 100, type: 'STRIPE' }, + { currency: 'UGX', currency_symbol: 'Sh', multiplier: 1, type: 'STRIPE' }, + { currency: 'UYU', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'UZS', currency_symbol: 'сўм', multiplier: 100, type: 'STRIPE' }, + { currency: 'VND', currency_symbol: '₫', multiplier: 1, type: 'STRIPE' }, + { currency: 'VUV', currency_symbol: 'Vt', multiplier: 1, type: 'STRIPE' }, + { currency: 'WST', currency_symbol: 'T', multiplier: 100, type: 'STRIPE' }, + { currency: 'XAF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'XCD', currency_symbol: '$', multiplier: 100, type: 'STRIPE' }, + { currency: 'XOF', currency_symbol: 'Fr', multiplier: 1, type: 'STRIPE' }, + { currency: 'XPF', currency_symbol: '₣', multiplier: 1, type: 'STRIPE' }, + { currency: 'YER', currency_symbol: '﷼', multiplier: 100, type: 'STRIPE' }, + { currency: 'ZAR', currency_symbol: 'Rs', multiplier: 100, type: 'STRIPE' }, + { currency: 'ZMW', currency_symbol: 'ZK', multiplier: 100, type: 'STRIPE' } + ] + + export const paypalCurrencies = [ + { currency: 'AUD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'BRL', currency_symbol: 'R$', type: 'PAYPAL' }, + { currency: 'CAD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'CZK', currency_symbol: 'Kč', type: 'PAYPAL' }, + { currency: 'DKK', currency_symbol: 'kr', type: 'PAYPAL' }, + { currency: 'EUR', currency_symbol: '€', type: 'PAYPAL' }, + { currency: 'HKD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'HUF', currency_symbol: 'Ft', type: 'PAYPAL' }, + { currency: 'INR', currency_symbol: '₹', type: 'PAYPAL' }, + { currency: 'ILS', currency_symbol: 'ع.د', type: 'PAYPAL' }, + { currency: 'JPY', currency_symbol: '¥', type: 'PAYPAL' }, + { currency: 'MYR', currency_symbol: 'RM', type: 'PAYPAL' }, + { currency: 'MXN', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'TWD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'NZD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'NOK', currency_symbol: 'kr', type: 'PAYPAL' }, + { currency: 'PHP', currency_symbol: '₱', type: 'PAYPAL' }, + { currency: 'PLN', currency_symbol: 'zł', type: 'PAYPAL' }, + { currency: 'GBP', currency_symbol: '£', type: 'PAYPAL' }, + { currency: 'RUB', currency_symbol: '₽', type: 'PAYPAL' }, + { currency: 'SGD', currency_symbol: '$', type: 'PAYPAL' }, + { currency: 'SEK', currency_symbol: 'kr', type: 'PAYPAL' }, + { currency: 'CHF', currency_symbol: 'Fr', type: 'PAYPAL' }, + { currency: 'THB', currency_symbol: '฿', type: 'PAYPAL' }, + { currency: 'USD', currency_symbol: '$', type: 'PAYPAL' } + ] + \ No newline at end of file diff --git a/enatega-multivendor-web/src/utils/customFunction.js b/enatega-multivendor-web/src/utils/customFunction.js new file mode 100644 index 0000000..e1020f4 --- /dev/null +++ b/enatega-multivendor-web/src/utils/customFunction.js @@ -0,0 +1,42 @@ +function isValidEmailAddress(address) { + return !!address.match(/.+@.+/); +} + +const cartItemQuantity = (items) => { + return items.map((item) => `${item.quantity}x ${item.title}${ + item.variation.title ? `(${item.variation.title})` : "" + }`).join("\n"); +}; + +function calculatePrice(food) { + var foodPrice = food.variation.price; + food.addons.forEach((addons) => { + addons.options.forEach((addon) => { + foodPrice += addon.price; + }); + }); + return foodPrice; +} + +function calculateDistance(latS, lonS, latD, lonD) +{ + var R = 6371; // km + var dLat = toRad(latD-latS); + var dLon = toRad(lonD-lonS); + var lat1 = toRad(latS); + var lat2 = toRad(latD); + + var a = Math.sin(dLat/2) * Math.sin(dLat/2) + + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); + var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + var d = R * c; + return d; +} + +// Converts numeric degrees to radians +function toRad(Value) +{ + return Value * Math.PI / 180; +} + +export { isValidEmailAddress, cartItemQuantity, calculatePrice, calculateDistance }; diff --git a/enatega-multivendor-web/src/utils/theme.js b/enatega-multivendor-web/src/utils/theme.js new file mode 100644 index 0000000..2be7805 --- /dev/null +++ b/enatega-multivendor-web/src/utils/theme.js @@ -0,0 +1,269 @@ +import { blue } from "@mui/material/colors"; +import { createTheme } from "@mui/material/styles"; + +const theme = createTheme({ + breakpoints: { + keys: ["xs", "sm", "md", "lg", "xl"], + values: { xs: 0, sm: 600, md: 900, lg: 1200, xl: 1400 }, + }, + overrides: { + MuiPickersToolbar: { + toolbar: { + backgroundColor: blue.A200, + }, + }, + MuiPickersCalendarHeader: { + switchHeader: { + // backgroundColor: blue.A200, + // color: "white", + }, + }, + MuiPickersDay: { + day: { + color: blue.A700, + }, + daySelected: { + backgroundColor: blue["400"], + }, + dayDisabled: { + color: blue["100"], + }, + current: { + color: blue["900"], + }, + }, + MuiPickersModal: { + dialogAction: { + color: blue["400"], + }, + }, + }, + typography: { + fontFamily: ["Poppins", "Open Sans", "sans-serif"].join(), + htmlFontSize: 16, + fontSize: 14, + fontWeightLight: 300, + fontWeightRegular: 400, + fontWeightMedium: 500, + fontWeightBold: 700, + fontWeightBolder: 800, + h1: { + fontWeight: 300, + fontSize: "6rem", + lineHeight: 1.167, + letterSpacing: "-0.01562em", + }, + h2: { + fontWeight: 300, + fontSize: "3.75rem", + lineHeight: 1.2, + letterSpacing: "-0.00833em", + }, + h3: { + fontWeight: 400, + fontSize: "3rem", + lineHeight: 1.167, + letterSpacing: "0em", + }, + h4: { + fontWeight: 400, + fontSize: "2.125rem", + lineHeight: 1.235, + letterSpacing: "0.00735em", + }, + h5: { + fontWeight: 400, + fontSize: "1.5rem", + lineHeight: 1.334, + letterSpacing: "0em", + }, + h6: { + fontWeight: 500, + fontSize: "1.25rem", + lineHeight: 1.6, + letterSpacing: "0.0075em", + }, + subtitle1: { + fontWeight: 400, + fontSize: "1rem", + lineHeight: 1.75, + letterSpacing: "0.00938em", + }, + subtitle2: { + fontWeight: 500, + fontSize: "0.875rem", + lineHeight: 1.57, + letterSpacing: "0.00714em", + }, + body1: { + fontWeight: 400, + fontSize: "1rem", + lineHeight: 1.5, + letterSpacing: "0.00938em", + }, + body2: { + fontWeight: 400, + fontSize: "1rem", + lineHeight: 1.5, + letterSpacing: "0.00938em", + }, + button: { + fontWeight: 500, + fontSize: "0.875rem", + lineHeight: 1.75, + letterSpacing: "0.02857em", + textTransform: "uppercase", + }, + caption: { + fontWeight: 400, + fontSize: "0.75rem", + lineHeight: 1.66, + letterSpacing: "0.03333em", + }, + overline: { + fontWeight: 400, + fontSize: "0.75rem", + lineHeight: 2.66, + letterSpacing: "0.08333em", + textTransform: "uppercase", + }, + shape: { + borderRadius: 4, + }, + zIndex: { + mobileStepper: 1000, + speedDial: 1050, + appBar: 1100, + drawer: 1200, + modal: 1300, + snackbar: 1400, + tooltip: 1500, + }, + }, + palette: { + mode: "light", + common: { + black: "#000", + blackShade: "#0000008c", + lightBlack: "#00000040", + darkBlack: "#0000005e", + white: "#fff", + whiteShade: "#E5EDEF", + }, + primary: { + main: "#90EA93", + light: "#fff", + lightest: "#cfcfcf", + dark: "#F4F4F4", + darkest: "#C4C4C4", + contrastText: "#fff", + }, + secondary: { + main: "#FAFAFA", + light: "#333333", + lightest: "#2d6734", + dark: "#949393", + darkest: "#959191", + contrastText: "#fff", + }, + success: { + main: "#1DB20D", + light: "#6FCF97", + lightest: "#f1f1f1", + dark: "#F0F0F0", + darkest: "#E6EBEE", + contrastText: "#fff", + }, + info: { + main: "rgba(39,111,191,0.8)", + light: "#E1E5E8", + lightest: "#CED8DA", + dark: "#CDD7D8", + darkest: " #FCFCFD", + contrastText: "#fff", + }, + error: { + main: "#fe0000", + light: "#F1F3F3", + lightest: "#EBEBEB", + dark: "#131313", + darkest: "#C2C2C2", + contrastText: "#fff", + }, + warning: { + main: "#FA7751", + light: "#FCC54C", + lightest: "#F7F7F7", + dark: "#DCDCDC", + darkest: "#888", + contrastText: "#fff", + }, + button: { + main: "#3C8F7C", + light: "#0070ba", + lightest: "#8EE590", + dark: "#EFF4F7", + darkest: "#FBE7EF", + contrastText: "#fff", + }, + shades: { + main: "#EDF1F2", + light: "#f0f0fd", + lightest: "#DFEAF6", + dark: "#BED3EB", + darkest: "#93B7DF", + contrastText: "#5D93CF", + }, + shadows: { + main: "#FDE5EF", + light: "#1D3655", + lightest: "#1E3656", + dark: "#9D9D9D", + darkest: "#276FBF", + contrastText: "#178", + }, + borders: { + main: "#FF5F00", + light: "#F79E1B", + lightest: "#222D65", + dark: "#EB001B", + darkest: "#253B80", + contrastText: "#179BD7", + }, + grey: { + 50: "#fafafa", + 100: "#f5f5f5", + 200: "#eeeeee", + 300: "#e0e0e0", + 400: "#bdbdbd", + 500: "#9e9e9e", + 600: "#757575", + 700: "#616161", + 800: "#424242", + 900: "#212121", + A100: "#d5d5d5", + A200: "#aaaaaa", + A400: "#303030", + A700: "#616161", + }, + contrastThreshold: 3, + tonalOffset: 0.2, + text: { + primary: "#fff", + secondary: "#212121", + success: "#D5146D", + disabled: "#5A5858", + hint: "#FFF", + }, + divider: "rgba(0, 0, 0, 0.12)", + background: { + primary: "#153759", + secondary: "#5C92CE", + success: "#90B4DC", + paper: "#FAFAFA", + default: "#fff", + }, + }, +}); + +export default theme;